AEM開発者ブログ by YAMATO

アドビ社のデリバリーパートナー大和株式会社のAEM開発者ブログです。

CPUが急に高騰!! 原因となっているJavaスレッドの特定方法

AEM Developerの皆様お疲れさまです。AEMエンジニアの王です。

実稼働環境ではAEMはLinux上で動かすことが多く、また、AEMもJavaプロセスであることから、今回はAEM運用時のトラブルシューティングとして、CPUが急に高騰の原因となっているJavaスレッドの特定方法について語ります。 f:id:www0532:20210419144548p:plain

1.使用率が高い「プロセス」と「スレッド」のプロセス ID の特定

先ず、「プロセス」 と 「スレッド」の違うところから調べると、「プロセス」は、「実行中のプログラムを抽象化したもの」で、「スレッド」は、1つのプロセスから生成される最小実行単位であることを分かりました。そして、同じプロセスから並行でスレッドを起動させることができます。

ここでは、使用率が高い 「プロセス」 のプロセス ID、及びその 「スレッド」 のプロセス ID、両方取得する必要です。

1-1.「プロセス」 のプロセス ID

Linuxの topコマンドは、システムで実行されているプロセスの一覧を表示するコマンドです。このコマンドを利用し、利用率が高いプロセスを特定できます。

topコマンドのデフォルト設定では、上から下にCPU使用率の降順で並んでいます。ここでは、CPU使用率(%CPU)が高い行を注目し、「PID」列に表れている10進数数字の「プロセス」のプロセスIDをメモします。

$ top
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 73292 java-user 20   0   26.9g  23.2g   2.9g S 389.3 75.6   1455:23 java
 79701 root      20   0  162660   2844   1592 S   0.7  0.0   0:13.47 top
     1 root      20   0  191136   3240   1976 S   0.0  0.0  18:22.29 systemd
・・・

1-2.「スレッド」 のプロセス ID

topコマンドの「-H」オプションを付けて、「top -H」と実行すると、CPUの使用率が高いプロセスの「スレッド単位」のCPUデータを取得できます。

$ top -H
  PID USER       PR  NI   VIRT   RES     SHR  S %CPU %MEM     TIME+ COMMAND
18142 java-user  20   0   27.1g  23.3g   3.0g R 58.0 75.0 141:58.25 JobHandler: /va
14425 java-user  20   0   27.1g  23.3g   3.0g R 10.0 75.0 796:13.41 sling-default-1
・・・

上から下には、CPU使用率の降順で並んでいるため、CPU使用率(%CPU)が高い行を注目し、「PID」列に表れている10進数数字の「スレッド」プロセスIDをメモします。

2.プロセス ID の16進数変換

次のステップには、Javaプロセスの「スタックダンプ」の取得処理を行います。この「スタックダンプ」の中には、「nid」が16進数で出力されています。そして、手順1-2で「top -H」コマンドで取得した「スレッド」のプロセス ID(PID)は10進数形式で表しています。両者を合致するため、「スレッド」のプロセス ID(PID)を10進数⇒16進数に変換する必要があります。

$ printf %x\\n 18142
46de

ここで利用するのは、入力データを整形して表示する「printf」コマンドです。記号「%x」を指定されると、後ろの10進数を16進数(符号付き、アルファベット部分は小文字)に変換されます。ここの「\n」は改行コードです。

3.プロセスのスタックダンプの抽出

手順1-1で取得した プロセス のPIDで、jstack ユーティリティーを使用して、プロセスのスタックダンプを抽出する。オプションの「-l」を付けると、ロックについての追加情報などは、長形式で抽出される。

$ jstack -l PID > high-cpu-tdump.out

また、抽出したプロセスのスタックダンプの「nid」から、手順2で変換した16進数の「スレッド」のプロセス ID(PID)で検索すると、原因になっているJavaスレッドが特定されます。

f:id:www0532:20210419162750p:plain

参考資料

JAVA スレッドによる CPU 高使用率の特定

最後に

以上となります。次回は「CURLにより、AEMのIndexの作成」について執筆します。お楽しみに!