32G RAMがインストールされ、16Gスワップが構成されたDebian 4.0.5(カーネル4.0.0-2)を実行しているLinuxサーバーがあります。システムは区画化にlxcコンテナーを使用しますが、それは問題ではありません。この問題は、さまざまなコンテナの内外に存在します。
これが典型的なfree -h
です:
total used free shared buff/cache available
Mem: 28G 2.1G 25G 15M 936M 26G
Swap: 15G 1.4G 14G
/proc/meminfo
は
Committed_AS: 12951172 kB
したがって、割り当てられたすべてが実際に一度に使用された場合でも、十分な空きメモリがあります。ただし、システムは実行中のプロセスでも即座にページングします。
これはGitlabで最も顕著であり、Rails Unicornを使用するアプリケーション:新しくフォークされたUnicornワーカーは即座に交換され、リクエストが発生すると、ディスクから最大1400kB/sで読み取る必要があります(からのデータiotop
)そしてタイムアウト(今のところ30秒、時間内に再起動するため。通常のリクエストは5秒以上かかることはありません)に達してから完全にメモリにロードされるため、即座に強制終了されます。これはただのことです。例として、これがredis、amavis、postgres、mysql、Java(openjdk)などで発生するのを見てきました。
それ以外の場合、システムは低負荷の状況にあり、CPU使用率は約5%、負荷は約2(8コア)です。
私たちが試したこと(順不同):
swapoff -a
:約800Mで失敗しますがまだスワップされていますsysctl vm.swappiness=NN
を使用してswappinessを(段階的に)削減します。これはまったく影響がないようです。0%まで下げましたが、それでもまったく同じ動作が存在します。sync && echo 3 > /proc/sys/vm/drop_caches
を使用してシステムキャッシュをクリアします。これによりメモリが解放されますが、スワップの状況には何の影響もありません。一部のサービスには可用性の問題があり、「突っつい」ではなく計画的なダウンタイムが必要なため、テストとしてfstabを介してスワップを完全に無効にするためにマシンを再起動することは実際にはオプションではありません...また、スワップを無効にしたくない場合もあります。後退する。
ここでスワッピングが発生している理由がわかりません。何が起こっているのか考えはありますか?
この問題はしばらく前から存在していましたが、IO負荷(長いバックグラウンドデータ処理タスク)の高い期間に最初に発生したため、特定のイベントを特定できません。このタスク数日間行われ、問題が解決しないため、この質問があります。
私が言ったことを覚えておいてください:
システムは区画化にlxcコンテナーを使用しますが、ここでは問題になりません。
さて、それはdidの問題であることがわかりました。むしろ、lxcの中心にあるcgroupが重要です。
ホストマシンは、カーネルアップグレードの再起動のみを認識します。では、最後に使用されたカーネルは何でしたか? 3.19、2か月前は4.0.5に、昨日は4.1.3に置き換えられました。そして、昨日何が起こったのですか?左、右、中央を巧みに操るプロセス。 /var/log/kern.log
を確認すると、影響を受けたプロセスは512Mのメモリを持つcgroupにありました。待って、512M?それは正しくありません(予想される要件が約4Gの場合!)。結局のところ、これは、数か月前にこれをすべて設定したときにlxcconfigsで構成したものとまったく同じです。
つまり、3.19はcgroupのメモリ制限を完全に無視したということです。 4.0.5は、cgroupが許可されている以上のものを必要とし(これがこの質問の中心的な問題です)、4.1.3のみが完全なmemkiller-sweepを実行する場合に常にページングされます。
ホストシステムのswappinessは、物理メモリが不足することはほとんどなかったため、これには影響しませんでした。
一時的な変更の場合、cgroupを直接変更できます。たとえば、box1
という名前のlxcコンテナーの場合cgroupはlxc/box1
と呼ばれ、(ホストマシンのrootとして)実行できます。
$ echo 8G > /sys/fs/cgroup/memory/lxc/box1/memory.limit_in_bytes
永続的な解決策は、/var/lb/lxc/...
でコンテナーを正しく構成することです。
lxc.cgroup.memory.limit_in_bytes = 8G
ストーリーのモラル:常に構成を確認してください。それが問題になる可能性はないと思っていても(そして実際に失敗するには、カーネル内の別のバグ/不整合が必要です)。