Почему, когда я передаю файл через SFTP, это занимает больше времени, чем FTP? - PullRequest
54 голосов
/ 13 января 2012

Я вручную копирую файл на сервер и тот же файл на сервер SFTP. Файл размером 140 МБ.

FTP: у меня скорость около 11 МБ / с

SFTP: у меня скорость около 4,5 МБ / с

Я понимаю, что файл должен быть зашифрован перед отправкой. Это единственное влияние на передачу файлов? (и на самом деле это не точно время передачи, а время шифрования).

Я удивлен такими результатами.

Ответы [ 9 ]

157 голосов
/ 13 января 2014

Я являюсь автором HPN-SSH, и один из комментаторов попросил меня взвесить. Я хотел бы начать с пары фоновых предметов.Прежде всего, важно помнить, что SSHv2 - это мультиплексный протокол - несколько каналов по одному TCP-соединению.Как таковые, каналы SSH по существу не знают о базовом алгоритме управления потоком, используемом TCP.Это означает, что SSHv2 должен реализовать свой собственный алгоритм управления потоком.Наиболее распространенная реализация в основном переопределяет раздвижные окна.Это означает, что у вас есть скользящее окно SSH, расположенное поверх скользящего окна TCP.Конечным результатом является то, что эффективный размер приемного буфера является минимумом приемных буферов двух скользящих окон.У OpenSSH максимальный размер буфера приема составляет 2 МБ, но в итоге он оказывается ближе к ~ 1,2 МБ.Большинство современных операционных систем имеют буфер, который может увеличиваться (используя автоматическую настройку приемных буферов) до эффективного размера 4 МБ.Почему это важно?Если размер приемного буфера меньше, чем произведение задержки полосы пропускания (BDP), вы никогда не сможете полностью заполнить канал независимо от того, насколько быстра ваша система.

Это усложняется тем фактом, что SFTP добавляет еще один уровень управления потоками к элементам управления потоками TCP и SSH.SFTP использует концепцию выдающихся сообщений.Каждое сообщение может быть командой, результатом команды или потоком данных.Ожидающие сообщения могут быть до определенного размера дейтаграммы.Таким образом, вы получите то, о чем вы можете подумать как о еще одном буфере приема.Размер этого приемного буфера равен размеру дейтаграммы * максимальное количество ожидающих сообщений (оба из которых могут быть установлены в командной строке).По умолчанию установлено значение 32 КБ * 64 (2 МБ).Таким образом, при использовании SFTP необходимо убедиться, что приемный буфер TCP, приемный буфер SSH и приемный буфер SFTP имеют достаточный размер (не слишком большой или у вас могут возникнуть проблемы с буферизацией в интерактивных сеансах).

HPN-SSH напрямую решает проблему буфера SSH, имея максимальный размер буфера около 16 МБ.Что еще более важно, буфер динамически увеличивается до нужного размера путем опроса записи proc для размера буфера TCP-соединения (в основном пробивая дыру между уровнями 3 и 4).Это позволяет избежать чрезмерной буферизации практически во всех ситуациях.В SFTP мы увеличиваем максимальное количество невыполненных запросов до 256. По крайней мере, мы должны это делать - похоже, что это изменение не распространилось, как ожидалось, к набору исправлений 6.3 (хотя это в 6.2.).Не существует версии 6.4, потому что 6.3 корректно исправляет версию 6.4 (это исправление безопасности на 1 строку из 6.3).Вы можете получить набор патчей от sourceforge.

Я знаю, это звучит странно, но правильное определение размера буферов было единственным наиболее важным изменением с точки зрения производительности.Несмотря на то, что многие думают, что шифрование является , а не реальным источником низкой производительности в большинстве случаев.Вы можете доказать это себе, передавая данные в источники, которые становятся все более далекими (с точки зрения RTT).Вы заметите, что чем длиннее RTT, тем ниже пропускная способность.Это ясно указывает на то, что это проблема производительности, зависящая от RTT.

