5

我有一个 Linux 守护程序,它分叉了几个孩子并监视他们的崩溃(根据需要重新启动)。如果父进程可以监控子进程的内存使用情况,那就太好了——检测内存泄漏并在超过一定大小时重新启动子进程。我怎样才能做到这一点?

4

2 回答 2

4

您应该能够从 /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。

于 2010-05-02T17:23:14.407 回答
1

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

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

-u user-name

ps的参数。

不过,这完全是一种 hack(英国的意思)——但正确的解决方案是修复泄漏,假设你有代码。

于 2010-05-02T19:01:04.587 回答