スレッドとヒープのダンプの作成
Liferay サービスのパフォーマンスに問題がある場合は、インスタンスを最適化したり、問題をトラブルシューティングしたりするために、スレッド ダンプまたはヒープ ダンプを取得する必要がある場合があります。
次の手順に従って、トラブルシューティング用のスレッドまたはヒープダンプを生成します:
次のセクションでは、Liferay Cloud環境のスレッドやヒープダンプを生成するために実行できるスクリプトの例を紹介します。
ダンプを生成するスクリプトの選択
スレッドダンプまたはヒープダンプのどちらを生成する場合でも、Liferay サービスの シェル を通じてスクリプトを実行し、バックアップ経由でダウンロードできるようにすることができます。
スレッドダンプ作成スクリプト
スレッドダンプは、Liferay Cloud環境でどのようなプロセスが行われているかを理解するのに役立ちます。 複数のスレッドダンプのセットがあると、Liferayインスタンスに問題のあるパターンが存在する可能性があるかどうかをよりわかりやすく表示できます。
このスクリプトを使用すると、任意のLiferay Cloud環境でLiferayインスタンスのスレッドダンプを生成することができます。
#!/bin/bash
TARGET_THREAD_DUMP_FOLDER=${TARGET_THREAD_DUMP_FOLDER:-/mnt/persistent-storage/thread_dumps}
mkdir -p "${TARGET_THREAD_DUMP_FOLDER}"
take_thread_dump() {
mkdir -p "${TARGET_THREAD_DUMP_FOLDER}/${1}"
local pid=$(jps | grep -v Jps | awk '{print $1}')
echo "[Liferay Cloud] jstack ${pid} > ${TARGET_THREAD_DUMP_FOLDER}/${1}/threaddump${2}.txt"
jstack ${pid} > ${TARGET_THREAD_DUMP_FOLDER}/${1}/threaddump${2}.txt
}
take_thread_group() {
local time=$(date +'%H%M%S')
echo "[Liferay Cloud] Taking thread dumps with timestamp ${time}"
for num in 1 2 3 4 5 6
do
take_thread_dump $time $num
sleep 10
done
}
main() {
for num in 1 2 3 4
do
take_thread_group
sleep 60
done
echo "[Liferay Cloud] Thread dumps generated"
}
echo "[Liferay Cloud] Take thread dumps"
main
このスクリプトは、Liferay サービスの永続ストレージ フォルダ(デフォルトでは thread_dumps/ という名前)に新しいフォルダを作成し、次に、それぞれに一連のスレッド ダンプが含まれる複数のタイムスタンプ付きサブフォルダを作成します。 デフォルトでは、約60秒間隔のタイムスタンプがある4つのサブフォルダ を作成し、各サブフォルダに約10秒間隔で 6つのスレッドダンプが含まれます。 スレッド ダンプは jstack ユーティリティを使用して作成されます。
複数の編集を行って、この動作を変更できます:
-
1行目のパスの最後にある
thread_dumps/を変更することで、スレッドダンプが保存されるディレクトリの名前を変更することができます。 ただし、 CLI ツールからアクセスできるようにするには、フォルダーを/mnt/persistent-storage/ディレクトリ 内に保持する必要があります。 -
メイン関数ループ内の反復回数を変更して、作成されるセットの数を変更できます。take_thread_group関数で同じ変更を行って、セットごとのスレッドダンプの数を変更できます。 -
sleepコマンドの周期(秒単位)をメイン機能で変更することで、各セットが作成される頻度を変更することができます。take_thread_group関数で同じ変更を行って、各セット内のスレッドダンプの頻度を変更できます。
ヒープダンプ作成スクリプト
ヒープダンプは、LiferayインスタンスでどのデータがRAMを消費しているかを把握するのに役立ちます。 インスタンスのメモリ割り当てのトラブルシューティングを行う必要がある場合は、問題があるかどうかを判断するために、異なる重要な時間に複数のヒープダンプを取得する必要がある場合があります。
このスクリプトを使用すると、任意のLiferay Cloud環境でLiferayインスタンスのスレッドダンプを生成することができます。
#!/bin/bash
TARGET_HEAP_DUMP_FOLDER=${TARGET_HEAP_DUMP_FOLDER:-/mnt/persistent-storage/heap_dumps}
mkdir -p "${TARGET_HEAP_DUMP_FOLDER}"
take_heap_dump() {
mkdir -p "${TARGET_HEAP_DUMP_FOLDER}/${1}"
echo "[Liferay Cloud] Taking heap dump with timestamp ${1}"
local pid=$(jps | grep -v Jps | awk '{print $1}')
echo "[Liferay Cloud] jmap -dump:format=b,file=heapdump.txt ${pid}"
jmap -dump:format=b,file=heapdump.txt ${pid}
mv heapdump.txt ${TARGET_HEAP_DUMP_FOLDER}/${1}/heapdump.txt
}
main() {
local time=$(date +'%H%M%S')
take_heap_dump $time
echo "[Liferay Cloud] Heap dump generated"
}
main
このスクリプトは、Liferay サービスの永続ストレージ フォルダ(デフォルトでは heap_dumps/ という名前)に新しいフォルダを作成し、次に、単一の新しいヒープ ダンプを含むタイムスタンプ付きのサブフォルダを作成します。 ヒープ ダンプは jmap ユーティリティを使用して作成されます。
1行目のパスの最後にある heap_dumps/ を変更することで、スレッドダンプが保存されるディレクトリの名前を変更することができます。 ただし、 CLI ツールからアクセスできるようにするには、フォルダーを /mnt/persistent-storage/ フォルダー 内に保持する必要があります。
Liferayサービスシェルからスクリプトを実行する
使用するスクリプトができたら、それをデプロイし、Liferay Cloud コンソールの Liferay サービスのシェルから実行する必要があります。
スクリプトをプロジェクトのリポジトリに保存する
まず、選択したスクリプトを、Liferay インスタンスs $LIFERAY_HOME フォルダにデプロイできるディレクトリに保存します。
-
プロジェクトリポジトリの Liferay 構成に、手動スクリプト用の新しいフォルダを作成します (例:
liferay/configs/[ENV]/diagnostics/)。 適切なliferay/configs/[ENV]/ディレクトリにフォルダを作成すると、デプロイされると、フォルダの内容が Liferay インスタンスs$LIFERAY_HOMEに表示されるようになります。cd liferay/configs/common/mkdir diagnostics/ -
プロジェクトリポジトリの Liferay 構成内の手動スクリプト用の新しいフォルダ (
liferay/configs/[ENV]/diagnostics/など) に、generate_thread_dumps.shまたはgenerate_heap_dump.shファイルを作成します。touch my_script_name.sh -
目的のスクリプトの内容 を新しいファイルに保存します。
スクリプトのデプロイと実行
スクリプトを liferay/configs/[ENV]/のサブフォルダに保存したら、スクリプトをデプロイし、Liferay Cloud コンソールのシェルから実行する必要があります。
-
Liferay PaaS でのサービスの更新 に記載されている手順に従って、スクリプトを適切な環境にデプロイします。
-
Liferay Cloud コンソールで、適切な環境の Liferay サービス ページに移動します。
-
シェル タブをクリックします。

