いくつかの子をフォークし、クラッシュを監視する Linux デーモンがあります (必要に応じて再起動します)。親が子プロセスのメモリ使用量を監視できれば、メモリ リークを検出し、子プロセスが特定のサイズを超えたときに子プロセスを再起動できると便利です。これどうやってするの?
2 に答える
/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 コピーを取得するため、このスクリプトを複数回実行する場合、これはお勧めできません)。次に、この監視スクリプトは、空きメモリに加えてバッファとキャッシュのサイズを取得して、OS で使用可能なメモリの量を取得し、それを追跡できます。次に、それがしきい値を下回った場合は、 ps -e -o... を呼び出して最大のプロセスを確認できます (詳細については man ページを参照してください。ただし、開始点として vsz,pcpu,user,pid,args を試してください)。
このモニターを別のプロセスとして実行し、大きくなりすぎたときに不正なプロセスを強制終了することをお勧めします。を使用して、監視対象のプロセスのセットを制限できます。
-u user-name
パラメータを ps に設定します。
ただし、これはすべてハック (英国の意味) ですが、正しい解決策は、コードがあると仮定して、リークを修正することです。