「使用済みメモリ」メトリクスが Go pprof と Docker 統計で異なる理由
コンテキスト
上で実行されている Go アプリケーション内Docker コンテナーの場合、docker stats コマンドは、メモリ使用量が直線的に増加していることを報告します。ただし、HTTP pprof を使用して実行中のアプリケーションを監視すると、runtime.MemStats.sys の値は一定のままになります。この不一致により、メモリ リークの可能性に関する疑問が生じます。
Cgroup とメモリ メトリクス
Docker 統計は、cgroup からメモリ使用量統計を取得し、メモリ アクセスを最適化してキャッシュラインの偽共有を回避します。したがって、cgroups の use_in_bytes メトリクスには、コンテナ内のファイル I/O を考慮したページ キャッシュと RES の両方が含まれます。
メモリ再利用
コンテナのメモリ使用量が上限に達すると、プロセスを終了するのではなく、未使用のメモリが再利用されます。これは、pprof が一定の runtime.MemStats.sys 値を報告する一方で、docker stats が直線的に増加するメモリ使用量を示す理由を説明しています。
Verification
この動作を確認するには、 docker run コマンドまたは docker-compose.yml ファイルを使用してコンテナーにメモリ制限を適用します。 /sys/fs/cgroup/memory/docker// の cgroups に示されているように、制限に達するとコンテナーがメモリを再利用し、使用量を制限以下に維持することを確認します。
結論
pprof と docker stats によって報告されるメモリ使用量の違いは、docker にファイル I/O メモリが含まれることに起因します。統計と、メモリ制限が課されたときに cgroup によって実行されるメモリ再利用機構。これらの要素を理解することで、開発者はコンテナのメモリ消費量をより正確に把握できるようになります。
以上がGo pprof と Docker 統計で異なるメモリ使用量メトリクスが表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。