C 监视子进程的内存使用情况

C 监视子进程的内存使用情况,c,linux,memory,fork,health-monitoring,C,Linux,Memory,Fork,Health Monitoring,我有一个Linux守护进程,它分叉几个孩子并监视他们是否崩溃(根据需要重新启动)。 如果父进程可以监视子进程的内存使用情况,以检测内存泄漏,并在子进程超出一定大小时重新启动子进程,这将是非常好的。 如何执行此操作?您应该能够从/proc/{PID}/status中获取详细的内存信息: Name: bash State: S (sleeping) Tgid: 6053 Pid: 6053 PPid: 6050 TracerPid: 0 Uid: 1007 1007

我有一个Linux守护进程,它分叉几个孩子并监视他们是否崩溃(根据需要重新启动)。 如果父进程可以监视子进程的内存使用情况,以检测内存泄漏,并在子进程超出一定大小时重新启动子进程,这将是非常好的。
如何执行此操作?

您应该能够从/proc/{PID}/status中获取详细的内存信息:

Name:   bash
State:  S (sleeping)
Tgid:   6053
Pid:    6053
PPid:   6050
TracerPid:  0
Uid:    1007    1007    1007    1007
Gid:    1007    1007    1007    1007
FDSize: 256
Groups: 1007 
VmPeak:    48076 kB
VmSize:    48044 kB
VmLck:         0 kB
VmHWM:      4932 kB
VmRSS:      2812 kB
VmData:     2232 kB
VmStk:        84 kB
VmExe:       832 kB
VmLib:      6468 kB
VmPTE:       108 kB
Threads:    1
SigQ:   0/8190
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001010
SigCgt: 0000000188020001
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
Cpus_allowed:   0f
Mems_allowed:   00000000,00000001
voluntary_ctxt_switches:    69227121
nonvoluntary_ctxt_switches: 19071
然而,除非内存泄漏非常严重,否则很难从进程统计数据中检测到它们,因为malloc和free通常是从它们对应的系统调用(brk/sbrk)中抽象出来的


您还可以签入/proc/${PID}/statm。

您可以尝试让一个监视器脚本与您的进程并行运行vmstat(注意,如果您多次运行此脚本,这不是一个好主意,因为您将获得多个vmstat副本)。然后,这个监控脚本可以获取可用内存加上缓冲区和缓存大小,以获得操作系统可用的内存量,您可以跟踪它。然后,如果低于某个阈值,您可以通过调用ps-e-o来检查最大的进程。。。(有关详细信息,请参阅手册页,但可以尝试使用vsz、pcpu、用户、pid和args作为起点)

我建议将这个监视器作为一个单独的进程运行,当它变得太大时,让它杀死这个流氓进程。您可以使用

-u user-name
参数设置为ps


不过,这完全是一种黑客行为(英国的意思),正确的解决方案是修复漏洞,前提是你有代码。

没有系统调用可以做到这一点吗?解析文件似乎是获取信息的一种非常肮脏的方式。我更喜欢不依赖外部程序/脚本的集成解决方案。当然,修复内存泄漏是正确的做法,但在现实世界中,有时你不得不暂时妥协。此外,我还可以设想当您运行不受您控制的外部代码时的情况(比如apache运行php脚本)。使用单独的程序执行单独的功能的优点是,每个程序都相对简单,易于调试和部署。一个集成的解决方案一开始看起来不错(通信没有问题,你知道它正在运行,因为主程序正在运行等等),但是随着你的系统越来越大,简单性问题将变得越来越重要