25

基本的な状況:

openSUSEでいくつかのNTFSディスクをコピーしています。それぞれが2TBです。これを行うと、システムの動作が遅くなります。

私の推測:

キャッシングが原因である可能性が高いと思います。Linuxは、有用なキャッシュ(KDE 4 bloat、仮想マシンディスク、LibreOfficeバイナリ、Thunderbirdバイナリなど)を破棄し、代わりに、読み取り専用になるコピーディスクからのすべての使用可能なメモリ(合計24 GB)を埋めることを決定します。一度、それから書かれ、二度と使われることはありません。したがって、これらのアプリケーション(またはKDE 4)を使用するときはいつでも、ディスクを再度読み取る必要があり、ディスクから膨張を再度読み取ると、フリーズ/一時的な中断が発生します。

キャッシュがなくなったことと、これらの肥大化したアプリケーションが大量のキャッシュを必要とするという事実のために、これはシステムをひどく遅くします。

USBであるため、ディスクとディスクコントローラーはボトルネックではなく、ioniceを使用しても高速にはなりません。

マザーボードの速度が遅くなるだけでなく、キャッシュであると思います。すべてのコピーを停止しても、すべてを再キャッシュするまでしばらくの間、途切れ途切れになります。

また、コピーを再開すると、再び途切れるまでに1分かかります。しかしまた、それを約40 MB / sに制限することができ、再び高速に実行されます(適切なものがキャッシュされているためではなく、マザーボードバスにシステムディスク用の余分な帯域幅がたくさんあるため)。マザーボードのI/O機能が完全に消費されることによるパフォーマンスの低下を完全に受け入れることはできますが(これは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でも同じことを試しましたが、代わりにシステム全体がハングします。;)

そして明確にするために、私は「システム」のためにではなく、「キャッシュ」のためにメモリを空けておく方法を求めています。キャッシュメモリは必要に応じて自動的にシステムに戻されることは知っていますが、私の問題は、特定のもののキャッシュ用に予約されていないことです。

これらのコピー操作にメモリ使用量を制限して、いくつかの重要なものがキャッシュされたままになるように指示する方法はありますか?したがって、速度低下は通常のディスク使用量の結果であり、同じ一般的に使用されるファイルを再読み取りしませんか?たとえば、キャッシュ/バッファとして使用できるプロセス/ユーザー/ファイルシステムごとの最大メモリの設定はありますか?

4

8 に答える 8

27

nocacheコマンドは、この問題に対する一般的な答えです。DebianとUbuntu13.10(Saucy Salamander)にもあります。

Peter、rsyncの--drop-cache "オプションについて警告してくれてありがとう。しかし、これはより一般的な解決策である新しい" nocache "コマンドを支持して、アップストリームで拒否されました(バグ9560 – drop-cacheオプション)。 fadviseとのrsync作業に基づいています。

必要なコマンドの前に「nocache」を追加するだけです。また、ファイルのキャッシュステータスを記述および変更するための優れたユーティリティもあります。たとえば、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など)や、キャッシュを破棄したくない他のコマンドでも機能することを願っています。

于 2013-12-28T18:16:06.597 に答える
3

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
于 2012-05-10T13:33:09.027 に答える
2

カーネルは、キャッシュされたデータを再度コピーする際に使用しないことを認識できません。これはあなたの情報の利点です。

ただし、swapinessを0に設定することもできます:sudo sysctl vm.swappiness=0。これにより、ライブラリなどがスワップに書き込まれる前にLinuxがキャッシュをドロップします。

それは私にとってもうまく機能し、特に大量のRAM(16-32 GB)と組み合わせると非常にパフォーマンスが高くなります。

于 2012-12-31T14:38:18.680 に答える
1

プレーンオールドを使用している場合は不可能ですcpが、自分で再実装またはパッチを適用する場合はposix_fadvise(fd, 0, 0, POSIX_FADV_NOREUSE)、入力ファイルと出力ファイルの両方を設定すると役立つ可能性があります。

posix_fadvise()意図したアクセスパターンについてカーネルに通知します。この場合、データは1回しか使用しないため、データをキャッシュしても意味がありません。Linuxカーネルはこれらのフラグを尊重するため、データをキャッシュする必要はありません。

于 2012-04-11T12:06:44.443 に答える
1

ddの代わりに使用してみてくださいcp

または、フラグmountが設定されたファイルシステム。sync

これらの方法がスワップをバイパスするかどうかは完全にはわかりませんが、試してみる価値があるかもしれません。

于 2012-04-11T12:10:40.433 に答える
1

一部のNTFSディスクをコピーしています[...]システムの動作が遅くなっています。[...]USBなので[...]

速度低下は、既知のメモリ管理の問題です。

新しいLinuxカーネルを使用してください。古いものはUSBデータと「透明な巨大なページ」に問題があります。このLWNの記事を参照してください。ごく最近、この問題が解決されました。LinuxChangesの「メモリ管理」を参照してください。

于 2012-04-11T17:26:41.047 に答える
1

実質的に2つの選択肢があります。

  1. 最大ディスクバッファサイズを制限します。発生している問題は、ディスクバッファリングに大量のRAMを使用できるデフォルトのカーネル構成が原因である可能性があり、非常に遅いデバイスに大量のメモリを書き込もうとすると、終了します。ディスクキャッシング用の貴重なRAMを大量に使用して、デバイスの速度を低下させます。

    カーネルがこれを行うのは、プロセスが遅いデバイスによって速度が低下していなくてもプロセスが処理を続行できること、および必要に応じてストレージにページを書き込むだけでRAMを自動的に解放できることを前提としているためです(遅いUSBスティック-カーネルそのプロセスの実際のパフォーマンスは考慮されません)。クイックフィックス:

     # Wake up background writing process if there's more than 50 MB of dirty memory
     echo 50000000 > /proc/sys/vm/dirty_background_bytes
     # Limit background dirty bytes to 200 MB (source: http://serverfault.com/questions/126413/limit-linux-background-flush-dirty-pages)
     echo 200000000 > /proc/sys/vm/dirty_bytes
    

    ディスク書き込みキャッシュに使用するRAMに一致するように数値を調整します。賢明な値は、RAMの量ではなく、実際の書き込みパフォーマンスに依存します。デバイスの完全な書き込みパフォーマンスを可能にするために、キャッシュに必要なRAMをほとんど持たないようにする必要があります。これはグローバル設定であるため、使用している最も遅いデバイスに応じて設定する必要があることに注意してください。

  2. 高速で続行するタスクごとに最小メモリサイズを予約します。実際には、これは、cgroup気になるもののを作成し、そのようなグループに必要な最小メモリを定義することを意味します。そうすれば、カーネルは残りのメモリを適切と思われるときに使用できます。詳細については、次のプレゼンテーションを参照してください。SREcon19 Asia / Pacific-大規模なLinuxメモリ管理:内部

于 2021-01-04T09:27:47.673 に答える
0

さて、あなたが使用していることがわかったのでrsync、もう少し掘り下げることができます:

大量のファイルを同時に使用すると、rsyncは効果がないようです。彼らのFAQにエントリがあり、それはLinux/キャッシュの問題ではありません。これは、RAMを使いすぎるrsyncの問題です。

誰かの周りをグーグルで検索して、同期を複数の呼び出しに分割することをお勧めしrsyncます。

于 2012-04-11T12:54:09.283 に答える