Go 言語メトリクス (パブリックベータ)
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2022年11月28日(月)
Table of Contents
Go ランタイムの可視性を向上させるために、Go 言語メトリクス機能では、アプリケーション関連のメトリクス内に言語固有の追加の時系列メトリクスが表示されます。これらのメトリクスには、次のものが含まれます。
- ヒープメモリ使用量
- ヒープオブジェクト数
- スタックメモリ使用量
- 合計 GC コレクション数
- 合計 GC stop-the-world 時間
- 合計 Goroutine 数
この機能は現在、パブリックベータです。 フィードバックは、heroku-metrics-feedback@salesforce.com までメールでお送りください。
Go 言語メトリクスは、eco
dyno を除くすべての dyno で使用できます。
全般的な情報
メトリクスの表示設定に関する全般的な情報は、言語ランタイムメトリクスの親ドキュメントを参照してください。
はじめに
Go 言語メトリクスを有効にするために必要な手順として、次の 4 つがあります。
この手順に従って、Enhanced Language Metrics (拡張言語メトリクス) 機能を有効にします。
runtime-heroku-metrics
フラグによって有効になったランタイム環境変数は、実行中の dyno の内部でしか使用できず、アプリケーションの設定には表示されません。Go 言語メトリクスのパブリックベータにオプトインします。これは、ダッシュボードのメトリクスの環境設定ペインから、または CLI で
heroku labs:enable "go-language-metrics" -a "my-app-name"
コマンドを実行して行うことができます。アプリケーションをビルドしてデプロイするために Go buildpack を使用していない場合、ラボのパネルにベータフラグは表示されません。ただし、Go アプリケーションはすべて、それがどのようにビルトされて Heroku にデプロイされたかには関係なく、上記の 2 つのフラグを有効にし、以下に一覧表示されているパッケージを使用することによって引き続きこの機能を使用できます。
メトリクスを Heroku に定期的に報告する、Heroku によって提供される hmetrics/onload パッケージを使用します。
govendor fetch github.com/heroku/x/hmetrics/onload
を使用して、このパッケージをアプリケーションにフェッチします。その他のベンダーツールの使用についての詳細は、ここを参照してください。使用する各メインパッケージで、import _ "github.com/heroku/x/hmetrics/onload"
のように、onload パッケージの空白の識別子のインポートを使用します。更新されたコードをコミットし、それを Heroku アプリケーションにプッシュします。
hmetrics
ライブラリを初期化するための追加の例や代わりの方法がドキュメントに記載されています。
使用可能なメトリクス
上記の手順が完了した後、これらのメトリクスが使用可能になるまでに数分かかることがあります。
Heap Memory Usage (ヒープメモリ使用量)
このグラフには、現在選択されているプロセスタイプのすべての dyno にわたる全体的なメモリ割り当て、最大と平均のヒープメモリ使用量 (runtime.Memstats の HeapAlloc)、最大と平均の GC 目標 (runtime.Memstats の NextGC) が MB 単位でプロットされます。
上記の例では、GC 目標とヒープメトリクスの相対的な使用状況をより適切に表示するために、凡例項目をクリックしてメモリ割り当てがオフに切り替えられています。
このグラフを使用する方法
ヒープの最大と平均の間の大きなギャップは、1 つ以上の dyno でのメモリの問題を示している可能性があります。特定のプロセスタイプの作業パターンによっては、特にその作業がメモリを大量に使用する場合、作業の不均一な分散を示している可能性があります。ヒープと目標の間の大きなギャップは、多くのチャーン (多数の短期間のオブジェクト) を示している可能性があります。これは、GC stop-the-world 時間を長めに設定することでバックアップできる可能性があります。問題が発生していると考えられ、heroku exec にアクセスできる場合は、gops とその pprof サポートなどのツールを使用すると診断に役立ちます。
Stack Memory Usage (スタックメモリ使用量)
このグラフには、現在選択されているプロセスタイプのすべての dyno にわたる全体的なメモリ割り当て、最大と平均のスタックメモリ使用量 (runtime.Memstats の StackInuse) が MB 単位でプロットされます。
上記の例では、スタックメモリの相対的な使用状況をより適切に表示するために、凡例項目をクリックしてメモリ割り当てがオフに切り替えられています。
このグラフを使用する方法
大量のスタックメモリ使用は問題がない場合もありますが、これはアプリケーションによって異なります。各 Goroutine は 2 KB スタックで開始されます。これは、Goroutine が終了するまで、完全な再割り当てによって徐々に増加します。このグラフが一般に、Goroutine 数の増加と共に増加するだけである (以下を参照) 場合は、アプリケーションで Goroutine のリークが発生している可能性があります。問題が発生していると考えられ、heroku exec にアクセスできる場合は、gops とその pprof サポートなどのツールを使用すると診断に役立ちます。
Aggregate Stop the World GC Time (合計 stop-the-world GC 時間)
このグラフには、現在選択されているプロセスタイプのすべての dyno にわたる合計ガベージコレクター (GC) stop-the-world 時間 (runtime.Memstats の PauseTotalNs 派生項目) がプロットされます。さらに、凡例には、集計された期間ごとの GC stop-the-world に費やされた時間の割合 (%) が表示されます。
このグラフを使用する方法
ほとんどの GC 作業は他の Goroutine と並列に実行されるため、Go の GC stop-the-world 時間は常にきわめて短く、GC 実行の開始時と終了時に短い一時停止だけが必要になります。GC stop-the-world 時間の割合が大きく、heroku exec にアクセスできる場合は、gops とその pprof サポートなどのツールを使用すると診断に役立ちます。
Aggregate Garbage Collections (合計ガベージコレクション)
このグラフには、現在選択されているプロセスタイプのすべての dyno にわたる GC コレクションの総数 (runtime.Memstats の NumGC 派生項目) がプロットされます。
このグラフを使用する方法
ガベージコレクションの多さは、ヒープ上のオブジェクトでの多くのチャーンを示している可能性があります。アプリケーションで GODEBUG=gctrace=1 を設定してアプリケーションのログストリームを監視したり、gops とその pprof サポートなどのツールを使用したりすると、問題が発生していることが確実な場合のアプリケーションの診断に役立つことがあります。
Heap Objects (ヒープオブジェクト)
このグラフには、現在選択されているプロセスタイプのすべての dyno にわたるヒープオブジェクト (runtime.Memstats の Mallocs - Frees) の最小数、最大数、平均数がプロットされます。
このグラフを使用する方法
最大値/平均値/最小値の間の大きな違いは、ヒープオブジェクトでの多くのチャーンを示している可能性があります。合計ガベージコレクションのグラフの下のアドバイスを参照してください。
Number of Goroutines (Goroutine の数)
このグラフには、現在のプロセスタイプのすべての dyno にわたる Goroutine (runtime.NumGoroutine()) の最小数、最大数、平均数がプロットされます。
このグラフを使用する方法
再起動でのみリセットされる、絶えず増加している Goroutine の数 (特に、増え続けているスタックメモリ使用量と関連している場合) は、Goroutine のリークを示している可能性があります。コードを監査して、作成されたすべての Goroutine がどのように停止するかを把握し、理解するようにしてください。 heroku exec にアクセスできる場合は、gops とその pprof サポートなどのツールがそれ以上の診断に役立つことがあります。
メトリクスに関する注記
グラフのプロットはすべて、現在選択されているプロセスタイプのすべての dyno から集計されたデータによってレンダリングされています。"最大" 値が表示されている場合、それは、選択されているプロセスタイプのすべての dyno にわたる特定の期間での最大値です。同様に、"平均" は、選択されているプロセスタイプのすべての dyno にわたる特定の期間での平均です。また、"カウント (数)“ は、特定の期間での選択されているプロセスタイプのすべての dyno のすべてのカウントの合計です。たとえば、アプリケーションの "Web” プロセスタイプに 3 つの dyno がある場合、特定の期間での測定は次のようになります。web.1 (ヒープメモリ: 10 KB、Goroutine の数: 10、8 KB の GC 目標)、web.2 (ヒープメモリ: 8 KB、Goroutine の数: 5、6 KB の GC 目標)、web.3 (ヒープメモリ: 15 KB、Goroutine の数: 20、8 KB の GC 目標)。このタイムフレームのグラフに表示されるサマリー値は次のようになります。ヒープの最大: 15 KB、ヒープの平均: 11 KB、Goroutine の数: 35、GC 目標の最大: 8 KB、GC 目標の平均: 7.3 KB。
メトリクス収集の無効化
Go メトリクスの収集を無効にするには、単純に 「Metrics Preferences」 (メトリクスの環境設定) パネルまたは次の CLI コマンドを使用して 「Enhanced Language Metrics」 (拡張言語メトリクス) トグルをオフに切り替えます。
$ heroku labs:disable "runtime-heroku-metrics" -a "my-app-name"