В любом случае, с этим изменением я начал видеть улучшения на 2 порядка.Если вы понимаете TCP, вы поймете, почему это так важно.Дело не в размере дейтаграммы, количестве пакетов или чем-то в этом роде.Это все потому, что для эффективного использования сетевого пути вы должны иметь буфер приема, равный количеству данных, которые могут передаваться между двумя хостами.Это также означает, что вы можете не увидеть каких-либо улучшений, если путь недостаточно быстрый и достаточно длинный.Если BDP меньше 1,2 МБ, HPN-SSH может не иметь для вас значения.

Распараллеленный шифр AES-CTR повышает производительность в системах с несколькими ядрами, если вам необходимо иметь полное шифрование от начала до конца.Обычно я предлагаю людям (или иметь контроль над сервером и клиентом) использовать шифровальный переключатель NONE (шифрованная аутентификация, объемные данные передаются в открытом виде), поскольку большинство данных не так уж и чувствительны.Однако это работает только в неинтерактивных сессиях, таких как SCP.Это не работает в SFTP.

Есть и другие улучшения производительности, но они не так важны, как правильный размер буферов и работа шифрования.Когда у меня будет немного свободного времени, я, вероятно, направлю процесс HMAC (в настоящее время это самое большое снижение производительности) и проведу еще несколько небольших работ по оптимизации.

Итак, если HPN-SSH так хорош, почему OpenSSH его не принял?Это длинная история, и люди, которые знают команду OpenBSD, вероятно, уже знают ответ.Я понимаю многие из их причин - это большое исправление, которое потребовало бы дополнительной работы с их стороны (и они - небольшая команда), они не заботятся так же о производительности, как о безопасности (хотя для HPN-SSH нет никаких последствий для безопасности), и т. д. и т. д. Однако, хотя OpenSSH не использует HPN-SSH, Facebook использует.То же самое делают Google, Yahoo, Apple, самый большой исследовательский центр обработки данных, NASA, NOAA, правительство, военные и большинство финансовых учреждений.Это довольно хорошо проверено на данный момент.

Если у кого-то есть какие-либо вопросы, не стесняйтесь спрашивать, но я, возможно, не буду в курсе этого форума.Вы всегда можете отправить мне письмо по адресу электронной почты HPN-SSH (google it).

14 голосов
/ 26 ноября 2013

ОБНОВЛЕНИЕ : Как отметил комментатор, проблема, которую я обрисовал в общих чертах ниже, была исправлена ​​за некоторое время до этого поста. Однако я знал о проекте HP-SSH и попросил автора взвесить. Как они объясняют в (справедливо) наиболее востребованном ответе, шифрование является , а не источником проблемы. Yay для электронной почты и люди умнее меня!

Ух ты, годовалый вопрос только с неправильными ответами. Однако я должен признать, что предположил, что замедление было связано с шифрованием, когда я задал себе тот же вопрос. Но задайте себе следующий логический вопрос: как быстро ваш компьютер может зашифровать и расшифровать данные? Если вы думаете, что скорость примерно равна 4,5 Мбит / с, о которых сообщает OP (.5625 МБ или примерно половина емкость 5,5-дюймового гибкого диска!), То вы можете ударить себя несколько раз, выпить кофе и задайте себе тот же вопрос снова.

По-видимому, это связано с тем, что не учитывает выбор размера пакета, или, по крайней мере, именно это автор LIBSSH2 говорит ,

Характер SFTP и его ACK для каждого небольшого фрагмента данных, который он отправляет, сильно ухудшает первоначальную наивную реализацию SFTP при отправке данных по сетям с высокой задержкой. Если вам придется ждать несколько сотен миллисекунд для каждых 32 КБ данных, то быстрых передач SFTP никогда не будет. Такая наивная реализация - это то, что libssh2 предлагал до и включая libssh2 1.2.7.

Таким образом, снижение скорости происходит из-за крошечного размера пакета x обязательных ответов ack для каждого пакета, что явно безумно.

Высокопроизводительный SSH / SCP (HP-SSH) предоставляет набор патчей OpenSSH, который, очевидно, улучшает внутренние буферы, а также распараллеливает шифрование. Тем не менее, обратите внимание, что даже непараллельные версии работали на скоростях выше незашифрованных скоростей 40 Мбит / с, полученных некоторыми комментаторами. Исправление включает в себя изменение способа, которым OpenSSH вызывал библиотеки шифрования, а не шифр, и между AES128 и AES256 нулевая разница в скорости. Шифрование занимает некоторое время, но оно маргинально. Возможно, это имело значение еще в 90-х годах, но (как и скорость Java против C) это уже не имеет значения.

