AEM Developerの皆様お疲れさまです。AEMエンジニアの王です。
実稼働環境ではAEMはLinux上で動かすことが多く、また、AEMもJavaプロセスであることから、今回はAEM運用時のトラブルシューティングとして、CPUが急に高騰の原因となっているJavaスレッドの特定方法について語ります。
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スレッドが特定されます。
参考資料
最後に
以上となります。次回は「CURLにより、AEMのIndexの作成」について執筆します。お楽しみに!