ローカルネットワークでscpってもったいないよね

せっかくなんで小ネタを1つ。

LAN内でファイルを転送したいときに、セキュリティとかチョウどうでもいいのにscpしてきっと無駄してるんだろうなーとか思うじゃないですか。たとえば

ichii386@count% iperf -c bigbird
------------------------------------------------------------
Client connecting to bigbird, TCP port 5001
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[  3] local 10.0.21.1 port 47091 connected with 10.0.21.3 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec    112 MBytes  93.7 Mbits/sec

くらいのネットワークで、700MBくらいの iso イメージファイルを転送したいとします。

無難にscpすりゃあいいんですけど、できたらsecureにするとこにCPU使いたくない。でもrcpとかinetdとかめんどうなのはイヤ。そういやrsyncってデーモンになれるんだよね!

rsync --daemon

ということで思い立ってrsyncd.confを書いてみました。いつも立ちあげっぱにするんじゃなくて、必要なときにforegroud jobでちょろっと実行するイメージです。

以下のような設定ファイル (rsyncd.conf) をどっかに置きます。

log file = /home/ichii386/rsyncd.log
pid file = /home/ichii386/rsyncd.pid

[test]
path = /home/ichii386/pub
lock file = /home/ichii386/rsyncd.lck
read only = no
use chroot = no

これで送信先

ichii386@bigbird% rsync --daemon --no-detach --config=rsyncd.conf --port=10873

と起動して、送信元から

ichii386@count% rsync -avP hoge.iso rsync://bigbird:10873/test/

とやってあげる。

比較対象

openssh のソース見ると cipher.c に

struct Cipher {
    char    *name;
    int number;     /* for ssh1 only */
    u_int   block_size;
    u_int   key_len;
    u_int   discard_len;
    const EVP_CIPHER    *(*evptype)(void);
} ciphers[] = { 
    { "none",       SSH_CIPHER_NONE, 8, 0, 0, EVP_enc_null },
    { "des",        SSH_CIPHER_DES, 8, 8, 0, EVP_des_cbc },
    { "3des",       SSH_CIPHER_3DES, 8, 16, 0, evp_ssh1_3des },
    { "blowfish",       SSH_CIPHER_BLOWFISH, 8, 32, 0, evp_ssh1_bf },

とか書いてある割に、 "ssh -cnone" ってできないんですよね。

そんなで、以下がどれくらい違うのかを適当に比較してみました。ネットワークが落ち着いてそうな時に1回計測しただけです。

  1. ふつうに scp (aes128-cbc になるのかな?)
  2. scp -cblowfish
  3. ふつうにrsync (-e 'ssh -caes128-cbc' ?)
  4. rsync -e 'ssh -cblowfish'
  5. rsync --daemon

結果

ふつうにscp
os200805.iso                        100%  686MB   3.8MB/s   03:03

real    3m3.294s
user    2m44.610s
sys     0m16.121s
scp -cblowfish
os200805.iso                        100%  686MB   4.5MB/s   02:33

real    2m33.260s
user    2m17.429s
sys     0m14.285s
ふつうにrsync
os200805.iso   719087616 100%    4.53MB/s    0:02:31 (xfer#1, to-check=0/1)

sent 719175494 bytes  received 31 bytes  4715905.08 bytes/sec
total size is 719087616  speedup is 1.00

real    2m31.886s
user    2m14.976s
sys     0m15.137s
rsync -e 'ssh -cblowfish'
os200805.iso   719087616 100%    3.54MB/s    0:03:13 (xfer#1, to-check=0/1)

sent 719175494 bytes  received 31 bytes  3697560.54 bytes/sec
total size is 719087616  speedup is 1.00

real    3m13.904s
user    2m57.519s
sys     0m14.449s
rsync --daemon
os200805.iso   719087616 100%   11.05MB/s    0:01:02 (xfer#1, to-check=0/1)

sent 719175490 bytes  received 27 bytes  11506808.27 bytes/sec
total size is 719087616  speedup is 1.00

real    1m2.255s
user    0m2.548s
sys     0m3.772s

うん、速くなってる気がする。

まとめ

もちろんこの手の話はとてつもなく状況に依存するわけですが、この例みたいに、scpしてるあいだsshがひたすらCPU食ってるような場合はけっこう変わるんじゃないかとおもいます。送信元でtopしてると、scpのときはずっと96%くらい使ってたし、user/sysの比もそんなかんじ。

rsync -zもそうだけど、とっさに「どうするのがいい」って出てくるかどうかって、単に慣れですよね。ほんと。