Скорость загрузки SFTP SSH2 (C #)

Я разрабатываю консольное приложение C #, которое загружает файлы с сервера SFTP с аутентификацией пары ключей SSH.

Я использую API Chilkat.

Файлы, которые я пытаюсь загрузить, очень большие, от 8 до 13 ГБ.

В настоящее время максимальная скорость загрузки, которую я могу получить с помощью своего приложения, составляет около 570 КБ / с.

Если я попытаюсь загрузить тот же файл с помощью FileZilla, я получу скорость загрузки 2,6 МБ / с.

Работает с того же компьютера в одной сети.

Есть ли способ согласовать скорость загрузки FileZilla с консольным приложением?


person Isaac Vallee    schedule 08.07.2011    source источник
comment
Добро пожаловать в SO. Вы можете обновить свой вопрос, отредактировав его. Вы можете голосовать за вопросы (за или против), и если вы получите ответ, который соответствует вашим потребностям и отвечает на ваш вопрос, вы можете отметить его как ответ   -  person Eugene Mayevski 'Callback    schedule 12.07.2011


Ответы (5)


На скорость SFTP влияет несколько факторов. Среди этих факторов - размер буфера SSH, размер буфера SFTP, длина конвейера (еще один алгоритм шифрования). Еще один фактор - это язык. Оптимизированный код C ++ всегда будет быстрее кода C #. Таким образом, хотя вы можете достичь сопоставимых скоростей с FileZilla, вы вряд ли сможете им соответствовать.

Также вы проверяли альтернативные компоненты SFTP (их много на рынке)?

person Eugene Mayevski 'Callback    schedule 09.07.2011
comment
Это определенно что-то с API Chilkat. Я попробовал Rebex SFTP API, и загрузка была одинаковой. Затем я увидел, что у Rebex есть опция UseLargeBuffers (которая увеличивает размер буфера и размер окна TCP), и после включения загрузки превысили 2,8 МБ / с. К сожалению, у меня есть лицензия только на Chilkat, поэтому я отправил им по электронной почте и сообщил об увеличении размера буфера и размера окна TCP. Они изучают это. - person Isaac Vallee; 12.07.2011

Вероятно, вам понадобится больший максимальный размер окна TCP: http://msdn.microsoft.com/en-us/library/ms819736.aspx

Функция .NET для управления им - Socket.SetSocketOption(SocketOptionName.ReceiveBuffer).

person Ben Voigt    schedule 09.07.2011

Я знаю, что это очень старый вопрос, но пока никто не ответил на него. Chilkat рекомендует увеличить размеры SoRcvBuf и SoSndBuf, если у вас есть производительность сети. У меня были те же проблемы, что и у вас, и это устранило мою проблему.

Из документации ChilKat:

общедоступный int SoSndBuf {получить; установленный; }

Устанавливает опцию сокета размера буфера отправки. Обычно это свойство следует оставить без изменений. Значение по умолчанию - 0, что указывает на то, что параметр сокета размера буфера отправки не должен быть явно установлен (т. Е. Следует использовать системное значение по умолчанию, которое может варьироваться от системы к системе).

Это свойство можно изменить, если скорость загрузки кажется низкой. Рекомендуется быть кратным 4096. Чтобы увидеть размер буфера отправки по умолчанию для текущей системы, проверьте свойство LastErrorText после вызова любого метода, устанавливающего соединение. Об этом следует сообщать под заголовком SO_SNDBUF. Чтобы повысить производительность, попробуйте установить его в 2, 3 или 4 раза больше значения по умолчанию.

person zjacobs    schedule 29.08.2013

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

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

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

person Adriano Carneiro    schedule 09.07.2011

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

person Brian Graham    schedule 08.07.2011
comment
Ох ... тогда это API Чилкат. Где-то там тормозит скорость загрузки. При загрузке вы устанавливаете предопределенный массив байтов (обычно размером 4 КБ) для непрерывного чтения и записи файла, FileZilla может использовать массив большего размера. - person Brian Graham; 09.07.2011