web-dev-qa-db-ja.com

ローカルディスクの読み取りと同時にLinuxにネットワークファイルシステムへの書き込みを行わせる

概要

ローカルディスク/ファイルシステムから読み取ると同時にネットワーク共有に書き込むようにLinuxを構成するにはどうすればよいでしょうか。ネットワーク経由でデータが送信されていないときに読み取りを行い、ローカルディスクが接続されている間にネットワーク経由でデータを送信するのではありません。アイドル?

1つの操作だけを実行してから、他の操作を交互に実行するのではなく、同時に読み書きを行う方がはるかに高速です。

詳細

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

私はrsyncを使用して、基本的に/srv/data/mnt/nasにコピーします。これはCIFSマウントです。

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

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

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

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

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

また、数秒ごとにsyncを手動で実行して、読み取りと並行して書き込みを行うこともできます(ただし、速度は低下します)syncwhileループに入れて、 5秒ごとに実行するのは適切な解決策ではないようです...

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

17
Malvineous

さらに調査した結果、この問題はカーネルに関連するものではなく、rsyncとCIFSがどのように相互作用するかについて詳しくなっているようです。

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

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

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

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

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

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

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

27
Malvineous