web-dev-qa-db-ja.com

長時間実行されているプロセスからのログによるDockerデーモンのメモリリーク

次の設定があります。

  1. コンテナーで実行され、STDERRにログアウトするPerlサービス
  2. logspout これらのログをアーカイブ用のリモートサーバーに送信する

600 MB RAMマシン。

また、定期的にログを切り捨てます。

/var/lib/docker/containers/CID/CID-json.log

提案通り here 100%のディスクシナリオを回避します。

問題

Dockerデーモンは、メモリ使用量が少ない状態で起動します。最初は1%でしたが、コンテナを実行してから2日後にゆっくりと40%に増えました。

参照

Dockerデーモンのメモリリークが この問題 および この問題 で説明されています。しかし、それらは両方ともコミット時にマージされたと現在閉じられています。 docker(Dockerバージョン1.4.0、ビルド4595d4f)の最新のメジャーバージョンを実行していますが、メモリ使用量の問題が単調に増加しています。

編集:私はこの実験をしました:コンテナでbashプロセスを実行し、多くの行をSTDERRに出力し、ドッカーデーモンプロセスのメモリ使用量が非常に速く加速します

Dockerはいくつかの log buffering を実行し、基になるログファイル(/var/lib/docker/containers/CID/CID-json.log)クリアされましたか?

どうやら 方法はありません ログをクリアする方法があります。 this commit 長時間実行タスクのこの問題を解決しますか?

なぜdockerデーモンのメモリ使用量が増え続けるのかわかりません。この問題をデバッグするにはどうすればよいですか?

25
alpha_cod

ログのメモリリークに関連する未解決の問題が少なくとも1つあります: https://github.com/docker/docker/issues/9139

2
mhsmith

これはあなたが探しているものではないかもしれませんが、私は通常cronジョブを実行して、毎日一定の時間が経過した後にコンテナを再起動します。これにより、コンテナーに常に十分なRAM=が確保されます。また、コンテナーを作成するときに、コンテナーによる最大RAM使用量を制限します。

コンテナーが再起動してデータを提供するのに数秒しかかかりません。高可用性サービスを実行しておらず、数秒のダウンタイムを許容できる場合は、コンテナーの再起動を検討してください(永続的なボリュームがないと想定)。

ただし、問題の解決策が見つかった場合はお知らせください。

0
Sohail