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

Как ускорить передачу файлов с сервера на сервер через Интернет?

Как я могу передать файл с одного сервера на другой с большой скоростью? сейчас я использую FTP для передачи файла, но это занимает так много времени. Для передачи файла размером 2 ГБ требуется около 3 часов. Есть ли другая процедура для передачи файла, которая быстрее, чем FTP. Расположение сервера: один в Индии, другой в США.

Члены сообщества SF могут быть недовольны тем, что вернули вас в каменный век Unix, но для снижения накладных расходов протокола и хорошего сжатия вы можете попробовать комбинацию dd + netcat + bzip2. Да, это небезопасно, поэтому вам нужно закрыть порты для всех, кроме двух узлов. Ни гарантии, ни безопасности, ни аутентификации ... но это быстрее.

1 - сжать файл с помощью bzip2 чтобы получить, скажем, file.bz2

2 - Слушайте с помощью netcat на node2

     nc -l 6668 | dd of=/dir/file.bz2
  1. Отправьте его с узла 1

     dd if=/dir/file.bz2 | nc node2 6668
    

Это нормально для вашего местоположения? Если вы переносите 2 ГБ на другие сайты, какую скорость вы обычно видите? Какова скорость сети в вашем месте и в удаленном месте?

Скорость передачи на большие расстояния будет в основном зависеть от пропускной способности сети, доступной между двумя местоположениями и для любого промежуточного перехода. Вы передаете данные через Интернет, а это означает, что скорость может сильно варьироваться время от времени. Интернет не гарантирует минимальную скорость.

Ваши лучшие ставки:

  1. Перед передачей данных сожмите данные на локальном сервере, чтобы они были меньше по размеру.
  2. Используйте rsync для сжатия данных на лету. См. Примеры на http://en.wikipedia.org/wiki/Rsync#Examples
  3. Разбейте данные на части, которые вы передаете по одному. Это не ускорит передачу данных, но сделает передачу более отказоустойчивой (вам не нужно будет перезапускать с самого начала, если передача не удалась на 99%). Сжатие может помочь.
  4. Другой интернет-провайдер или сеть могут предложить более высокую скорость передачи. Попробуйте другой провайдер или сеть.

Когда я читал о производительности передачи файлов для устройств NAS, скорость, которую люди получали по SMB, обычно всегда была ниже, чем по FTP. У меня возникло ощущение, что, хотя в FTP может быть много чего раздражающего, сам по себе это не медленный протокол.

Я не ожидал, что, оставив все остальное без изменений, простой переход с FTP на другой протокол даст вам улучшение скорости, которого вы, похоже, ожидаете.

Как узнать, проблема не в пропускной способности? Можете ли вы попробовать провести тест с помощью scp или rsync и сравнить с FTP?

  • Войдите на один из серверов по SSH.
  • Откройте передачу файлов с сервера, на котором вы вошли, на другой сервер (например, lftp, scp и т. Д.)
  • Отправьте файл.

Последние два, вероятно, одно и то же, но я хотел сделать из них 3 шага. Это так же просто, как «просто отправьте файл».

У вас включено масштабирование окна TCP на обоих концах? Даже если у вас большая пропускная способность, соединения между США и Индией по своей сути будут иметь продукт задержки с огромной пропускной способностью. Если масштабирование окна включено, но производительность FTP по-прежнему низкая, вы можете попробовать параллельный запуск rsync.

Также прекратите использовать FTP. Это ужасный протокол. :)

Если вы пытаетесь передать один файл размером 2 ГБ, ftp - один из самых чистых и быстрых протоколов, вы также можете безопасно использовать функцию возобновления в случае прерывания во время передачи.

FTP - плохая идея, если вы пытаетесь передать большое количество маленьких файлов, потому что у вас есть огромная бесполезная активность, открывающая и закрывающая соединения для каждого файла.

Rsync (через ssh) или scp (sftp) - хорошие альтернативы, но вы должны учитывать, что шифрование значительно снижает пропускную способность. Вы можете использовать легкий алгоритм, такой как blowfish ('scp -c blowfish' или 'rsync -e "ssh -c blowfish"'), но скорость всегда будет ниже, чем ftp.

Netcat - альтернатива, но только в локальной сети.

Если ваш файл похож на тот, который уже находится в месте назначения, вы можете использовать rsync с параметром --fuzzy. Fuzzy будет искать файл с таким же именем в целевом каталоге и использовать его в качестве отправной точки для копирования, отправляя по сети только различия между двумя файлами.

В качестве примера я копирую xwiki-enterprise-web-3.4.war в удаленный каталог, который уже содержит xwiki-enterprise-web-3.2.1.war.

$ rsync -av --fuzzy xwiki-enterprise-web-3.4.war example.com:Downloads/xwiki-enterprise-web-3.4.war
sent 69065310 bytes  received 74176 bytes  389518.23 bytes/sec
total size is 138567168  speedup is 2.00

Вы заметите только около половины содержимого файла, которое действительно необходимо передать. Было бы даже лучше, если бы файлы были более похожими, поскольку в этом конкретном случае более новая версия xwiki на самом деле на 26M больше, чем старая копия.

$ du -sh xwiki-enterprise-web-3.*
107M    xwiki-enterprise-web-3.2.1.war
133M    xwiki-enterprise-web-3.4.war

Вместо этого почему бы не использовать команду rsync или rdiff, обе - быстрые инструменты для передачи файлов.