背景
私の質問は基本的にこれの続きです質問そして答え、特にこのコメント。
大量のファイルをコピーまたは rsync する必要がある場合は、システムのメモリがいっぱいになる傾向があるため、次のようなスクリプトを実行します (root として)。
while true ; do echo "syncing" && sync && echo 3 > /proc/sys/vm/drop_caches && echo "done" && sleep 60 ; done ;
質問
- これはシステムに何らかの損害を与えたり、悪影響を引き起こしたりする可能性がありますか? (特に、参照されたコメントで言及されている「リスク」とは何ですか?)
- 答えが「いいえ」の場合 (これが私の推測です)、Linux はなぜこのコマンドをデフォルトで自動的に実行しないのでしょうか? (これによって目立った変化は見られませんが、メモリが不足していないことに気付くだけです...)
答え1
キャッシュを削除することには何のメリットもありません。忘れることはメリットではありません。メリットはメモリの再利用にあり、これはいずれにせよ起こります。ある時点で、データはメモリから削除されます。
ただし、このような大規模なジョブを実行すると、パフォーマンスに悪影響を与える可能性があります。データがキャッシュされても再利用されない場合は、他のデータが削除され、メリットはありません。
したがって、キャッシュなしでジョブを実行する必要があります (残念ながら、これを行うコマンドは思い出せません)。
答え2
Linux はなぜキャッシュを自動的にクリアしないのですか?
それは。
ron> free -g
total used free shared buffers cached
Mem: 504 415 88 1 0 352
-/+ buffers/cache: 62 441
Swap: 0 0 0
キャッシュされたメモリは、依然として空きメモリとみなされる必要があります。
空き容量が 0 まで減ると、キャッシュから取得されます。
これはシステムに何らかの損害を与えたり、悪影響を引き起こしたりする可能性がありますか?
害はない。調べてecho 3 > /proc/sys/vm/drop_caches
みれば、それが非破壊的手術。
悪影響は、キャッシュにあったはずのものをディスクから読み取らなければならないことで生じるパフォーマンスの低下です。たとえば、10 GB のデータ ファイルを読み込む C プログラムを作成します。最初の実行はディスクから読み取るため遅くなりますが、そのデータ ファイルは RAM にキャッシュされるため、その後はずっと速くなります。キャッシュを削除すると、データ ファイルを読み取るプログラムの次回の実行は、最初の実行時と同様に遅くなります。これは簡単に観察でき、再現可能です。
答えが「いいえ」の場合、Linux はなぜこのコマンドをデフォルトで自動的に実行しないのでしょうか?
これが起こる場所と方法を詳しく説明する必要があります。RHEL/CentOS 7.7 などの現在の Linux では発生しません。ただし、古い Linux (3.x より前のカーネルなど) では、キャッシュが現在ほど堅牢ではなかった頃にディストリビューションによって行われた決定である可能性があります (私の意見では)。数年前に SLES 11.4 を使用していたとき、SuSE の人々がキャッシュの削除を自動的に行うコードを記述しなかったことはほぼ確実ですが、当時 SLES を購入した一部の作業用サーバーでは、定期的にキャッシュを削除するように crontab が実行されていたため、なぜこれが行われるのかは不明です。これは、ハウスキーピング = 良いという考え方であり、破壊的なコマンドではないため、実際には害にはならないと思われます。SLES echo 3 > drop_caches
11.4 で手動で実行した数回はトラブルシューティングのためであり、最終的に再起動が必要になるような問題は実際には解決されませんでした。
RHEL パフォーマンス チューニング ガイドと仮想メモリのチューニングを参照してください。これが RHEL 固有のものであるか、Linux カーネルに関連し Linux ディストリビューションに固有のものではないほど低レベルであるかはわかりません。また、カーネル 2.6 から 3.x、4.x に何が変更されたかは、この点で重要であることは間違いないので、Linux カーネルのリリース ノートを読むことを検討してください。