カーネル空間でメモリリークが発生したようです。 slabは、kmalloc-4096がシステム内のすべてのRAMリソースを排他し、スワッピングを強制するまで均等に成長することを示しています。
Free はほとんどのメモリ使用量をキャッシュとしてマークしますが、手動クリアとしてマークされていても、必要に応じて解放を拒否します。私たちが見たものの例:
$ sudo su -c "free -h && sync && echo 3 > /proc/sys/vm/drop_caches && free -h"
total used free shared buff/cache available
Mem: 15G 4.4G 166M 280M 10G 104M
Swap: 15G 7.8G 8.1G
total used free shared buff/cache available
Mem: 15G 4.4G 186M 280M 10G 115M
Swap: 15G 7.8G 8.1G
漏れ位置を確認するためにkmallocを分析する必要がありますか?では、どうすればよいですか?
これは、Intel i5 SkylakeにインストールされているUbuntu 16.04のデフォルトバージョンです。
$ uname -a
Linux fire 4.4.0-78-generic #99-Ubuntu SMP Thu Apr 27 15:29:09 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
答え1
「同期」はバッファ/キャッシュを減らすことなくブロックデバイスにデータを要求します。キャッシュの要点は、データがRAMキャッシュに残っていることです。 drop_cachesに3を送信しても、キャッシュが削除されるのを待ちません。 「無料」の前に「60分睡眠」を追加できますか?これにより、アイドル状態を報告する前にメモリを消去するのに少し時間がかかることがあります。
「watch -n60 cat /proc/meminfo」をそのままにしておくとメモリ領域を増やすことができますが、キャッシュとバッファは別々のリークではなく、メモリを消費することで目的を達成し、システムの空き容量リソースを最大限に活用します。
プロセスがディスクに置き換えられても、自動的に悪いことが起こったという意味ではありません。プロセスがすべてのページを使用せずにアイドル状態の場合、カーネルは正しい操作を実行しています。これにより、Webサーバーでmuttのコピーが実行され続ける前に、wwwルートの内容が必要になる可能性が高くなります。たとえば、ユーザーがGNU画面からログアウトしたときです。
それでもカーネルがモジュールを介してRAMを消費していると思われる場合は、次のコマンドを使用してさらに確認できます。
awk '{ print $2" "$1 }' /proc/modules | sort -n
ZFSを使用していますか?これはRAMを大量に消費しますが、キャッシュと同様に必要な場合に備えてディスクIOをRAMに保持しようとします。