web-dev-qa-db-ja.com

Linuxがディスクキャッシュをクリーンアップして自動的にスワップしないのはなぜですか?

たとえば、(tarを使用して)数ギガのファイルをアーカイブすると、Linuxはかなりの量のディスクキャッシュ(および一部のスワップ)を使用しますが、操作が完了したときにそれをクリーンアップすることはありません。その結果、空きメモリがないため、Linuxはメモリから何かをスワップアウトしようとし、CPUに追加の負荷をかけます。

もちろん、echo 1 > /proc/sys/vm/drop_cachesを実行することでキャッシュをクリーンアップできますが、それを実行する必要があるのは愚かなことではありませんか?

スワップの場合はさらに悪いことに、未使用のスワップをクリーンアップするコマンドはありません。完全に無効/有効にする必要がありますが、これは安全な方法ではないと思います。

UPD:

私はいくつかのテストを実行し、いくつかのことを発見しました:

  1. アーカイブされたファイルとは関係のないアーカイブコマンド中にスワップアウトされたメモリページは、swappinessによると(ディスクキャッシュがすべてを食べたため)空きメモリが減少したために発生した通常のスワップアウトプロセスのようです

  2. swapoff -aの実行は実際には安全です。つまり、スワップされたページはメモリに戻ります。

私の現在の解決策は、cgroupsを介してアーカイブコマンドのメモリ使用量を制限することです(Dockerコンテナを-mフラグで実行します)。 dockerを使用しない場合は、役立つプロジェクトがあります https://github.com/Feh/nocache

残りの質問は、Linuxがディスクキャッシュをクリーンアップするのはいつですか?そうでない場合は、ディスクキャッシュを手動でクリーンアップすることをお勧めします(echo 1 > /proc/sys/vm/drop_caches) ?

1
csandanov

これは予想される動作です。 vm.swappiness sysctlを使用してスワップの使用量を調整し、必要に応じて調整できます。

2
Dolapevich