web-dev-qa-db-ja.com

大量のデータをコピーするときの転送速度の低下

2台のHDDと各ディスクにいくつかのパーティションがあるUbuntu 16.04.3 LTSシステム(4.10.0-40-generic)を使用しています。 2つのディスク間でデータ(<5GB)をコピーすると、約70 MB/sの転送速度が得られます。ただし、1つのディスクから別のディスクに大量のデータ(> 30GB)をコピーしようとすると、パフォーマンスの問題がいくつか発生します。

私の質問は、この動作が正常であり、Linuxシステムで予想されるものかどうかです。
誰も私にこれを説明し、このパフォーマンスの低下を回避する方法をアドバイスできますか?

以下に私の観察結果を説明します。この例では、54GBのディスクイメージファイルをsda8(325 GBパーティション)からsdb8(1.6TBパーティション)にコピーしました

1)転送速度が低下し、iowaitが増加します
50 GBを超えてコピーしようとすると、転送速度が徐々に低下することがわかります。視線、atop、iotop、iostatを使用してパフォーマンスを監視しています。 30GBの進行では、転送速度は58 MB /秒に低下し、46 GBから36MB /秒、52GBから12 MB /秒に低下しました。その後、転送速度は実際に変動し始め、1MB /秒未満に低下します。同時に、iowaitが最初の0%から最後の62%まで増加していることがわかります。ディスクのコピー中、sd8の「ビジー」パーセンテージは40%〜60%です。ディスクsdbは常に100%ビジーです。転送速度が低下するだけでなく、システムの応答性も低下します。 iowaitが原因であることを期待しています。
これは通常の動作ですか?パフォーマンスの低下をどのように回避できますか?

2)IOwaitはコピー後も高いままです
コピーが終了すると、iowaitがまだ高く、徐々に通常の値に減少し始めていることに気付きます。これには数分かかります。その間、データはまだ1または2 MB/s程度の速度でsdbに書き込まれていると思います。 iotopを使用すると、プロセス「jdb2/sdb4-8」がこのディスク書き込みを引き起こしているように見えます。 IOwaitが減少している間、私のシステムは依然として応答性が悪いです。また、ディスクsdaはもうビジーではないが、ディスクsdbは100%のビジーで動作していることがわかります。
コピー操作後、数分間システムの応答性が低下する原因は何ですか?
これは回避できますか?

)ネットワークドライブからコピーすると効果が上がります
Synology NASからローカルディスク(sdb8)にコピーしようとすると、効果はさらに悪化します。最初にネットワークドライブがシステムにマウントされ、次にコピーが開始されます。最初は70MB/sの転送速度も実現されますが、転送速度の低下はより速くなければなりません。数GB後、転送速度は1 MB /秒を大きく下回りました。 Nautilusからのドラッグアンドドロップ、コマンド「cp」、コマンドrsync、FreeFileSyncアプリケーションを使用してコピーを試みましたが、すべてパフォーマンスが低下していました。
ネットワークドライブを使用すると、パフォーマンス低下の影響が悪化する原因は何ですか?

追加情報
コピー中に「iostat -dx 5」を使用して、ディスクのパフォーマンスを監視しました。約5 GBのコピーの進行状況の監視は以下を示します。

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00     0,00  530,40    0,00 68064,80     0,00   256,65     1,62    3,06    3,06    0,00   1,63  86,72
sdb               0,00 18767,20    0,20  112,40    23,20 73169,60  1300,05   144,32 1345,39  308,00 1347,23   8,88 100,00

コピーが約52 GBに進行すると、次のように表示されます。

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00     0,00   64,60    0,00  8268,80     0,00   256,00     0,22    3,41    3,41    0,00   1,76  11,36
sdb               0,00  1054,40    0,20   10,60     6,40  6681,60  1238,52   148,56 9458,00    0,00 9636,45  92,59 100,00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00     0,00   50,20    0,00  6425,60     0,00   256,00     0,16    3,09    3,09    0,00   1,64   8,24
sdb               0,00  2905,80    0,40   17,00     8,80 10289,60  1183,72   141,86 10199,77  652,00 10424,42  57,47 100,00

これらは複数の質問であることを認識していますが、これらはすべて同じ原因に関連していると思われ、誰かがこれを明確にしてくれることを願っています。

7
user3074126

残念ながら、これは正常な動作であり、大きなファイルの使用例では予想されます。 2台のハードディスクと50G +ファイルの場合は、「遅いデバイス」、「遅いバス」、「遅いファイルシステム」という多くの誤解を招く話を排除し、コピーが遅いという説明のつかない問題が残ります。 30Gファイルのパフォーマンスを得るには、かなりのメモリが必要です。システムバッファーが使用され、いっぱいになり、コピーコマンドが終了すると、最終的にターゲットにフラッシュされ、実際のタイミング/レートが多少難しくなります(バッファーが最終的にフラッシュされるずっと前に「time」コマンドも終了します)。

私が見つけた唯一の「回避策」は、tarまたはcpioができるように、明示的なバッファを自分で設定できる「コピー」コマンドを使用することです。 tarに2Mバッファーを設定すると、50Gファイルの10M/secコピーを約35M/secに高速化できました。これは、小さいファイル(またはWindows)で取得する公称100M/secよりもはるかに遅いです。

1
ubfan1