Передачи файлов SSH зависают после ~700KB

Вам нужна учетная запись пользователя на сервере (вход в систему/пароль может отличаться, чем для Вашей учетной записи ftp). Этот пользователь должен быть root или имейте полномочия работать sudo.

4
задан 9 February 2012 в 23:37
4 ответа

ПРИМЕЧАНИЕ (TL; DR): Как сказал Сальва, быстрое исправление заключается в обновлении до Net :: SFTP :: Foreign 1.70_08 или новее. Произошла ошибка, не позволяющая библиотеке использовать правильное значение по умолчанию queue_size в Windows. Читайте мое исходное решение.

Мне удалось устранить застойные передачи, уменьшив параметр Perl Net :: SFTP :: Foreign модуля queue_size со значения по умолчанию 32 до 23. Это производительность сети - связанной переменной, и я не ощущаю разницу в скорости, когда она уменьшается. Для производства я собираюсь вернуть его к 16 для безопасности.

queue_size => $ size

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

(из Net :: SFTP :: Foreign документация по CPAN )

Параметр queue_size применяется к Net :: SFTP :: Foreign new , get , put , rget и rput методы.

Если вы используете Net :: SFTP :: Foreign , вы можете добавить параметр queue_size в конце вашего конструктора или отдельных вызовов методов.

my $sftp = Net::SFTP::Foreign->new( $host, queue_size => 16 );
# -- OR --
$sftp->put( $local_file, $remote_file, queue_size => 16 );

Я использую оболочку Net :: SFTP :: Foreign :: Compat для Net :: SFTP-подобный API. Оболочка позволяет вам установить параметры по умолчанию для использования с вызовами базовых методов Net :: SFTP :: Foreign.

use Net::SFTP::Foreign::Compat;

# Note that the Compat CPAN documentation is INCORRECT
# The DEFAULTS hash is under Compat, not Foreign

$Net::SFTP::Foreign::Compat::DEFAULTS{ new } = [ queue_size => 16 ];
# -- OR --
$Net::SFTP::Foreign::Compat::DEFAULTS{ put } = [ queue_size => 16 ];

my $sftp = Net::SFTP::Foreign::Compat->new( $host, %options );

Связанная мысль: Максимальный рабочий queue_size из 23 и значение по умолчанию размер блока 32 КБ коррелировал с количеством байтов, отправленных до остановки передачи. 23 * 32 КБ - чуть больше 700 КБ. Я не могу объяснить, почему мне нужно было ограничить queue_size в этом развертывании, но это решило мою проблему.

2
ответ дан 3 December 2019 в 02:29

Мне кажется, что это проблема с MTU. Я видел аналогичные проблемы с файлами scping при несоответствии MTU пути. Буферы TCP на хосте могут заполняться, поэтому вы отправляете больше, чем несколько пакетов, но как только они заполняют ваш клиент, он останавливается - спустя много времени после того, как сама проблема MTU действительно повлияла.

Чтобы убедиться в этом, вы можете посмотреть с помощью такого инструмента, как scamper . Или вы можете попробовать вручную ограничить свой MTU до некоторой нижней точки - скажем, 1280 байт - и посмотреть, исправит ли это это. Велика вероятность того, что есть лишь небольшое несоответствие, например, из-за связи PPPoE на пути, которая уменьшает MTU до 1492.

4
ответ дан 3 December 2019 в 02:29

может, можно поиграться с параметром block_size ? Я испытал некоторые странности, связанные с загрузкой файлов через SSH / SSL, и каким-то образом помогла настройка размера блока / фрагмента. Я считаю, что значение по умолчанию - 32 * 1024 , поэтому, возможно, снижение его до 16, 8, 4 и попытки могут иметь какое-то значение. Может, стоит попробовать.

3
ответ дан 3 December 2019 в 02:29

The default queue size on Windows was set to 4, but this default was not being picked up due to a bug on the module.

It has been corrected (and BTW, the Windows default queue size changed to 16). You can now download Net::SFTP::Foreign 1.70_08.

Next time you find a problem like this, please, report it!

3
ответ дан 3 December 2019 в 02:29

Теги

Похожие вопросы