基本的な状況:
OpenSuSEでいくつかのNTFSディスクをコピーしています。それぞれ2TBです。これを行うと、システムの動作が遅くなります。
私の推測:
キャッシュが原因である可能性が高いと思います。 Linuxは、有用なキャッシュ(kde4 bloat、仮想マシンディスク、LibreOfficeバイナリ、Thunderbirdバイナリなど)を破棄し、代わりに、使用可能なすべてのメモリ(合計24 GB)をコピーディスクからのもので埋めることを決定します。その後、書かれ、二度と使用されません。したがって、これらのアプリ(またはkde4)を使用するときはいつでも、ディスクを再度読み取る必要があり、ディスクから膨張を再度読み取ると、問題がフリーズ/一時停止します。
キャッシュがなくなったことと、これらの肥大化したアプリケーションが大量のキャッシュを必要とするという事実のために、これはシステムをひどく遅くします。
USBであるため、ディスクとディスクコントローラーがボトルネックにならないため、ioniceを使用しても高速にはなりません。
マザーボードの速度が遅くなるだけでなく、キャッシュであると思います。すべてのコピーを停止すると、すべてを再キャッシュするまでしばらくの間、途切れ途切れになります。また、コピーを再開すると、再び途切れるまでに1分かかります。しかしまた、それを約40 MB/sに制限することができ、再び高速に実行されます(適切なものがキャッシュされているためではなく、マザーボードバスにシステムディスク用の余分な帯域幅がたくさんあるため)。マザーボードのIO機能が完全に消費されている(100%使用されている、つまり0%の無駄な電力で私を幸せにする)ことによるパフォーマンスの低下を完全に受け入れることはできますが、これを受け入れることはできません。この特定のユースケースでは、キャッシングメカニズムは非常にひどく機能します。
# free
total used free shared buffers cached
Mem: 24731556 24531876 199680 0 8834056 12998916
-/+ buffers/cache: 2698904 22032652
Swap: 4194300 24764 4169536
Ubuntuでも同じことを試しましたが、代わりにシステム全体がハングします。 ;)
そして明確にするために、私は「システム」のためにではなく「キャッシュ」のためにメモリを空けておく方法を尋ねています。キャッシュメモリは必要に応じて自動的にシステムに戻されることは知っていますが、私の問題は、特定のもののキャッシュ用に予約されていないことです。
質問:
これらのコピー操作にメモリ使用量を制限して、いくつかの重要なものがキャッシュされたままになるように指示する方法はありますか?したがって、速度低下は通常のディスク使用量の結果であり、同じ一般的に使用されるファイルを再読み取りしませんか?たとえば、キャッシュ/バッファとして使用できるプロセス/ユーザー/ファイルシステムごとの最大メモリの設定はありますか?
Nocacheコマンドは、この問題に対する一般的な答えです。 https://github.com/Feh/nocache を参照するか、DebianおよびUbuntu 13.10(saucy)で見つけてください。
Peter、rsyncの--drop-cache "オプションについて警告してくれてありがとう。しかし、これはより一般的な解決策を支持して、アップストリームで拒否されました( Bug 9560 – drop-cache option ) :rsyncに基づく新しい「nocache」コマンドはfadviseで動作します。
必要なコマンドの前に「nocache」を追加するだけです。また、ファイルのキャッシュステータスを記述および変更するためのNiceユーティリティもあります。例えば。 nocacheを使用した場合と使用しない場合の効果は次のとおりです。
$ ./cachestats ~/file.mp3
pages in cache: 154/1945 (7.9%) [filesize=7776.2K, pagesize=4K]
$ ./nocache cp ~/file.mp3 /tmp
$ ./cachestats ~/file.mp3
pages in cache: 154/1945 (7.9%) [filesize=7776.2K, pagesize=4K]\
$ cp ~/file.mp3 /tmp
$ ./cachestats ~/file.mp3
pages in cache: 1945/1945 (100.0%) [filesize=7776.2K, pagesize=4K]
したがって、他のバックアッププログラム(rsnapshot、duplicity、rdiff-backup、amanda、s3sync、s3ql、tarなど)や、キャッシュをゴミ箱に捨てたくない他のコマンドでも機能することを願っています。
Kristof Provostは非常に近かったのですが、私の状況では、ddを使用したり、独自のソフトウェアを作成したりしたくなかったため、解決策はrsyncで「--drop-cache」オプションを使用することでした。
この質問を作成してから何度もこれを使用しましたが、問題は完全に解決したようです。 1つの例外は、「-drop-cache」をサポートしていないFreeBSDマシンからコピーするためにrsyncを使用している場合でした。そこで、/ usr/local/bin/rsyncコマンドを置き換えるラッパーを作成し、そのオプションを削除すると、そこからのコピーも機能するようになりました。
それでもバッファに大量のメモリを使用し、キャッシュをほとんど保持していないようですが、とにかくスムーズに動作します。
$ free
total used free shared buffers cached
Mem: 24731544 24531576 199968 0 15349680 850624
-/+ buffers/cache: 8331272 16400272
Swap: 4194300 602648 3591652
カーネルは、キャッシュされたデータを再度コピーして使用しないことを認識できません。これはあなたの情報の利点です。
ただし、swappinessを0に設定することもできます:Sudo sysctl vm.swappiness = 0。これにより、ライブラリなどがスワップに書き込まれる前に、Linuxがキャッシュをドロップします。
私にとってもうまく機能します。特に、ヒューラム(16〜32 GB)と組み合わせると非常にパフォーマンスが高くなります。
dd
の代わりにcp
を使用してみてください。
または、mount
フラグが付いたファイルシステムをsync
します。
これらのメソッドがスワップをバイパスするかどうかは完全にはわかりませんが、試してみる価値があるかもしれません。
ちょうど私の2c。
いくつかのNTFSディスクをコピーしています[...]システムの動作が遅くなります。 [...] USBなので[...]
速度低下は 既知のメモリ管理の問題 です。
新しいLinuxカーネルを使用してください。古いものは、USBデータと「透過的な巨大ページ」に問題があります。これを参照してください LWNの記事 。ごく最近、この問題が解決されました。 LinuxChanges の「メモリ管理」を参照してください。
さて、あなたがrsync
を使用していることがわかったので、もう少し掘り下げることができます。
大量のファイルを同時に使用すると(== --- ==)、rsyncは効果がないようです、 彼らのFAQ にエントリがあります。 Linux /キャッシュの問題ではなく、RAMを使いすぎるrsyncの問題です。
グーグルアラウンド 同期を複数のrsync
呼び出しに分割することをお勧めします
それが役に立てば幸い。