Вам нужна учетная запись пользователя на сервере (вход в систему/пароль может отличаться, чем для Вашей учетной записи ftp). Этот пользователь должен быть root
или имейте полномочия работать sudo
.
ПРИМЕЧАНИЕ (TL; DR): Как сказал Сальва, быстрое исправление заключается в обновлении до Net :: SFTP :: Foreign 1.70_08 или новее. Произошла ошибка, не позволяющая библиотеке использовать правильное значение по умолчанию queue_size
в Windows. Читайте мое исходное решение.
Мне удалось устранить застойные передачи, уменьшив параметр Perl Net :: SFTP :: Foreign модуля queue_size
со значения по умолчанию 32 до 23. Это производительность сети - связанной переменной, и я не ощущаю разницу в скорости, когда она уменьшается. Для производства я собираюсь вернуть его к 16 для безопасности.
queue_size => $ size
запросы чтения и записи конвейеризуются, чтобы увеличить пропускную способность передачи. Эта опция позволяет установить максимальное количество запросов, которые могут быть одновременно ожидает ответа сервера.
Параметр 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
в этом развертывании, но это решило мою проблему.
Мне кажется, что это проблема с MTU. Я видел аналогичные проблемы с файлами scping при несоответствии MTU пути. Буферы TCP на хосте могут заполняться, поэтому вы отправляете больше, чем несколько пакетов, но как только они заполняют ваш клиент, он останавливается - спустя много времени после того, как сама проблема MTU действительно повлияла.
Чтобы убедиться в этом, вы можете посмотреть с помощью такого инструмента, как scamper . Или вы можете попробовать вручную ограничить свой MTU до некоторой нижней точки - скажем, 1280 байт - и посмотреть, исправит ли это это. Велика вероятность того, что есть лишь небольшое несоответствие, например, из-за связи PPPoE на пути, которая уменьшает MTU до 1492.
может, можно поиграться с параметром block_size
? Я испытал некоторые странности, связанные с загрузкой файлов через SSH / SSL, и каким-то образом помогла настройка размера блока / фрагмента. Я считаю, что значение по умолчанию - 32 * 1024
, поэтому, возможно, снижение его до 16, 8, 4 и попытки могут иметь какое-то значение. Может, стоит попробовать.
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!