Снижение скорости передачи при копировании большого объема данных

Я использую систему Ubuntu 16.04.3 LTS (4.10.0-40-generic) с двумя жесткими дисками и несколькими разделами на каждом диске. Когда я копирую данные (<5 ГБ) между двумя дисками, я получаю скорость передачи около 70 МБ / с. Однако, когда я пытаюсь скопировать большой объем данных (>30 ГБ) с одного диска на другой, я замечаю несколько проблем с производительностью.

Мой вопрос заключается в том, является ли это поведение нормальным и ожидаемым в системах Linux?
Может кто-нибудь объяснить мне это и посоветовать, как избежать этого снижения производительности?

Ниже я опишу свои наблюдения. В этом примере я скопировал файл образа диска объемом 54 ГБ из sda8 (раздел 325 ГБ) в sdb8 (раздел 1.6 ТБ)

1) Скорость передачи уменьшается и Айовит увеличивается
Когда я пытаюсь скопировать более 50 ГБ, я замечаю, что скорость передачи постепенно уменьшается. Я наблюдаю за производительностью, используя glances, atop, iotop и iostat. При прогрессе 30 ГБ скорость передачи упала до 58 МБ / с, при 46 ГБ до 36 МБ / с, при 52 ГБ до 12 МБ / с. После этого скорость передачи действительно начинает колебаться и падает ниже 1 МБ / с. В то же время я вижу, что iowait увеличивается с 0% до 62% в конце. Во время копирования диск sd8 имеет процент занятости между 40% и 60%. Диск sdb постоянно занят на 100%. Не только скорость передачи падает, но и моя система становится менее отзывчивой. Я ожидаю, что причиной этого будет Айоваит.
Это нормальное поведение? Как избежать снижения производительности?

2) IOwait остается высоким после копирования
Когда копирование закончилось, я заметил, что iowait все еще высок и постепенно начинает снижаться до нормальных значений. Это займет пару минут. Я думаю, что в течение этого времени данные все еще записываются в SDB со скоростью около 1 или 2 МБ / с. Используя iotop, похоже, что процесс "jdb2/sdb4-8" вызывает запись на диск. В то время как IOwait уменьшается, моя система все еще страдает от плохой отзывчивости. Также видно, что диск sda больше не занят, но диск sdb по-прежнему работает на 100%.
Что является причиной того, что моя система имеет плохую отзывчивость в течение пары минут после действия копирования?
Можно ли этого избежать?

3) Копирование с сетевого диска увеличивает эффект
Когда я пытаюсь скопировать данные с моего Synology NAS на локальный диск (sdb8), последствия оказываются еще хуже. Сначала сетевой диск монтируется в моей системе, а затем начинается копирование. Первоначально также реализуется скорость передачи 70 МБ / с, но скорость передачи должна снижаться быстрее. Через пару ГБ скорость передачи упала намного ниже 1 МБ / с. Копирование было выполнено с помощью перетаскивания из Nautilus, команды "cp", команды rsync, приложения FreeFileSync, но все показали низкую производительность.
Что может быть причиной того, что эффекты снижения производительности хуже при использовании сетевых дисков?

Дополнительная информация
During copying "iostat -dx 5" was used to monitor the disk performance. Around 5 GB of copying progress monitoring shows:

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

When copying has progressed to around 52 GB it shows:

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

I realize that these are multiple questions, but I suspect these are all related to the same cause and hope that someone can clarify this to me.

1 ответ

К сожалению, это нормально и ожидается для вашего случая использования большого файла. Ваш случай с двумя жесткими дисками и файлом 50G+ устраняет много вводящих в заблуждение разговоров о "медленных устройствах", "медленных шинах" и "медленных файловых системах", и у вас остается необъяснимая проблема медленной копии. У вас должно быть достаточно памяти, чтобы получить производительность, необходимую для файлов 30G. Системные буферы используются, заполняются, и после того, как ваша команда копирования завершается, в конечном итоге она сбрасывается к цели, что несколько усложняет реальное время / скорость (даже команда "время" завершится задолго до того, как буферы окончательно очистятся.

Единственный "обходной путь", который я нашел, - это использование команды "копировать", которая позволяет вам самим устанавливать явные буферы, как это могут сделать tar или cpio. Установка 2M буфера на tar позволила мне увеличить скорость 10M/sec копии 50G файла до 35M/sec - все еще намного медленнее, чем номинальная 100M/sec, которую я получаю для небольших файлов (или в Windows).

Другие вопросы по тегам