たとえば、数GBのファイルをアーカイブするとき(tarを使用)、Linuxは多くのディスクキャッシュ(および一部のスワップ)を使用しますが、操作が完了した後はクリーンアップしません。その結果、利用可能なメモリがないため、Linuxはメモリ内の何かを交換しようとし、これによりCPUに追加の負荷が発生します。
もちろん、 を実行してキャッシュを消去することはできますが、echo 1 > /proc/sys/vm/drop_caches
そうする必要があるのは愚かではありませんか?
さらに悪いことに、スワップの場合は使用しないスワップをクリーンアップするコマンドがないため、完全に無効/有効にする必要がありますが、これはまったく安全ではないと思います。
修正する:
いくつかのテストを行った結果、いくつかの事実が見つかりました。
archiveコマンド中にスワップアウトされたメモリページは、アーカイブファイルとは無関係であり、スワップの可能性に応じて利用可能なメモリが減って発生する一般的なスワッププロセスのように見えます(ディスクキャッシュがすべて食い詰まるため)。
実行するのは本当に安全です
swapoff -a
。つまり、スワップされたページがメモリに戻されることを意味します。
-m
現在のソリューションは、cgroupを介してアーカイブコマンドのメモリ使用量を制限することです(フラグ付きのdockerコンテナを実行します)。 dockerを使用しない場合は、別のプロジェクトがありますhttps://github.com/Feh/nocacheこれが役に立ちます。
残りの質問はLinuxはいつディスクキャッシュを消去しますか?起こりますか?そうでない場合は、echo 1 > /proc/sys/vm/drop_caches
ディスクキャッシュ()を手動で消去するのが良い習慣ですか?
答え1
Nitpicky:交換に費やされるCPU時間は通常重要ではありません。交換中にシステムがゆっくり反応する場合、一般的な問題は次のとおりです。ディスク時間。
(1) 悪いことは、スワップの場合、未使用のスワップをクリーンアップするコマンドがないことです。
スワップされたメモリをトリガして再読み込みするのを待つには、スワップを無効にして有効にすることが効果的で安全な技術です。私は「未使用のスワップをクリーンアップすること」が正しい説明ではないと言いたいと思います。これはあなたがしたいことではありません。
スワップ使用量が予想よりも高くなることがありますが、これが使用されていないという意味ではありません。メモリページはRAMとスワップの両方に保存できます。これにはそのような理由があります。
スワップページを再読み込みすると、特に削除されずに追跡され続けます。これは、ページを再置き換えする必要があり、交換が作成されてからページが変更されていない場合は、ページを書き換える必要がないことを意味します。
linux-tutorial.infoでもこれについて説明します。メモリ管理 - スワップキャッシュ
メモリ内のページが変更または解放されると、スワップ領域のページコピーは自動的に解放されます。
システムに比較的限られたスワップスペースと多くのRAMがある場合は、ある時点でスワップスペースからページを削除する必要があります。これは自動的に発生します。 (カーネルコード:linux-5.0/mm/swap.c:800)
(2)残りの質問は、Linuxがディスクキャッシュをいつ消去するのか、そして消去するのかということです。それ以外の場合は、ディスクキャッシュを手動でクリーンアップするのが良い方法ですか(echo 1> / proc / sys / vm / drop_caches)?
Linuxは要求に応じてディスクキャッシュをクリーンアップします。メモリが必要な場合は、非アクティブディスクキャッシュページが削除されます。
値を変更すると、非アクティブ・/proc/sys/vm/swappiness
ファイル・キャッシュのリカバリーと非アクティブな「匿名」(スワップ・サポート)プログラム・メモリーのリカバリーの間のバイアスを変更できます。既定値はすでにスワッピングに向かって偏っています。必要swappiness
に応じて、システムはこの値をさらに下げることができます。これが何をしているのかを考えたい場合は、swappiness
次の例を参照してください。戻る:ファイルがキャッシュされる前にtmpfsがスワップされるようにするか、強制する
Linuxは要求時にディスクキャッシュを削除するため、通常は使用をお勧めしませんdrop_caches
。主にテスト目的で使用されます。 ~によると公式文書:
このファイルは、さまざまなカーネルキャッシュ(inode、ディレクトリエントリ、ページキャッシュなど)の増加を制御する手段ではありません。これらのオブジェクトは、システムの他の場所でメモリが必要な場合にカーネルによって自動的に回収されます。
このファイルを使用すると、パフォーマンスの問題が発生する可能性があります。キャッシュされたオブジェクトを削除するため、削除されたオブジェクトを再生成するために多くのI / OとCPUが必要になることがあります。したがって、テスト環境やデバッグ環境の外部で使用することはお勧めできません。
答え2
これは予想される動作です。以下を使用してスワップ使用量を調整できます。仮想マシンの切り替え可能性sysctlを見つけてニーズに合わせて調整してください。