scpがなぜそんなに遅く、どのように速くすることができますか?

scpがなぜそんなに遅く、どのように速くすることができますか?

バッチファイルをコピーしようとしていますが、scp非常に遅いです。以下は、10個のファイルがある例です。

$ time scp cap_* user@host:~/dir
cap_20151023T113018_704979707.png    100%  413KB 413.2KB/s   00:00    
cap_20151023T113019_999990226.png    100%  413KB 412.6KB/s   00:00    
cap_20151023T113020_649251955.png    100%  417KB 416.8KB/s   00:00    
cap_20151023T113021_284028464.png    100%  417KB 416.8KB/s   00:00    
cap_20151023T113021_927950468.png    100%  413KB 413.0KB/s   00:00    
cap_20151023T113022_567641507.png    100%  413KB 413.1KB/s   00:00    
cap_20151023T113023_203534753.png    100%  414KB 413.5KB/s   00:00    
cap_20151023T113023_855350640.png    100%  412KB 411.7KB/s   00:00    
cap_20151023T113024_496387641.png    100%  412KB 412.3KB/s   00:00    
cap_20151023T113025_138012848.png    100%  414KB 413.8KB/s   00:00    
cap_20151023T113025_778042791.png    100%  413KB 413.4KB/s   00:00    

real    0m43.932s
user    0m0.074s
sys 0m0.030s

不思議なことに、転送速度は413KB/s程度で、ファイルサイズは413KB程度なので、実際には1秒に1つのファイルを転送する必要がありますが、各ファイルあたり約4.3秒かかります。

このオーバーヘッドがどこで発生するのか、そしてより速くする方法はありますか?

答え1

単一の接続を使用してすべてのソースファイルを転送するrsync(over)を使用できます。ssh

rsync -avP cap_* user@host:dir

1つもなければrsync(なぜダメですか??)tarwith this を使用すると、一時sshファイルの生成を回避できます(両方のオプションは同じです)。

tar czf - cap_* | ssh user@host tar xvzfC - dir
tar cf - cap_* | gzip | ssh user@host 'cd dir && gzip -d | tar xvf -'

rsync他のすべての条件が同じであれば、停電時に再開することができるので好ましい。

答え2

@wurtelでコメントおそらく正しいでしょう。各接続を確立するには多くのオーバーヘッドがあります。この問題を解決できれば転送速度が速くなります(そうでない場合は@を使用してください)。Emma Luoのrsyncソリューション)。同じサイズのファイルhead -c 417K /dev/urandom > foo.1を接続するのに時間がかかるホスト(HOST4)と非常に迅速に応答するホスト(HOST1)に転送し、ファイルのいくつかのコピーを作成する実験を行いました。

$ time ssh $HOST1 echo


real    0m0.146s
user    0m0.016s
sys     0m0.008s
$ time scp * $HOST1:
foo.1                                         100%  417KB 417.0KB/s   00:00    
foo.2                                         100%  417KB 417.0KB/s   00:00    
foo.3                                         100%  417KB 417.0KB/s   00:00    
foo.4                                         100%  417KB 417.0KB/s   00:00    
foo.5                                         100%  417KB 417.0KB/s   00:00    

real    0m0.337s
user    0m0.032s
sys     0m0.016s
$ time ssh $HOST4 echo


real    0m1.369s
user    0m0.020s
sys     0m0.016s
$ time scp * $HOST4:
foo.1                                         100%  417KB 417.0KB/s   00:00    
foo.2                                         100%  417KB 417.0KB/s   00:00    
foo.3                                         100%  417KB 417.0KB/s   00:00    
foo.4                                         100%  417KB 417.0KB/s   00:00    
foo.5                                         100%  417KB 417.0KB/s   00:00    

real    0m6.489s
user    0m0.052s
sys     0m0.020s
$ 

答え3

移籍交渉には時間がかかります。一般的に言えば、運営N記録したもの第二各バイトは、単一のファイルに対する単一の操作よりもはるかに長くかかります。N*第二バイト。たとえば、ディスクI / Oの場合も同様です。

詳しく見ると、この場合、転送速度は次のようになります。ファイルサイズ/第二。

ファイルをより効率的に転送するには、ファイルをtartarballで囲んでから転送します。

tar cvf myarchive.tar cap_20151023T*.png

またはアーカイブを圧縮したい場合は、

tar cvzf myarchive.tar.gz myfile*

圧縮するかどうかはファイルの内容によって異なります。 JPEGまたはPNGの場合、圧縮は適用されません。

答え4

scpが予想よりも遅いもう1つの理由(特に高帯域幅ネットワークでは)は、最終的にネットワークパフォーマンスのボトルネックになる可能性がある内部フロー制御バッファを静的に定義したためです。

HPN-SSHこれらのバッファのサイズを大きくするOpenSSHのパッチバージョンです。作るたくさんscp配信速度の違い(ウェブサイトのチャートをご覧ください。しかし、個人的な経験でもお話ししています)。もちろん、これらの利点を得るには、すべてのホストにHPN-SSHをインストールする必要がありますが、大量のファイルを頻繁に転送する必要がある場合はそれほど価値があります。

関連情報