PayaraでJavaアプリケーションのスレッド、メモリ、キューの監視と分析
はじめに
Payara を使用して Java アプリケーションを運用する際、アプリケーションのパフォーマンスと安定性を確保するためには、スレッドの状態、メモリ使用量、およびキューの監視が重要です。
今回は、Java アプリケーションの監視に役立つコードを実際に試してみました。
スレッドの状態、メモリ使用状況、およびキューの情報を収集し、問題を検出する手順を紹介します。
スレッドの状態監視
Payara アプリケーション内で実行中のスレッドの状態を監視するために、 ThreadMXBean を使用してスレッド情報を収集します。
コードは定期的にスレッドの状態を取得し、NEW、 RUNNABLE、 BLOCKED、 WAITING、 TIMED_WAITING 、 TERMINATED の各状態ごとにスレッド数を集計します。
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
// 各状態ごとのスレッド数を取得し、集計
for (ThreadInfo info : threadInfos) {
String threadName = info.getThreadName();
if (!threadName.contains("任意のスレッド名")) {
continue;
}
threadCount++;
Thread.State state = info.getThreadState();
switch (state) {
case NEW:
newCount++;
break;
case RUNNABLE:
runnableCount++;
break;
case BLOCKED:
blockedCount++;
break;
case WAITING:
waitingCount++;
break;
case TIMED_WAITING:
timedWaitingCount++;
break;
case TERMINATED:
terminatedCount++;
break;
}
}
メモリ使用状況監視
アプリケーションのメモリ使用状況を監視するために、 MemoryMXBean を使用します。
ヒープメモリの使用量を収集し、 MB 単位で表示します。
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();
long usedHeapMemory = heapMemoryUsage.getUsed() / (1024 * 1024); // MB単位で表示
キューの監視
Payara サーバ内のキューの監視には、 MBeanServer と ObjectName を使用します。
Payara の MBean の ObjectName を定義し、必要な属性の値を取得します。
以下は、キューの監視の例です。
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = new ObjectName("amx:pp=/mon/server-mon[server],type=connection-queue-mon,name=network/http-listener-1/connection-queue");
Object attributeValue = mBeanServer.getAttribute(objectName, "countqueued");
結果の出力
収集した情報は定期的に出力され、アプリケーションの状態をモニタリングします。
System.out.println("スレッド数:" + threadCount " 使用中のヒープメモリ:" + usedHeapMemory + " MB");
System.out.println("スレッド内訳: NEW: " + newCount + ", RUNNABLE: " + runnableCount + ", BLOCKED: " + blockedCount
+ ", WAITING: " + waitingCount + ", TIMED_WAITING: " + timedWaitingCount + ", TERMINATED: " + terminatedCount);
System.out.println("キュー数: " + ((CompositeDataSupport) attributeValue).values().iterator().next());
継続的な監視
コードのループ内でスレッドを一定間隔で監視し、状態を定期的に出力します。
これにより、アプリケーションの動作を常にモニタリングできます。
このコードを使用して Payara で実行中の Java アプリケーションのスレッド、メモリ、およびキューを監視し、問題を素早く検出して対処できるようになります。
下記は実際に上記のコードを利用して出力した結果となります。
[#|2023-10-27T23:33:52.383+0900|INFO|_ThreadID=181;_ThreadName=Thread-29;_TimeMillis=1698417232383;_LevelValue=800;|
スレッド数:5 使用中のヒープメモリ:405 MB|#]
[#|2023-10-27T23:33:52.386+0900|INFO|_ThreadID=181;_ThreadName=Thread-29;_TimeMillis=1698417232386;_LevelValue=800;|
スレッド内訳: NEW: 0, RUNNABLE: 0, BLOCKED: 0, WAITING: 5, TIMED_WAITING: 0, TERMINATED: 0|#]
[#|2023-10-27T23:33:52.388+0900|INFO|_ThreadID=181;_ThreadName=Thread-29;_TimeMillis=1698417232388;_LevelValue=800;|
キュー数: 0|#]
[#|2023-10-27T23:34:02.405+0900|INFO|_ThreadID=181;_ThreadName=Thread-29;_TimeMillis=1698417242405;_LevelValue=800;|
スレッド数:5 使用中のヒープメモリ:411 MB|#]
[#|2023-10-27T23:34:02.407+0900|INFO|_ThreadID=181;_ThreadName=Thread-29;_TimeMillis=1698417242407;_LevelValue=800;|
スレッド内訳: NEW: 0, RUNNABLE: 0, BLOCKED: 0, WAITING: 5, TIMED_WAITING: 0, TERMINATED: 0|#]
[#|2023-10-27T23:34:02.407+0900|INFO|_ThreadID=181;_ThreadName=Thread-29;_TimeMillis=1698417242407;_LevelValue=800;|
キュー数: 0|#]
まとめ
スレッドの状態、メモリ、およびキューの使用状況を監視するために、モニタリングツールを使用したり、 JMX を活用したりすることも可能です。
ただ、インストールやセキュリティの設定の手間などあったため、今回はコードで取得するようにしました。
コードで対応するのは簡単ですが、高度な分析などには適していなかったりするので、機会があれば他の手法も試してみたいです。
Discussion