'Heroku Labs: log-runtime-metrics'
最終更新日 2023年05月24日(水)
この Heroku Labs の log-runtime-metrics
機能により、実行中の dyno の負荷とメモリ使用量への可視性を有効にするための実験的サポートが追加されます。メモリ使用、スワップ使用、負荷平均に関する dyno ごとの統計は、アプリのログストリームに挿入され、その後 heroku logs --tail
で表示したり、グラフや、アプリログを消費するアドオンによるアラート生成に使用したり、ログドレインに送信したりできます。この機能を有効にしてもコストは発生しません。
Heroku Labs を通して追加された機能は実験的であり、変更される場合があります。
有効化
$ heroku labs:enable log-runtime-metrics --app example-app
Enabling log-runtime-metrics for example-app... done
$ heroku restart
無効化
$ heroku labs:disable log-runtime-metrics --app example-app
Disabling log-runtime-metrics for example-app... done
$ heroku restart
この機能を完全に無効にするには、デプロイの実行が必要になることがあります。これを行うには、空のコミット
git commit --allow-empty -m "Force Heroku build."
に続けて Git プッシュします。
仕組み
負荷とメモリ使用量のメトリクスは、Logplex ログストリームでシステムログとして表示されます。メトリクスは、おおよそ 20 秒に 1 回の頻度で、実行中の dyno ごとに送出されます。
ログ形式
ランタイムメトリクスのログの形式は次のとおりです。
source=web.1 dyno=heroku.2808254.d97d0ea7-cf3d-411b-b453-d2943a50b456 sample#load_avg_1m=2.46 sample#load_avg_5m=1.06 sample#load_avg_15m=0.99
source=web.1 dyno=heroku.2808254.d97d0ea7-cf3d-411b-b453-d2943a50b456 sample#memory_total=21.00MB sample#memory_rss=21.22MB sample#memory_cache=0.00MB sample#memory_swap=0.00MB sample#memory_pgpgin=348836pages sample#memory_pgpgout=343403pages
source
フィールドは Dyno formation の dyno を識別し、アプリケーションログを消費するシステムによって使用されることを目的にしています。dyno
フィールドには、プラットフォーム上での個別の dyno 実行を一意に識別するアプリ ID と UUID が含まれています。アプリメトリクスの有効期間中に、dyno をいつデプロイまたは再起動するかに関連して、同じ source
値が多くの異なる dyno
値を持つことを確認できます。
ログに送出されるメトリクスのキーと値のペアの順序は保証されません。
CPU 負荷平均
次のフィールドは、CPU 負荷平均に対して報告されます。
- Load Average 1m (
load_avg_1m
): 過去 1 分間の dyno の負荷平均。これには、待機状態のキューに入っている (つまり、処理待ちの) CPU タスクの数が反映されます。負荷平均の計算方法についての詳細は、下記を参照してください。 - Load Average 5m (
load_avg_5m
): 過去 5 分間の dyno の負荷平均。1m の負荷平均と同じ方法で計算されます。 - Load Average 15m (
load_avg_15m
): 過去 15 分間の dyno の負荷平均。1m の負荷平均と同じ方法で計算されます。
メモリとスワップ
次のフィールドは、メモリ消費とスワップに対して報告されます。
- Resident Memory (
memory_rss
): dyno のメモリのうち、RAM に保持されている部分 (MB)。 - Disk Cache Memory (
memory_cache
): dyno のメモリのうち、ディスクキャッシュとして使用される部分 (MB)。 - Swap Memory (
memory_swap
): dyno のメモリのうち、ディスクに保存されている部分 (MB)。アプリで 1 dyno 当たり数メガバイトのスワップを使用するのは普通です。ただし、スワップレベルが高い場合は、dyno のサイズと比較してメモリの使用量が多すぎることを示している可能性があります。応答時間が遅くなる可能性があるため、このような状況は避ける必要があります。 - Total Memory (
memory_total
): dyno によって使用されている合計メモリ (MB)。常駐メモリ、キャッシュメモリ、スワップメモリの合計と同じです。 - Memory Quota (
memory_quota
): R14 がトリガーされる常駐メモリ (memory_rss
) の値 (MB)。 - Pages Written to Disk (
memory_pgpgout
): ディスクに書き込まれたページの累積合計。この数値が突然高く変動した場合は、スワップ使用での短期間の急増を示している場合があります。他のメモリ関連のメトリクスはポイントインタイムスナップショットであり、短期間の急増を見逃す可能性があります。 - Pages Read from Disk (
memory_pgpgin
): ディスクから読み取られたページの累積合計。前のメトリクスと同様に、突然の変動がないか監視します。
負荷平均について
Dyno Manager は、dyno ごとの実行可能タスクの数を約 20 秒おきに受け取ります。実行可能タスクは、現在 CPU で実行されているか、または CPU での実行を待機しているプロセスまたはスレッドですが、それ以外の場合は、実行するために必要なすべてのリソースを備えています。指数関数的に減衰された移動平均は、次の繰り返しのアルゴリズムで、30 分前からの実行可能タスクの数を使用して計算されます。
expterm = Math.exp(-(count_of_runnable_tasks.time - avg.time) / (period))
newavg = (1 - expterm) * count_of_runnable_tasks.value + expterm * avg.value
ここで、period
は 1 分、5 分、15 分 (秒単位) のいずれかであり、count_of_runnable_tasks
は特定の時点でのキュー内のタスクの数のエントリであり、avg
は最後の繰り返しでの以前に計算された指数関数的な負荷平均です。
Heroku の dyno の負荷計算は、割り込み不可能なスリープ状態のプロセスが含まれないため LINUX の負荷計算とは異なり、従来の UNIX の負荷計算に似たものになっています。