监视subprocess的内存使用情况

我有一个Linux守护进程,分支几个孩子,并监视他们的崩溃(根据需要重新启动)。 如果父进程可以监视subprocess的内存使用情况 – 检测内存泄漏并在超出特定大小时重新启动subprocess将会很好。 我怎样才能做到这一点?

    您应该能够从/ 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,user,pid,args作为起点)。

    我建议把这个监视器作为一个单独的进程来运行,并在恶意进程变得太大的时候杀死它。 您可以限制使用该进程监视的进程集

     -u user-name 

    参数到ps。

    这是一个黑客(英国的意思)虽然 – 正确的解决办法,虽然是修复泄漏,假设你有代码。