10 голосов
/ 13 января 2012

На скорость передачи SFTP влияют несколько факторов:

  1. Шифрование.Хотя симметричное шифрование быстрое, оно не так быстро, чтобы остаться незамеченным.Если вы сравниваете скорости в быстрой сети (100 Мбит или больше), шифрование становится прерыванием для вашего процесса.
  2. Расчет и проверка хеша.
  3. Буферное копирование.SFTP, работающий поверх SSH, приводит к тому, что каждый блок данных копируется как минимум в 6 раз (по 3 раза с каждой стороны) больше по сравнению с обычным FTP, где данные в лучшем случае могут быть переданы на сетевой интерфейс вообще без копирования.И на копирование блока тоже уходит немного времени.
0 голосов
/ 20 апреля 2013

Ваши результаты имеют смысл.Поскольку FTP работает по незашифрованному каналу, он работает быстрее, чем SFTP (подсистема поверх протокола SSH версии 2).Также помните, что SFTP - это пакетный протокол, в отличие от FTP, который основан на командах.

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

Скорость для SFTP зависит от шифра, используемого для шифрования / дешифрования, используемого сжатия, например zlib, размеров пакетов и размеров буфера, используемых для сокетного соединения.

0 голосов
/ 27 февраля 2013

Для сравнения я попытался перенести образ диска ntfs объемом 299 ГБ с ноутбука i5 с Raring Ringtail Ubuntu alpha 2 live cd на рабочий стол i7 с Ubuntu 12.04.1. Заявленные скорости:

через Wi-Fi + Powerline: scp: 5 МБ / с (40 Мбит / с)

через гигабитный Ethernet + NetGear G5608 v3:

scp: 44 МБ / с

sftp: 47 МБ / с

sftp -C: 13 МБ / с

Таким образом, при хорошем гигабитном соединении sftp немного быстрее, чем scp, быстрые процессоры 2010 года кажутся достаточно быстрыми для шифрования, но сжатие не является победой во всех случаях.

Однако из-за плохой гигабитной сети Ethernet sftp намного превосходит scp. Что-то о том, что scp очень болтлив, см. "Scp UNBELIEVABLY slow" на comp.security.ssh с 2008 года: https://groups.google.com/forum/?fromgroups=#!topic/comp.security.ssh/ldPV3msFFQw http://fixunix.com/ssh/368694-scp-unbelievably-slow.html

0 голосов
/ 13 января 2012

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

0 голосов
/ 13 января 2012

Есть все виды вещей, которые могут это сделать. Одна из возможностей - «Формирование трафика». Обычно это делается в офисных средах, чтобы зарезервировать пропускную способность для критически важных бизнес-операций. Это также может быть сделано компанией, предоставляющей услуги веб-хостинга, или вашим Интернет-провайдером по очень похожим причинам.

Вы также можете установить его дома очень просто.

Например, может существовать правило, резервирующее минимальную пропускную способность для FTP, тогда как SFTP может подпадать под правило «все остальное». Или может быть правило, ограничивающее пропускную способность для SFTP, но кто-то еще также использует SFTP одновременно с вами.

Итак: Куда вы переводите файл с и на?

0 голосов
/ 13 января 2012

Да, шифрование добавляет нагрузку на ваш процессор, но если ваш процессор не древний, это не должно влиять так сильно, как вы говорите.

Если включить сжатие для SSH, SCP на самом деле быстрее, чем FTP, несмотря на шифрование SSH (если я помню, в два раза быстрее, чем FTP для файлов, которые я пробовал). Я на самом деле не использовал SFTP, но я считаю, что он использует SCP для фактической передачи файлов. Пожалуйста, попробуйте это и дайте нам знать: -)

0 голосов
/ 13 января 2012

Шифрование имеет не только процессор, но и некоторые служебные данные сети.

...