我有一个Linux守护进程,它会fork出几个子进程并监视它们是否崩溃(必要时重新启动)。 如果父进程能够监视子进程的内存使用情况 - 检测内存泄漏并在超过一定大小时重新启动子进程,那就太好了。 我该如何实现这个功能呢?
我有一个Linux守护进程,它会fork出几个子进程并监视它们是否崩溃(必要时重新启动)。 如果父进程能够监视子进程的内存使用情况 - 检测内存泄漏并在超过一定大小时重新启动子进程,那就太好了。 我该如何实现这个功能呢?
您应该能够从/ 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...(请参阅man页面了解详细信息,但作为起点,请尝试使用vsz、pcpu、user、pid、args)来查找最大的进程。
我建议将此监视器作为单独的进程运行,并在它变得太大时杀死流氓进程。你可以使用一组受监视的进程来限制它。
-u user-name
将参数传递给ps。
这都是一种hack(英国意义上的),但正确的解决方案是修复泄漏,假设您有代码。