私は観察を行い、それを完全に理解したいと思います。
まず、定期的にスレッド ダンプを取得し、スレッドの状態の概要を作成します。
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 スケジューラからのものです。
値の解釈は間違っていますか?