最近、サーバーの負荷が高すぎるという問題が発生しました。 top
を30分ほど見て、短期間のプロセスをたくさんフォークしたのはNagiosであることがわかりました。 Nagiosをバウンスした後、すべてが正常に戻りました。
ここで私の質問は、このように分岐するルートプロセスをより迅速に見つける方法ですか?
ありがとう。
dtrace
をサポートするOSを実行している場合、このスクリプトは、どのプロセスが短期間のプロセスを起動しているかを特定するのに役立ちます。
#!/usr/sbin/dtrace -qs
proc:::exec
{
self->parent=stringof((unsigned char*)curpsinfo->pr_psargs);
}
proc:::exec-success
/self->parent != NULL/
{
printf("%s -> %s\n",self->parent,curpsinfo->pr_psargs);
self->parent=NULL;
}
dtrace
をサポートしていないOSを使用している場合は、代替手段を確認してください。 systemtap
または sysdig
Linuxの場合、 ProbeView
AIXの場合。
次のsysdig
スクリプトは、すべてのコマンドの起動時間と終了時間をpid
およびppid
とともに表示します。
sysdig -p"*%evt.time %proc.pid %proc.ppid %evt.dir %proc.exeline" \
"( evt.dir=< and evt.type=execve ) or evt.type=procexit"
もう1つの方法は、OS(使用可能な場合は通常Linuxではacct
パッケージ)でプロセスアカウンティングを有効にし、生成されたログを確認することです。プロセスアカウンティングを活用するtop
のようなプログラムもあります: atop 。
top -Sd1
をお試しください。これは、それ自体のプロセスではなく、各プロセスの累積時間を示します。ここでの累積は、プロセスが消費した時間と、存在しない子が消費された時間を表します。
通常、より速く上昇するプロセス(そしておそらくすでに十分に高いプロセス)があなたが探しているものです。その後、プロセスを追跡して疑惑を確認できます。
_ps ej |cut -d" " -f1 |sort |uniq -c
_
実際、_ps ej
_はプロセスの親Pidを表示するため、プロセスが大量にフォークした場合、すべての子が同じPpidを持ちます。
_cut -d" " -f1
_は、ps出力の最初のフィールドのみを保持するためにあり、次にsort
the data、そして最後に_uniq -c
_は、各uniq pidの発生数を表示します。
配列を使用して発生をカウントするawkのみのバージョンを使用することもできます:ps ejx |awk -n '{count[$1]++}END{for(j in count) print "process:" j, "("count[j]")"}'