vmstat -f
を実行すると、非常に多くのフォークが表示される本番サーバーがあります。フォークの起源が何であるかを見つけるのを助けるために使用できるステップに関する提案はありますか?
vmstat -f 1
6650796 forks
編集:
[~]$ ./forks.sh
Forks in last 2 seconds: 20
Forks in last 2 seconds: 40
Forks in last 2 seconds: 58
Forks in last 2 seconds: 9
Forks in last 2 seconds: 6
Forks in last 2 seconds: 28
Forks in last 2 seconds: 8
Forks in last 2 seconds: 10
Forks in last 2 seconds: 15
Forks in last 2 seconds: 9
Manページによると、fork、vfork、またはcloneへのすべての呼び出しが含まれています。これら3つのうち最後の1つ(クローン)は、スレッドを実装するためにJavaによって使用されます
したがって、Javaサーバーが新しいスレッドを作成するたびに、その値は増加します。
それがばかげて行かないのであれば、それは問題ないはずです。あなたは平均して毎秒何人を見ますか?
それ自体が終了せずに別のプロセスを生成するプロセスはすべてフォークです。たとえば、シェルで実行されるすべてのコマンドはフォークとしてカウントされます。システムが起動したため、非常に多くのフォーク呼び出しが発生しました。
最初に注意することは、2つのtime引数なしでvmstatを実行すると、最後の再起動以降の累積値が表示されることです。 「フォーク/秒」の数値を取得して、それが本当に大きな数値であるかどうかを確認するには、複数回実行する必要があります。このようなもの(明らかに、はるかに使いやすいスクリプトにすることができます):
g3 0 /home/jj33 ># while true
> do
> vmstat -f
> sleep 15
> done
278039 forks
278044 forks
278047 forks
278051 forks
したがって、そのシステムは3 15秒間隔で5、3、および4つのフォークを実行しました。これは、* nixボックスでのすべてのプロセス呼び出しにフォークが含まれることを考えると、大きな数のようには見えません。
フォーク数が多いことは実際には問題ではありません。Gentooベースのルーターを数か月間実行していて、フォーク数は2倍を超えていますが、マシン自体は堅実です。
dijkstra ~ # vmstat -f 1
14623947 forks
dijkstra ~ # uptime
15:29:26 up 291 days, 14:02, 1 user, load average: 0.02, 0.04, 0.07
特定のプロセス(JVMなど)がフォーク数が多い理由(2/sは高くなく、問題ではない)であると思われる場合は、strace/ltraceを使用してその処理を確認できます。
具体的には、acctonコマンドを使用して、プロセスアカウンティング(影響が大きい)でもフォークを表示する必要があります。しかし、スレッドを開始するためのclone()をカバーしているとは思いません。
100クローン/秒の範囲に入る場合は、実際にアプリケーションを確認する必要があります。
ところで:上記のコメントに関して(まだコメントはできません):Tomcatはフォークせず、スレッドを開始するだけで、リクエストごとにではなく、プールを使用します。