私は、Docker (v20.10.12) コンテナーが稼働している Ubuntu 18.04 サーバーを実行しています。一度に約 5 つのコンテナーが稼働しており、通常約 1.5 GB のメモリを消費しますが、サーバーには 8 GB のメモリが使用可能です。これらの 5 つのコンテナーのうちの 1 つが 18 ~ 24 時間ごとにメモリ リークを起こし、残りのメモリをすべて消費し、約 4 ~ 5 GB のスワップを占有します。これにより、CPU とディスクの使用率が 100% に急上昇し、その結果、OOM キラーが生成されてプロセスの除去が開始されますが、その 1 つが dockerd です。
dockerd が強制終了された後、メモリ リークが発生したコンテナのログを見つけることができません。ファイル システムにあるのは、dockerd の再起動後に生成されたコンテナのログだけだからです。そのため、ログがないと、そのコンテナで実際に何が起こったのかまったくわかりません。これこそまさに私が探しているものです。
どのコンテナがリークしたかを把握しgrep VmPeak /proc/{PID}/status
、 で PID を取得しましたdocker inspect -f '{{.State.Pid}}' {CONTAINER_ID}
。これには、1 つのケースで最大 11 GB のメモリ使用量がリストされていました。しかし、 に移動して/var/lib/docker/containers/
すべてのフォルダーを確認したところ、実際の OOM キラー スワイプと dockerd 再起動時間より前のログは何もありませんでした。 も確認してみましたvar/log/syslog
が、OOM キラーが動作し、dockerd がさまざまなネットワーク エラーやファイアウォール エラーでパニック状態になっていることしか表示されませんでした。私が間違っていて、syslog を詳しく調べる必要がある場合は、お知らせください。
必ずしもこれらのログを取得する必要はありませんが、ログを別の場所に保存して、次回クラッシュしたときに確認できるようにする別のソリューションを設定するための支援も非常に役立ち、問題を解決できる可能性があります。ただし、これは現在の問題とは関係がないため、無視されることは理解しています。