【技術メモ】Wildflyのスレッド監視
Wildflyのアクティブスレッド数監視はどこをみればよいか、のメモ。
ただし、調べた感じと、キーワードと、現場証拠からの推測。
結論
jolokiaで言うと、ここと思われる。
根拠
Wildflyでは、Web/ServletコンテナとしてUndertowを採用している。(Undertowは、Tomcat同等の機能。)
Undertowがリクエストを処理する時のアーキテクチャは、
- 「I/Oスレッド」でリクエストを受け付ける(リスナーのイメージ)
- 「タスクスレッド」で処理を実行する(いわゆるスレッド)
それぞれ、/subsystem=ioの「Workers」でパラメータ設定
- Io threads:リクエストを受け付けるスレッド数、デフォルトはCPU数x2
- Task max threads:タスクスレッドの最大数、デフォルトはCPU数x16
(参考リンク)
www.slideshare.net
実装箇所
IO Subsystemのこのあたりの設定の実装がどこかというと、XNIO API(org.xnio)の中。
(参考リンク)
IO Worker configuration for Undertow | JBoss Developer
MBeanパス
JConsoleでそれっぽい値を探すと、org.xnioを辿った先にスレッドの設定値がある
- MaxWorkerPoolSize:タスクスレッドの最大値(デフォルト値と一致してる。)
- WorkerQueueSize:キューに入っている数(サイト動かすと値が上下する。)
と思われる。
検証
ウラトリのためにコード追ってみたけど、追いきれず。。。
org.xnio.Options
515 public static final Option<Integer> WORKER_TASK_MAX_THREADS = Option.simple(Options.class, "WORKER_TASK_MAX_THREADS", Integer.class);
org.xnio.XnioWorker
116 final int threadCount = optionMap.get(Options.WORKER_TASK_MAX_THREADS, 16); 117 taskPool = new TaskPool( 118 threadCount, // ignore core threads setting, always fill to max 119 threadCount, 120 optionMap.get(Options.WORKER_TASK_KEEPALIVE, 60000), TimeUnit.MILLISECONDS, 121 taskQueue, 122 new WorkerThreadFactory(threadGroup, optionMap, markThreadAsDaemon), 123 new ThreadPoolExecutor.AbortPolicy()); 865 protected final int More ...getWorkerQueueSize() { 866 return taskQueue.size(); 867 }
追記(2017-06-08)
この人が、WorkerQueueSizeを見ろ、と言ってる