2010-11-17 5 views
7

SCP-Upload-Geschwindigkeiten scheinen stark in der Bibliothek von dem eingeschränkt werden, was das Befehlszeilen-Dienstprogramm scp fähig ist. Ich verstehe das ist Ruby (1.9.2-p0), aber Net :: SCP ist etwa 8x langsamer als das Linux-Dienstprogramm (mit großen Dateien gesehen ... siehe unten). Ich bin neugierig zu wissen (ich habe einen kurzen Blick auf den Code), wenn das ist, wie Sockets in Ruby sind, oder wenn es möglich ist, die Net :: SCP-Sockets besser zu multiplexen?Leistungsprobleme mit Ruby und Net :: SCP-Übertragungen (Sockets)

Ich bemerkte, dass egal, welche Art von Upload habe ich versucht (Serial Upload, Kanäle asynchron, die Verwendung mehrerer Instanzen des scp-Objekts) Ich konnte nie über 9 Megabyte/Sekunde Übertragungsgeschwindigkeit auf einem SCP-Upload. Nun ... lassen Sie mich die Details meiner Untersuchung erklären:

1) versucht, verschiedene Verschlüsselungsalgorithmen

ich verschiedene Arten von Verschlüsselung ohne viel signifikante Geschwindigkeitsänderung Beispiel verwendet: Ich konnte meine 1GB Testdatei einreichen mit Befehlszeile scp (Verschlüsselungsalgorithmus = arcfour128) und eine Übertragungsrate von 73,3 Megabyte/s auf meiner internen Gigabit-Verbindung erhalten. Ich habe nie mehr als etwa 9 Megabyte/s auf meiner internen Gigabit-Verbindung mit der Net :: SCP.upload-lib.

2) versucht, verschiedene Hosts/OSes

Ich fand, dass Linux -> Linux-Uploads die schnellste waren. Der ssh-Server von SUA (Windows) konnte mir maximal 13,5 Megabyte/s Upload-Geschwindigkeit geben (Linux -> Windows mit Arcfour-Algorithmus mit scp-Kommandozeile), während Linux -> Linux (mit arcfour, w/scp-Kommandozeile)) war eine lodernde 73.3megabytes/s. Ich sollte erwähnen, dass diese Windows- und Linux-Maschinen genau das gleiche Modell sind, Hardware usw.

3) versucht, verschiedene SCP-Upload-Methoden

-> 2 Synchron-Upload verwendet! Anrufe, einer nach dem anderen war beendet. -> 2 asynchrone Upload-Aufrufe verwendet, einer nach dem anderen gestartet -> 2 Net :: SCP-Objekte verwendet und die Datei an die nicht blockierende/asynchrone Upload-Version übergeben (also parallel ausgeführt) Keine dieser verschiedenen Methoden geben Sie einen signifikanten Leistungsgewinn, der irgendwie frustrierend ist.

Hier sind die Ergebnisse des Tests (Text zur besseren Lesbarkeit verbessert, aber ähnlich den Ausgang des Codes zur Verfügung gestellt):


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 

Wenn Sie eine große Datei (I a ~ 1 GB-Datei verwendet), Sie können diese rspec-Tests (in scp_spec.rb) verwenden oder sie in alle Test-Kabelbäume ändern, mit denen Sie vertraut sind, um diese Leistungseinbußen zu erkennen.

Wenn Sie nicht wissen, wie diese Leistung in der Bibliothek verbessert werden kann, haben Sie weitere Ideen, wie Sie zusätzliche SCP-Übertragungen parallel öffnen und nicht nur das Dienstprogramm scp über eine Subshell aufrufen?

Rspec Test hier: https://gist.github.com/703966

Antwort

-3

Sie könnten Net-sftp stattdessen versuchen. Sftp ist ein neueres Protokoll und das Linux-scp-Dienstprogramm verwendet das Sftp-Protokoll, wenn es verfügbar ist. Ich weiß nicht, ob net-scp tatsächlich das sftp-Protokoll verwendet, aber ich wäre nicht überrascht, wenn das nicht der Fall wäre.

Sie könnten auch versuchen, rsync, aber das würde erfordern Installation von rsync auf dem Remote-Host.Rsync ist bei weitem der König der Geschwindigkeit mit Remote-Dateiübertragungen, obwohl ich nicht für die Sechs-Rsync-Juwel verbürgen kann.