スレッドとヒープのダンプの作成

スレッドとヒープのダンプの作成

liferay サービスのパフォーマンスに問題がある場合、あなたやLiferay Cloud Supportがインスタンスを最適化したり、問題のトラブルシューティングをするために、スレッドやヒープダンプを取る必要がある場合があります。

次の手順に従って、トラブルシューティング用のスレッドまたはヒープダンプを生成します:

  1. ダンプを生成するスクリプトの選択

  2. Liferayサービスシェルからスクリプトを実行

  3. バックアップ経由でダンプをダウンロード

  4. 終わったらダンプを削除する

次のセクションでは、Liferay Cloud 環境のスレッドまたはヒープダンプを生成するために実行できるスクリプトの例を示します。

ダンプを生成するスクリプトの選択

スレッドダンプとヒープダンプのどちらを生成する場合でも、 liferay サービスの シェル を介してスクリプトを実行し、バックアップ経由でダウンロードできるようにすることができます。

スレッドダンプ作成スクリプト

スレッドダンプは、Liferay Cloud 環境でどのような処理が行われているかを把握するのに役立ちます。 複数のスレッドダンプのセットがあると、Liferayインスタンスに問題のあるパターンが存在する可能性があるかどうかをよりわかりやすく表示できます。

このスクリプトを使用すると、任意の Liferay Cloud 環境で Liferay インスタンスのスレッドダンプを生成することができます。

#!/bin/bash

