Проблемы с производительностью при передаче Ruby и Net :: SCP (сокеты) - PullRequest
7 голосов
/ 17 ноября 2010

Скорость загрузки SCP в библиотеке, по-видимому, сильно ограничена из-за возможностей утилиты командной строки scp.Я понимаю, что это Ruby (1.9.2-p0), но Net :: SCP примерно в 8 раз медленнее, чем утилита Linux (при использовании больших файлов ... см. Ниже). Мне интересно знать(Я быстро взглянул на код), если это так, как сокеты в Ruby, или если можно лучше мультиплексировать сокеты Net :: SCP?

Я заметил, что независимо от того, какой стиль загрузки я пробовал(последовательная загрузка, каналы работают асинхронно, с использованием нескольких экземпляров объекта scp) Я никогда не мог получить скорость передачи более 9 мегабайт / секунду при загрузке SCP.Теперь ... позвольте мне объяснить детали моего исследования:

1) Пробовал разные алгоритмы шифрования

Я использовал разные типы шифрования без значительного изменения скорости Пример:Я мог бы отправить свой тестовый файл объемом 1 ГБ с помощью командной строки scp (алгоритм шифрования = arcfour128) и получить скорость передачи 73,3 мегабайта / с на моем внутреннем гигабитном соединении.Я никогда не получал более 9 мегабайт / с на внутреннем гигабитном соединении с использованием библиотеки Net :: SCP.upload.

2) Пробовал разные хосты / ОС

Я обнаружил, что загрузка Linux -> Linux была самой быстрой.Ssh-сервер SUA (Windows) может предоставить мне только максимальную скорость загрузки 13,5 мегабайт / с (Linux -> Windows, с использованием алгоритма arcfour с командной строкой scp), тогда как Linux -> Linux (с использованием arcfour, с командной строкой scp) было 73,3 мегабайт / с.Я должен упомянуть, что эти машины с Windows и Linux имеют одинаковую модель, аппаратное обеспечение и т. Д.

3) Испытаны разные способы загрузки SCP

-> используется 2 синхронных загрузки!звонки, один за другим был закончен.-> использовал 2 асинхронных вызова загрузки, один после другого начался -> использовал 2 объекта Net :: SCP и отправил файл в неблокирующую / асинхронную версию загрузки (чтобы они выполнялись параллельно). Ни один из этих различных методовдать какой-либо значительный выигрыш в производительности, что немного разочаровывает.

Вот результаты теста (текст улучшен для удобства чтения, но похож на вывод предоставленного кода):


Net::SCP
Done creating channels
Starting transfer of /home/seth/afpcases/systeme.afp # two upload! calls, one after another
Finished transfer of /home/seth/afpcases/systeme.afp
--> Duration: 126.07707 seconds (8.7168903909331 megabytes/s) should show transfer speed of serial uploads

Starting transfer of /home/seth/afpcases/systeme.afp # two upload calls, one after another, with a wait on both channels after both have started
Finished transfer of /home/seth/afpcases/systeme.afp
--> Duration: 122.588784 seconds (8.964931082112699 megabytes/s) should show transfer speed of simultaneous async channels.

Starting transfer of /home/seth/afpcases/systeme.afp # two upload calls on two separate Net::SCP objects, one after another, with a wait on both channels after both have started
Finished transfer of /home/seth/afpcases/systeme.afp
--> Duration: 122.822663 seconds (8.947860054133495 megabytes/s) should show transfer speed of simultaneous SCP instances

Finished in 371.761262 seconds

Если у вас большой файл (я использовал файл размером ~ 1 ГБ), вы можете использовать эти тесты rspec (в scp_spec.rb) или изменить их на те, с которыми вы знакомы, чтобы увидеть это снижение производительности.

Если вы не знаете, как можно улучшить эту производительность в библиотеке, есть ли у вас какие-либо идеи о том, как открыть дополнительную параллельную скорость передачи SCP, кроме простого вызова утилиты scp через подоболочку?

Тест Rspec здесь: https://gist.github.com/703966

1 Ответ

0 голосов
/ 05 мая 2011

Вместо этого вы можете попробовать Net-sftp .Sftp - более новый протокол, и утилита linux scp фактически использует протокол sftp, если он доступен.Я не знаю, использует ли net-scp протокол sftp, но я не удивлюсь, если он этого не сделает.

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

...