Troubleshooting Tools and Resources
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

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

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

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

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

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

  3. CLIツール経由でダンプをダウンロードする

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

次のセクションでは、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 フォルダにデプロイできるディレクトリに保存します。

  1. プロジェクトリポジトリの Liferay 構成に、手動スクリプト用の新しいフォルダを作成します (例: liferay/configs/[ENV]/diagnostics/)。 適切な liferay/configs/[ENV]/ ディレクトリにフォルダを作成すると、デプロイされると、フォルダの内容が Liferay インスタンスs $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 PaaS でのサービスの更新 に記載されている手順に従って、スクリプトを適切な環境にデプロイします。

  2. Liferay Cloud コンソールで、適切な環境の Liferay サービス ページに移動します。

  3. シェル タブをクリックします。

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

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

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

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

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

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

    [Liferay Cloud] Thread dumps generated
    

スクリプトの実行が終了すると、スレッドまたはヒープ ダンプが /mnt/persistent-storage/内のタイムスタンプ付きサブフォルダーに保存されます。 次に、CLI ツールを使用してダンプをダウンロードし、ローカルで取得する必要があります。

CLIツール経由でダンプをダウンロードする

CLI ツールs lcp ファイル ダウンロード コマンドを使用してダウンロードし、スレッドまたはヒープ ダンプを取得します。

  1. コマンドプロンプトから、 lcp files download コマンドを実行してダンプを取得します。 たとえば、すべてのヒープダンプを heap_dumps/ サブフォルダから ~/tmp/ 宛先フォルダに取得するには、次のコマンドを実行します。

    lcp files download --prefix heap_dumps --dest ~/data/tmp
    
  2. ツールの指示に従って認証し(まだ認証していない場合)、ダウンロードする環境を選択します。

    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>/

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