TARGET_THREAD_DUMP_FOLDER=${TARGET_THREAD_DUMP_FOLDER:-/opt/liferay/data/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 サービスの $LIFERAY_HOME/data/フォルダ(デフォルトでthread_dumps /という名前)に新しいフォルダを作成し、それぞれがスレッドダンプのセットが含まれている複数のタイムスタンプ付きのサブフォルダを作成します。 デフォルトでは、約60秒間隔のタイムスタンプがある 4つのサブフォルダ を作成し、各サブフォルダに約10秒間隔で 6つのスレッドダンプ が含まれます。 スレッドダンプは、 jstackユーティリティー で作成されます。

複数の編集を行って、この動作を変更できます:

  • 1行目のパスの最後にある thread_dumps/ を変更することで、スレッドダンプが保存されるディレクトリの名前を変更することができます。 ただし、バックアップでアクセスできるようにするには、 data/ directoryの中にフォルダを置いておく必要があります。

  • メイン 関数のループで反復回数を変更することで、作成されるセットの数を変更することができます。 take_thread_group 関数で同じ変更を行って、セットごとのスレッドダンプの数を変更できます。

  • sleep コマンドの周期(秒単位)を メイン 機能で変更することで、各セットが作成される頻度を変更することができます。 take_thread_group 関数で同じ変更を行って、各セット内のスレッドダンプの頻度を変更できます。

ヒープダンプ作成スクリプト

ヒープダンプは、LiferayインスタンスでどのデータがRAMを消費しているかを把握するのに役立ちます。 インスタンスのメモリ割り当てをトラブルシューティングする必要がある場合、問題があるかどうかを判断するために、異なる重要な時間に複数のヒープダンプを取得する必要があるかもしれません。

このスクリプトを使用すると、任意の Liferay Cloud 環境で Liferay インスタンスのヒープダンプを生成することができます。

#!/bin/bash

TARGET_HEAP_DUMP_FOLDER=${TARGET_HEAP_DUMP_FOLDER:-/opt/liferay/data/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 サービスの $LIFERAY_HOME/data/フォルダ(デフォルトでheap_dumps /という名前)に新しいフォルダを作成し、単一の新しいヒープダンプが含まれているタイムスタンプ付きのサブフォルダを作成します。 ヒープダンプは、 jmap ユーティリティー で作成されます。

1行目のパスの最後にある heap_dumps/ を変更することで、スレッドダンプが保存されるディレクトリの名前を変更することができます。 ただし、バックアップでアクセスできるようにするには、 data/ folderの中にフォルダを置いておく必要があります。

Liferayサービスシェルからスクリプトを実行する

使用するスクリプトが決まったら、デプロイして Liferay Cloud コンソールの liferay サービスのシェルから実行する必要があります。

スクリプトをプロジェクトのリポジトリに保存する

まず、選んだスクリプトをLiferayインスタンスの $LIFERAY_HOME フォルダにデプロイできるディレクトリに保存します。

  1. liferay/configs/{ENV}/diagnostics/のように、プロジェクトリポジトリのLiferay構成の中に、手動スクリプト用の新しいフォルダを作成します。 適切な liferay/configs/{ENV}/ ディレクトリにフォルダを作成することで、デプロイされた際にLiferayインスタンスの $LIFERAY_HOME にフォルダのコンテンツが表示されるようになります。

    cd liferay/configs/common/
    
    mkdir diagnostics/
    
  2. プロジェクトリポジトリのLiferay構成の中に、手動スクリプト用の新しいフォルダ( liferay/configs/{ENV}/diagnostics/など)に、 generate_thread_dumps.sh または generate_heap_dump.sh ファイルを作成します。

    touch my_script_name.sh
    
  3. 目的のスクリプトの内容 を新しいファイルに保存します。

スクリプトのデプロイと実行

liferay/configs/{ENV}/のサブフォルダに保存したら、スクリプトをデプロイし、Liferay Cloud コンソールのシェルから実行する必要があります。

  1. Liferay Cloud デプロイメントワークフローの概要 で説明されている手順に従って、スクリプトを適切な環境にデプロイしてください。

  2. Liferay Cloud コンソールで、適切な環境の liferay サービス ページに移動してください。

  3. Shell] タブをクリックします。

    Liferayサービスシェルにアクセスして、スクリプトを実行します。

    この環境にデプロイしたスクリプトは、このシェルからアクセスできるファイルシステムにあります。

  4. シェルで、スクリプトを作成してデプロイしたフォルダに移動します。

    cd diagnostics/
    
  5. デプロイしたスクリプトを実行する権限があることを確認してください。

    chmod +x ./generate_thread_dumps.sh
    
  6. スクリプトを実行します。

    ./generate_thread_dumps.sh
    
  7. スクリプトが完了するまで待って、適切な数のスレッドダンプがあることを確認します。 スクリプトがスレッドまたはヒープダンプの作成を終了すると、確認メッセージが表示されます。

    [Liferay Cloud] Thread dumps generated
    
    note

    (このセクションで)提供しているヒープダンプスクリプト(#heap-dump-creation-script)では、1つのヒープダンプしか生成されません。 異なる時間帯のメモリ使用量を分析するために複数のヒープダンプが必要な場合は、その時間帯にスクリプトを再度実行する必要があります。

スクリプトが実行し終えたら、スレッドまたはヒープダンプ(複数可)は $LIFERAY_HOME/データ内で利用可能なタイムスタンプ付きのサブフォルダに保存されます。 次に、バックアップを経由してダンプをダウンロードし、ローカルに取り出す必要があります。

バックアップ経由でダンプをダウンロード

データ ボリュームのバックアップとともにスレッドまたはヒープダンプをダウンロードして取得します。 ダンプが生成された後、まずバックアップを作成する必要があります。

  1. 画面左側のリンクから、同じ環境の [バックアップ] 画面に移動します。

  2. バックアップページで、[今すぐバックアップ]をクリックします。

    [今すぐバックアップ]をクリックすると、選択した環境のバックアップが手動で作成されます。

  3. バックアップが作成されたら、新しいバックアップのアクションメニューをクリックし、 [ダウンロード] をクリックして、 backup-lfr-<PROJECT_NAME>-<ENV>-<TIMESTAMP>.tgz という名前のダウンロードリンクを選択してデータ ボリュームをダウンロードできます。

    データボリュームをダウンロードするには、正しいリンクを選択してください。

データ ボリュームのバックアップを含むダウンロードが開始されます。 ダンプは、スクリプトが指定したサブフォルダに含まれます(例: thread_dumps/ または heap_dumps/)。

終わった後のダンプの削除

生成されたスレッドやヒープダンプは、特にスクリプトを複数回実行した場合、Liferayサービスの データ ボリュームのかなりのスペースを占める可能性があります。 データ ボリュームのメモリを浪費しないように、ダンプが不要になったら、環境からダンプを削除するようにしてください。 Liferay Cloud コンソールの Liferay サービスシェルを使用して、ダンプを削除します。

例えば、Liferay Cloud コンソールから以下のコマンドを実行し、スレッドダンプの1セットを削除します。

cd data/thread_dumps/
rm -r <TIMESTAMPED_FOLDER>/

ここで提供されているスクリプト は、スレッドとヒープのダンプを、それらがいつ作成されたかを判別するために使用できるタイムスタンプを使用してサブフォルダーに保存します。 トラブルシューティングに不要になったタイムスタンプを持つサブフォルダーのみを削除することも可能です。

関連トピック