SCP のアップロード速度は、コマンド ラインの scp ユーティリティでできることから、ライブラリでは大幅に制限されているようです。これが Ruby (1.9.2-p0) であることは理解していますが、Net::SCP は Linux ユーティリティよりも約 8 倍遅くなります (大きなファイルを使用すると表示されます... 以下を参照)。これが Ruby のソケットの仕組みなのか、それとも Net::SCP ソケットをより適切に多重化できるのか知りたいです (コードをざっと見てみました)。
私が試したアップロードのスタイル (シリアル アップロード、非同期で動作するチャネル、scp オブジェクトの複数のインスタンスを使用) に関係なく、SCP アップロードで 9 メガバイト/秒を超える転送速度を達成できないことに気付きました。では、私の調査の詳細を説明しましょう。
1) さまざまな暗号化アルゴリズムを試した
速度を大幅に変更することなく、さまざまな種類の暗号化を使用しました。例: コマンド ライン scp (暗号化アルゴリズム = arcfour128) を使用して 1GB のテスト ファイルを送信し、内部ギガビット接続で 73.3 メガバイト/秒の転送速度を得ることができました。Net::SCP.upload ライブラリを使用して、内部ギガビット接続で約 9 メガバイト/秒を超えることはありませんでした。
2) 異なるホスト/OS を試した
Linux -> Linux アップロードが最速であることがわかりました。SUA の ssh サーバー (Windows) は最大 13.5 メガバイト/秒のアップロード速度しか提供できませんでしたが (Linux -> Windows、scp コマンド ラインで arcfour アルゴリズムを使用)、Linux -> Linux (scp コマンド ラインで arcfour を使用) ) は驚異的な 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
ファイルが大きい場合 (私は ~1GB のファイルを使用しました)、これらの rspec テスト (scp_spec.rb 内) を使用するか、使い慣れたテスト ハーネスに変更して、このパフォーマンスの低下を確認できます。
ライブラリでこのパフォーマンスを改善する方法がわからない場合は、サブシェル経由で scp ユーティリティを呼び出すだけでなく、SCP 転送の並列速度をさらに向上させる方法について何かアイデアはありますか?
Rspec テストはこちら: https://gist.github.com/703966