Я являюсь автором 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).