web-dev-qa-db-ja.com

多くをフォークするプロセスを見つける方法は?

最近、サーバーの負荷が高すぎるという問題が発生しました。 topを30分ほど見て、短期間のプロセスをたくさんフォークしたのはNagiosであることがわかりました。 Nagiosをバウンスした後、すべてが正常に戻りました。

ここで私の質問は、このように分岐するルートプロセスをより迅速に見つける方法ですか?

ありがとう。

5
Magicloud

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

4
jlliagre

top -Sd1をお試しください。これは、それ自体のプロセスではなく、各プロセスの累積時間を示します。ここでの累積は、プロセスが消費した時間と、存在しない子が消費された時間を表します。

通常、より速く上昇するプロセス(そしておそらくすでに十分に高いプロセス)があなたが探しているものです。その後、プロセスを追跡して疑惑を確認できます。

2
V13

_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]")"}'

0
netmonk