Ускорить загрузку SFTP в сети с высокой задержкой?

27

Я пытаюсь передать набор больших файлов по всему миру, используя SFTP, но я обнаружил, что мой международный партнер не может получить скорость загрузки выше ~ 50k, несмотря на очень хорошие соединения с обеих сторон. Мы можем получить несколько подключений, загружаемых с такой скоростью (а не с пропускной способностью?), Но ни одна загрузка не улучшается по скорости, что является проблемой, так как многие файлы имеют размер несколько ГБ.

SFTP размещается с использованием стандартной системы Apple OSX «Remote Login» SFTP.

Есть ли способ улучшить скорость загрузки или другой хост SFTP, который бы помог? Мне не ясно, является ли это проблемой конфигурации или внутренним ограничением протокола.

(По соображениям безопасности мне нужно использовать сквозное зашифрованное одноранговое соединение - без облачных сервисов).

nick_eu
источник
Если у вас есть бюджет, есть коммерческие решения, которые работают намного лучше, чем системы передачи файлов на основе TCP, такие как SFTP.
Кенстер
4
Если это однократная передача нескольких гигабайт, почему бы не попробовать альтернативу Интернету .
vasin1987
1
Простой сценарий оболочки для запуска N rsyncпередач легко удовлетворит ваши требования: 1. Безопасная передача и 2. Максимизация пропускной способности. См. Здесь пример того, как начать N rsyncпереводов. Stackoverflow.com/a/38014502/52074
Тревор Бойд Смит,
2
Или просто используйте uftp-multicast.sourceforge.net, если хотите шифровать Mac и использовать вашу пропускную способность.
Тревор Бойд Смит
4
Вопреки вашему последнему предложению, облачная служба должна быть в порядке, если вы шифруете файл локально, передаете его через облако, а затем дешифруете локально на другом конце), что все равно будет означать сквозное шифрование. (Вы можете добавить краткий отзыв об успешном приеме). Вы используете sftp-шифрование для предотвращения атак со стороны кого-либо, способного перехватить весь ваш трафик. Следовательно, просто предоставить им зашифрованные данные не хуже, чем предположить, что они все равно могут их получить.
Хаген фон

Ответы:

29

С клиентом OpenSSHsftp (который вы используете) вы можете использовать:

  • -Rпереключиться на увеличение длины очереди запросов (по умолчанию 64)
  • -Bпереключиться на увеличение размера запроса на чтение / запись (по умолчанию 32 КБ)

Для начала попробуйте удвоить оба:

sftp -R 128 -B 65536 user@host

Это, вероятно, не имеет большого значения, какой из них вы увеличиваете.

Увеличение любого должно помочь насытить ваше соединение с высокой задержкой. С указанными выше настройками он будет хранить 8 МБ данных в канале в любое время (128 * 64 КБ = 8 МБ).

Обратите внимание, что это помогает только при передаче больших файлов. Это не будет иметь никакого эффекта при передаче большого количества маленьких файлов.


Дополнительные сведения и обсуждение других SFTP-клиентов (GUI) см. В разделе «Сетевая задержка / задержка» моего ответа на вопрос: почему максимальная скорость передачи файлов FileZilla SFTP ограничена 1,3 МБ / с вместо насыщения доступной пропускной способности? rsync и WinSCP еще медленнее .

Мартин Прикрыл
источник
4

Вы можете попробовать включить сжатие и посмотреть, поможет ли это.

От man sftp:

-C Включает сжатие (через флаг ssh -C).

И из man ssh:

-C Запрашивает сжатие всех данных (включая stdin, stdout, stderr и данные для переадресованных соединений домена X11, TCP и UNIX). Алгоритм сжатия аналогичен gzip (1), и «уровень» можно контролировать с помощью параметра CompressionLevel для версии протокола 1. Сжатие желательно на модемных линиях и других медленных соединениях, но только в быстрых сетях замедлит работу , Значение по умолчанию может быть установлено для каждого хоста отдельно в файлах конфигурации; см. параметр «Сжатие».

Звучит так, как будто соединение может быть ограничено по скорости в некоторой точке на своем пути (или, скорее, мне кажется, что это самое простое объяснение ваших 50 кБ / с на соединение, но возможно несколько таких соединений), хотя это может быть и не так. плохая идея, чтобы убедиться, что диски с обеих сторон не являются фактором.

Вы также можете запустить быстрый pcap, чтобы увидеть, есть ли какие-либо «очевидные» проблемы (например, большое количество повторных передач) - но если у вас нет уверенности, что вы сможете решить эту проблему, я бы, вероятно, просто посмотрел, будет ли включать сжатие Помогите.

iwaseatenbyagrue
источник
Благодарность! К сожалению, файлы предварительно сжаты, поэтому я сомневаюсь, что с этим что-нибудь получится ...: /
nick_eu
Сжатие не ускоряет процесс, даже если данные не будут сжаты. Это слишком большая нагрузка на процессорное время (и задержка), поэтому это не имеет смысла в наши дни.
Jakuje
1
Если узким местом является сеть, то немного больше ЦП с обеих сторон не должно ничего замедлять @Jakuje, если только блок не способен сжимать со скоростью 50 КБ / с, что не должно быть проблемой.
Бен
@Ben В вопросе четко говорится, что сеть не является узким местом.
Jakuje
4

Я пытаюсь передать набор больших файлов по всему миру, используя SFTP

