4

私は観察を行い、それを完全に理解したいと思います。

まず、定期的にスレッド ダンプを取得し、スレッドの状態の概要を作成します。

jstack -l 19498 > dump.txt ; awk '/State: / { print }' < dump.txt  | sort | uniq -c

上記のコマンドの結果は次のようになります。

 70    java.lang.Thread.State: RUNNABLE
  8    java.lang.Thread.State: TIMED_WAITING (on object monitor)
  1    java.lang.Thread.State: TIMED_WAITING (sleeping)
171    java.lang.Thread.State: WAITING (on object monitor)

RUNNABLE= 実際に Web アプリケーションのリクエストを処理している
TIMED_WAITING= Quartz スケジューラ スレッド
WAITING= 次の HTTP リクエストを処理するために待機しているアイドル スレッド

WAITING スレッドの例 (すべての WAITING は次のようになります):

"http-80-178" daemon prio=10 tid=0x00007fa8c0bbe000 nid=0x2e11 in Object.wait() [0x00007fa8aaae9000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00007fa8e6b873c8> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
        at java.lang.Object.wait(Object.java:485)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458)
        - locked <0x00007fa8e6b873c8> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484)
        at java.lang.Thread.run(Thread.java:619)

   Locked ownable synchronizers:
        - None

Tomcat の設定

私のTomcat構成パラメータはデフォルト値を使用しています。つまり、

minSpareThreads = 25(したがって、Tomcat は 25 のスレッドが処理可能な状態であることを確認します maxThreads = 200(200 の要求を警告なしで並行して処理できます)
acceptCount = 100(200 のスレッドすべてがビジーの場合、HTTP コネクタは追加の 100 の要求をキューに入れることができます)

問題

コマンドを定期的に実行すると、スレッドの総数が増加していることがわかります。BLOCKINGスレッドはありません。

WAITING別の HTTP リクエストを処理する準備ができている状態のスレッドが多数あるため、スレッドの数が増加している理由がわかりません。

また、RUNNABLE+WAITINGは一定時間 (たとえば 1 時間) 一定ですが、その後 5 または 6 増加し、再び一定のままになります。制限に達してTomcatがシャットダウンするまで、スレッドプールがどんどん大きくなっているようです...

スレッドは、TIMED_WAITINGおそらく同じ JVM で実行される Quartz スケジューラからのものです。

値の解釈は間違っていますか?

4

1 に答える 1

2

この記事を読みましたか?小さな章を引用する:

Java ThreadPoolExecutor の FIFO 動作により、各スレッドは、クローズの対象となる前に、少なくとも「maxIdleTime」だけ新しいタスクを待機します。さらに、スレッド プールの FIFO 動作のため、スレッドを閉じるには、少なくともmaxIdleTimeに等しい時間が経過しても、 要求がまったく入らないことが必要です。

于 2013-01-22T18:16:45.300 に答える