监控子进程的内存使用情况

5

我有一个Linux守护进程,它会fork出几个子进程并监视它们是否崩溃(必要时重新启动)。 如果父进程能够监视子进程的内存使用情况 - 检测内存泄漏并在超过一定大小时重新启动子进程,那就太好了。 我该如何实现这个功能呢?

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。


有没有相关的系统调用?解析文件似乎是获取信息的一种相当糟糕的方法。 - Omry Yadan

1

你可以尝试在你的进程中运行一个监视器脚本,与之并行运行vmstat(如果你多次运行此脚本,则不建议这样做,因为你会得到多个vmstat副本)。然后,这个监视器脚本可以获取可用内存加上缓存和缓冲区大小,以获取操作系统可用的内存量,并进行跟踪。然后,如果它低于某个阈值,你可以通过调用ps -e -o...(请参阅man页面了解详细信息,但作为起点,请尝试使用vsz、pcpu、user、pid、args)来查找最大的进程。

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

-u user-name

将参数传递给ps。

这都是一种hack(英国意义上的),但正确的解决方案是修复泄漏,假设您有代码。


我更喜欢一个集成的解决方案,不依赖于外部程序/脚本。 当然,修复内存泄漏是正确的做法,但在现实世界中,有时你必须暂时妥协。此外,我可以想象出一些情况,当你运行不受你控制的外部代码时(比如Apache运行PHP脚本)。 - Omry Yadan
单一的、集成的解决方案的问题在于它变得越来越复杂。拥有独立程序执行不同功能的优点在于每个程序都相对简单且易于调试和部署。集成解决方案起初似乎很好(没有通信问题,因为主程序正在运行等),但随着系统规模的增大,简单性问题将变得越来越重要。 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接