Это еще не упоминалось в качестве ответа, но при передаче нескольких файлов по ссылке с высокой задержкой существует одно очень простое решение для повышения производительности:

Передача нескольких файлов параллельно.

И это решение , которое вы даже упомянули в своем вопросе. Используй это.

По сути, протокол TCP не очень хорошо обрабатывает соединения с продуктом с большой задержкой полосы пропускания - одно соединение не может одновременно поддерживать перемещение достаточного количества данных. Смотрите https://en.wikipedia.org/wiki/TCP_tuning

Поскольку каждое соединение ограничено протоколом TCP, просто используйте больше соединений.

Эндрю Хенле
источник
1
Вот как распараллелить SFTP-передачи: serverfault.com/questions/248105/…
niutech
3

Ускорить передачу SFTP

Предполагая, что ваши проблемы связаны с настройкой и / или регулированием сети для каждого TCP-соединения, взгляните на sftp с помощью зеркальной подсистемы lftp

Настройка сети на каждом конце - это гораздо более важная тема, и для ее решения потребуется много взад-вперед, что вытеснит эту тему за пределы ServerFault. Для отдельных соединений сжатие, упомянутое iwaseatenbyagrue, может помочь в любом случае. Это предполагает, что удаленный конец позволяет сжатие.

Аарон
источник
3

(Вы упоминаете «высокую задержку» в заголовке вопроса, но не в тексте. Измеряли ли вы реальную задержку и каковы результаты?)

Существует патч для OpenSSH, который явно улучшает пропускную способность в сетевом канале с высокой задержкой: HPN-SSH : (выделено мое)

SCP и основная реализация протокола SSH2 в OpenSSH - это производительность сети, ограниченная статически определенными внутренними буферами управления потоком. Эти буферы часто оказываются узким местом для пропускной способности сети SCP, особенно на длинных и высокополосных сетевых каналах. Изменение кода ssh для определения буферов во время выполнения устраняет это узкое место. Мы создали патч, который устранит узкие места в OpenSSH и полностью совместим с другими серверами и клиентами. Кроме того, клиенты HPN смогут быстрее загружаться с серверов, отличных от HPN, а серверы HPN смогут быстрее получать загрузки от клиентов, не являющихся HPN.

Итак, попробуйте скомпилировать и использовать HPN-SSH на принимающей стороне и посмотреть, улучшит ли это вашу скорость передачи.

посол твистероида
источник
Благодарность! Я на самом деле не измерил, сейчас мне стыдно признаться, но я еду на полпути по всему миру в страну с так себе интернетом, так что, полагаю, я прав. :) Патч звучит очень полезно!
nick_eu
@nick_eu Я видел анекдоты о том, что ученые будут использовать HPN-SSH для передачи больших объемов научных данных через Атлантику. Похоже, это должно быть идеально подходит для вашего случая использования.
посол
0

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

sleepyweasel
источник
отличная идея, попробую.
nick_eu
0

Мы можем получить несколько подключений для загрузки с такой скоростью (не пропускная способность?)

Это звучит как проблема конфигурации - либо намеренно (как способ перепродажи услуг без необходимости предоставления каких-либо дополнительных ресурсов), либо случайно (например, масштабирование разбитого окна или чрезмерное управление трафиком). Хотя вы могли бы распараллелить передачи, вы ничего не сказали нам о том, что находится на другом конце соединения, или о том, стоит ли разрабатывать несколько простых сценариев для обработки шардинга / восстановления файлов.

Настройка размера очереди и сжатия вряд ли окажет какое-либо существенное влияние, если только причина не в очень плохо написанном программном обеспечении (а openSSH не относится к этой категории - не имеет большого смысла использовать openssh с более длинной очередью запросов / большим размером блока, если задержка не составляет более 250 мсек. Вы можете попытаться использовать разные клиенты из разных мест, чтобы исключить проблему с сервером.

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

symcbean
источник
Извините, должно было быть более ясным. Нет «провайдера» - я размещаюсь на своем рабочем столе, а коллега пытается подключиться со своего компьютера. Коллега просто открывает сессию ssh (не уверен в протоколе, но может проверить) и используетput
nick_eu
@nick_eu он говорит об интернет-провайдерах.
Джурис
Это звучит как проблема конфигурации Нет. Это не проблема конфигурации. Сам протокол TCP плохо работает на соединениях с большой задержкой пропускной способности. По сути, если соединение таково, что одновременно может передаваться много данных , сам протокол TCP не может поддерживать перемещение такого большого количества данных в любой момент времени. Вот почему параллельные TCP-соединения работают для повышения скорости передачи данных.
Эндрю Хенле
«неэффективно работает с соединениями с большим продуктом с задержкой пропускной способности» - прочтите RFC 1323 (с 1992 г.) и 7323 (заменил 1323 в 2014 г.)
symcbean
@symcbean Затем объясните оператору. Мы можем получить несколько соединений, загружаемых с такой скоростью (а не с пропускной способностью?), но ни одна загрузка не улучшается. Это классический признак TCP по сравнению с соединением с чрезвычайной задержкой - все, что может сделать расширение TCP, - это уменьшить его. проблема несколько, поскольку они не могут решить фундаментальные проблемы с самим протоколом. И удачи вам в том, чтобы определить, кто из провайдеров виноват в этой проблеме, попросите их решить проблему , пытаясь «переслать набор больших файлов на международном уровне».
Эндрю Хенле