Назад | Перейти на главную страницу

rsync / scp чрезвычайно низкая скорость передачи (<30 КБ / с) через быстрое соединение

Я пытаюсь выполнить резервное копирование с помощью rsync некоторых файлов на Digital Ocean VPS под управлением Ubuntu 14.04.4 LTS.

rsync работает очень медленно, от 20-50 кБ / с, только 1% того, что должно быть. Это одинаково медленно при использовании scp или при использовании rsync в режиме демона, так что это не похоже на проблему, специфическую для rsync или ssh.

У меня также есть доступ к другому VPS (Linode), я получаю ожидаемую скорость передачи 2-3 МБ / с при передаче файлов с помощью rsync с этого VPS.

Кроме того, когда я передаю файлы с помощью rsync напрямую с Digital Ocean VPS на Linode VPS, я получаю нормальную скорость передачи между серверами 15 МБ / с. Сочетание этих факторов указывает на то, что ssh и rsync работают нормально на всех машинах.

На данный момент я обошел проблему, туннелировав ssh-соединение через Linode VPS, но мне любопытно, что может быть причиной очень низкой скорости передачи.

Когда вы говорите «в основном архивы размером 15 Мб», сколько там файлов меньшего размера? Вы постоянно видите медленную скорость или она выглядит быстрее на больших файлах? rsync (и почти любая другая операция файловой системы) медленнее при обработке большого количества маленьких файлов, чем меньшего количества больших, из-за накладных расходов файловой системы на открытие и закрытие каждого файла (и любых необходимых операций чтения / изменения каталога). Это может быть усугублено провайдерами VPS, которые обеспечивают справедливое (er) использование ввода-вывода путем регулирования операций ввода-вывода в секунду для каждой виртуальной машины до фиксированного максимального значения.

Чтобы проиллюстрировать это:

  1. Создайте большой (скажем, ~ 100 МБ) файл, например:
    dd if=/dev/urandom of=/tmp/test.file bs=1024 count=102400
    и проталкивая только этот файл через rsync
  2. затем повторите со множеством небольших файлов, например, 10240 файлов размером 10 КБ, созданных с помощью:
    for i inseq 1 10240; do dd if=/dev/urandom of=test.file.$i bs=1024 count=10; done
  3. повторите с файлами еще меньшего размера, 102400x1Kb файлы, созданные с помощью:
    for i inseq 1 102400; do dd if=/dev/urandom of=test.file.$i bs=1024 count=1; done

Вы должны увидеть, что для файлов меньшего размера процесс идет намного медленнее, даже если совокупное содержимое одинакового размера. Так будет, даже если вы будете делать все локально, а не по сети вообще (хотя, очевидно, сеть несколько усилит эффект). На маленькой старой машине здесь time rsync * /location/on/another/local/drive/ дает real 0m0.683s, user 0m0.596s, sys 0m0.220s для корпуса 1 * 100 МБ и real 0m38.793s, user 0m4.664s, sys 0m15.657s для 102,400 * 1Кб - разница ~ 57х.