Net::FTP の転送モードと転送速度
前にもはまったんだけどねぇ。
Perl の Net::FTP のデフォルトの転送モードは ascii なんです。で、ascii モードで転送すると遅いよ、ってのが今日のお話。
普通の FTP で 1GB のデータを送ると 20秒ちょいで終わるのに、Net::FTP を使うと1分くらいかかって、「なんでかなー」と思っていて、「そういえばデータを送ってるのに、ascii で送るのっておかしくね?」と思って、binary 転送したらめっちゃ早くなったという次第。
再現する簡単なサンプルはこんな感じ。1GB の 1gfile を用意してください。
#!/usr/bin/perl use strict; use warnings; use Net::FTP; my $file = "1gfile"; my $start = time(); my $ftp = Net::FTP->new("testserver"); $ftp->login("testuser", "testuser"); $ftp->binary(); $ftp->cwd("/var/tmp"); $ftp->put($file); $ftp->close; my $end = time(); my $elapsed = $end - $start; print "elapsed: $elapsed sec\n";
で、コレを実行すると、
tsucchi@test[546]$ perl a.pl elapsed: 13 sec
まあギガビットイーサなら普通の速さですね。ところが、ftp->binary() をコメントアウトすると、
tsucchi@test[548]$ perl a.pl elapsed: 78 sec
なんと 6倍も遅くなってしまうのです。でかいデータを送る場合は、テキスト/バイナリ、改行コードを問わずバイナリモードで送っちゃうのがいいかなぁ、と思います。