【问题标题】:Monitor memory usage of child process监控子进程的内存使用情况
【发布时间】:2010-05-02 17:12:54
【问题描述】:

我有一个 Linux 守护进程,它派生出几个子进程并监视它们是否崩溃(根据需要重新启动)。 如果父进程可以监视子进程的内存使用情况,那就太好了——检测内存泄漏并在超出一定大小时重新启动子进程。 我该怎么做?

【问题讨论】:

    标签: c linux memory fork health-monitoring


    【解决方案1】:

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

    【讨论】:

    • 没有系统调用可以做到这一点?解析文件似乎是获取信息的一种非常肮脏的方式。
    【解决方案2】:

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

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

    来限制监控的进程集
    -u user-name
    

    参数到ps。

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

    【讨论】:

    • 我更喜欢不依赖外部程序/脚本的集成解决方案。当然修复内存泄漏是正确的做法,但在现实世界中你有时不得不暂时妥协。另外,我可以设想当您运行不受您控制的外部代码时的情况(想想运行 php 脚本的 apache)。
    • 单一集成解决方案的问题在于它变得越来越复杂。使用单独的程序来执行单独的功能的优点是每个程序都相对简单且易于调试和部署。一个集成的解决方案起初看起来不错(通信没有问题,你知道它正在运行,因为主程序正在运行等),但随着你的系统变得越来越大,简单性问题将变得越来越重要
    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多