Linuxでローカルディスクの読み取りと同時にネットワークファイルシステムに書き込む


17

概要

Linuxを構成して、ローカルディスク/ファイルシステムからの読み取りとネットワーク共有への書き込みの両方を同時に行うことができます。アイドル?

1つの操作だけを実行してから、もう1つの操作を交互に実行する代わりに、読み取りと書き込みを同時に行う方がはるかに高速です。

詳細

LinuxマシンのローカルディスクからNASデバイスに大量のデータを移動しています。

rsync基本的に、CIFSマウントであるにコピー/srv/dataするために使用しています/mnt/nas

最初は100MB /秒で読み取り、100MB /秒(ギガビットネットワークの制限)でNASに書き込み、読み取りと書き込みの両方が同時に行われました。

しかし、数時間後、ローカルディスクから読み取りを行っていることがわかり、NASに書き込み中に読み取りを停止し、NASに書き込むデータがなくなると、ディスクから読み取りを再開します再び。ディスクの読み取り中はネットワークがアイドル状態になり、ネットワークの使用中はディスクがアイドル状態になります。

言うまでもなく、200MBを読み取ってから200MBを書き込むと、その200MBを同時に読み書きするよりもはるかに時間がかかります。

一度に1つの操作だけを実行して読み取りと書き込みを交互に行うのではなく、読み取りと書き込みの以前の動作を同時に維持するようにカーネルを構成するにはどうすればよいですか?

いくつかの観察:ローカルディスクが100 + MB / secで読み取る場合、すべてが並行して正常に行われているように見えますが、ディスクがスローダウンすると(何らかの理由で20MB / secだけになっているようです)、この読み取り/書き込みは切り替えが発生するようです。

私はまた、実行することができますsyncが入れて書き込みが(減少速度で明らかにかかわらず)読み込みと並行して起こって取得するには、手動で数秒ごとsyncwhileそれが正しい解決策のように見えるしていません5秒ごとに実行されるようにループを...

カーネルは約1GBのデータをキャッシュし、ネットワーク上で可能な限り高速に書き込みます-これは問題ありません-データの送信中に低速ディスクの読み取りを停止する必要がある理由がわかりません通信網。


1
ほとんどのUNIXツールは、この意味で帯域幅に対して最適化されておらず、rsyncでも、単純なcpでもありません。これらは、ブロッキングIOを使用するシングルスレッドアプリです。
peterh -復活モニカ

1
100 MB / s前後は、純粋にシーケンシャルなワークロードの最新の一般的な7200 rpm回転HDDで見られるものです。メタデータの更新やファイルシステムの断片化などのためにシークを開始すると、IOPSにバインドされるためダウンします。
CVn

NASにrsyncをインストールできますか?
ジェイセン

回答:


27

さらなる調査の結果、この問題はカーネル関連ではなくrsync、CIFSの相互作用の方法についての詳細であるようです。

私が知る限りrsync、宛先ファイルを閉じると、CIFS(およびおそらくすべてのネットワークファイルシステム)は、closesyscallが戻る前にファイルが完全にフラッシュされ、リモートディスクに書き込まれることを確認しています。これは、クローズ操作が正常に完了すると、ファイルが完全に保存され、データ損失を引き起こす可能性のあるその他のエラーのリスクがないことをアプリケーションに保証するためです。

これが行われなかった場合、アプリケーションがファイルを閉じ、保存操作が成功したと考えて終了し、後で(おそらくネットワークの問題が原因で)データを書き込むことができませんでしたが、ユーザーがファイルを別の場所に保存するかどうかをユーザーに尋ねるなど、アプリケーションがそれについて何もするのは遅すぎます。

この要件はrsync、ファイルのコピーが終了するたびにrsync、次のファイルの読み取りを続行する前に、ネットワーク全体でディスクバッファー全体が空になる必要があることを意味します。

回避策は、cache=noneこの機能を無効にし、すべてのI / Oをサーバーに直接送信するオプションを使用してCIFS共有をマウントすることです。これにより問題が解消され、読み取りと書き込みを並行して実行できるようになりますが、このソリューションの欠点はパフォーマンスが多少低下することです。私の場合、ネットワーク転送速度は110MB /秒から80MB /秒に低下します。

これは、大きなファイルをコピーしている場合、読み取り/書き込みを交互に行う方がパフォーマンスが向上する可能性があることを意味します。多くの小さいファイルでは、キャッシュを無効にすると、ファイルを閉じるたびにキャッシュフラッシュが少なくなり、パフォーマンスが向上する場合があります。

rsync別のスレッドでファイルハンドルを閉じるオプションが必要と思われるため、最後のファイルがまだフラッシュされている間に次のファイルの読み取りを開始できます。

編集:cache=noneたくさんの小さなファイルを転送するとき(10MB /秒から80MB /秒まで)に間違いなく役立つが、大きなファイル(1GB +)をcache=none転送するときは110MB /秒から同じ80MB /秒に転送が落ちることを間違いなく確認しました。これは、多くの小さなファイルからの低速転送がソースディスクシークに関するものではなく、すべての小さなファイルからの非常に多くのキャッシュフラッシュを持つことを示唆しています。


2
それは非常に興味深い問題であり、説明を投稿してくれてありがとう。読んで、の一つのコピーがなるように設計されていますので、別のスレッド(実際には、異なるプロセス)内のファイルをあなたのケースで両方のコピーが同じ側にあるにもかかわらず、ネットワークの各側で実行されている(とファイルシステムが隠れていますネットワークがあるという事実)。ライタープロセスがをブロックしている間にリーダープロセスが非常に迅速にパイプを埋めるので、それは役に立たないと思います。CIFSではなく有線で使用している場合のパフォーマンスが向上します。rsyncrsyncclose()rsyncrsync
セラダ

1
rsyncNASで実行できない別の解決策はrsync、ネットワーク経由で(rsync -a files localhost:/dest/pathたとえば)ネットワーク経由で使用し、何らかの方法で巨大なバッファー(少なくともマルチメガバイトなど)をネットワーク接続に導入することです。それを行うための最良のハックがどのようになるかはわかりません。
セラダ

@セラダ:ありがとう!はいrsync、NASボックス自体で実行すると、この問題も回避できると思います。少し複雑ですが(NASの奇妙なアクセス許可、シンボリックリンクのドロップなど)、コピーするデータがもう少しあれば、時間をかける価値があると思います。
Malvineous 16

2
おそらくあなたのケースとは無関係です:数年前dump(8)に、NFS上にマウントされたNASに出力を書き込むのと同様の問題がありました。当時、NFSサーバーとNASで実行されているファイアウォールの複合効果のために、NASのCPUが最大になると問題を診断しました(ボックスはルート化されておらず、ファイアウォールを完全に無効にできませんでした) Webインターフェース)。NASを古いPCに交換すると、問題はなくなりました。FWIW。
桂佐藤

@SatoKatsura:確かに古いNASデバイスの可能性はありますが、その場合、このようなバースト的な転送よりも全体的な転送が遅くなると思いますか?私のNASはデュアルコアAtom(〜2GHz)であり、ジャンボフレームなしで1つのギガビットNICを最大化するとCPU使用率が約30%になりますので、大丈夫です。
Malvineous 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.