この環境にデプロイしたスクリプトは、このシェルからアクセスできるファイルシステムにあります。
-
シェルで、スクリプトを作成してデプロイしたフォルダに移動します。
cd diagnostics/ -
デプロイしたスクリプトを実行する権限があることを確認してください。
chmod +x ./generate_thread_dumps.sh -
スクリプトを実行します。
./generate_thread_dumps.sh -
スクリプトが完了するまで待って、適切な数のスレッドダンプがあることを確認します。 スクリプトがスレッドまたはヒープダンプの作成を終了すると、確認メッセージが表示されます。
[Liferay Cloud] Thread dumps generated注このセクション で提供されているヒープ ダンプ スクリプト は、ヒープ ダンプを 1 つだけ生成します。 異なる時間帯のメモリ使用量を分析するために複数のヒープダンプが必要な場合は、その時間帯にスクリプトを再度実行する必要があります。
スクリプトの実行が終了すると、スレッドまたはヒープ ダンプが /mnt/persistent-storage/内のタイムスタンプ付きサブフォルダーに保存されます。 次に、CLI ツールを使用してダンプをダウンロードし、ローカルで取得する必要があります。
CLIツール経由でダンプをダウンロードする
CLI ツールs lcp ファイル ダウンロード コマンドを使用してダウンロードし、スレッドまたはヒープ ダンプを取得します。
-
コマンドプロンプトから、
lcp files downloadコマンドを実行してダンプを取得します。 たとえば、すべてのヒープダンプをheap_dumps/サブフォルダから~/tmp/宛先フォルダに取得するには、次のコマンドを実行します。lcp files download --prefix heap_dumps --dest ~/data/tmp -
ツールの指示に従って認証し(まだ認証していない場合)、ダウンロードする環境を選択します。
Please select a project from the list below: # Project Status 1 myproject-prd Ready 2 myproject-infra Ready 3 myproject-uat Ready ? Type a number (#) or project name:
ツールは指定したフォルダーからダンプのダウンロードを開始します。
終わった後のダンプの削除
生成したスレッドダンプやヒープダンプは、特にスクリプトを複数回実行する場合、Liferay サービスの永続ストレージスペースでかなりのスペースを占有する可能性があります。 メモリの無駄遣いを避けるために、不要になったダンプは必ず環境から削除してください。 Liferay CloudコンソールでLiferayのサービスシェルを使い、ダンプを削除します。
例えば、Liferay Cloudコンソールから以下のコマンドを実行して、スレッドダンプの1つのセットを削除します:
cd mnt/persistent-storage/
rm -r <TIMESTAMPED_FOLDER>/
ここで提供される スクリプト は、スレッドとヒープのダンプを、作成された時刻を特定するために使用できるタイムスタンプ付きのサブフォルダーに保存します。 トラブルシューティングに不要になったタイムスタンプを持つサブフォルダーのみを削除することも可能です。