Ubuntu 11.04でcopybench-1.0を実行してファイルコピー速度を比較してみた(ついでにcpコマンドとsnowcpも)

※2014年8月2日、表を縦に修正。

※2011年11月6日、続き

※2011年6月14日、ちょっとだけ修正。

copybenchUNIX系OS用のファイルコピー速度ベンチマークツールのようなもの(read・write・mmapなどのシステムコールの速度を計れる)。ついでにcpコマンドとsnowcpの速度も調べて、ベンチマークツールと実用ツールの速度差を比較してみた。

測定はC言語: UNIX最速ファイルコピーを参考にして、以下のように行った。

  • ddコマンドでHDD1にテストファイルを作成。
  • それらのテストファイルを、各ツールでHDD1からHDD2にコピー(計3回ずつ)し、最も良い結果を計測。
  • 一回コピーする毎に sync を5回以上実行した上で sudo sysctl -w vm.drop_caches=1 を実行してページキャッシュを破棄。
  • HDDのファイルシステムext4
  • cpコマンドはオプション無しで実行。
  • snowcpのバージョンは0.8.11 beta、バッファサイズは64MB。
  • snowcpでバッファサイズを超えるテストファイル(100MB・500MB・1GB)をコピーする際、マルチスレッドで並行コピー。
  • snowcpでのファイルコピーは、mmap + madvise + writeで行っている(mw_madvと似た方法)。

以下結果(単位は秒)

- 1MB 10MB 100MB 500MB 1GB
rw 0.083 0.244 1.541 6.802 13.400
rw fadv 0.080 0.245 1.618 6.061 12.213
mm sync 0.058 0.237 1.536 6.933 13.731
mm sync madv 0.079 0.240 1.553 7.071 13.469
mw 0.085 0.239 1.580 7.080 13.681
mw madv 0.075 0.227 1.548 7.091 13.812
cp 0.011 0.081 1.272 6.612 13.434
snowcp 0.029 0.081 0.874 4.704 9.742

- 1MB 10MB 100MB 500MB 1GB
rw 7位 7位 4位 4位 3位
rw fadv 6位 8位 8位 2位 2位
mm sync 3位 4位 3位 5位 7位
mm sync madv 5位 6位 6位 6位 5位
mw 8位 5位 7位 7位 6位
mw madv 4位 3位 5位 8位 8位
cp 1位 1位 2位 3位 4位
snowcp 2位 1位 1位 1位 1位
  • 1MB
    mm_syncがやや速い。これぐらいの大きさならmmapを使った方が効率がいいのか?cpコマンドの速度は異常、何かがおかしい。
  • 10MB
    copybenchはどれも似たような結果(mw_madvがやや速いが)。snowcpがcpコマンドに並んだ。
  • 100MB
    rw_fadvがやや遅く、他はほぼ同じ速度。snowcpはマルチスレッドの効果か、cpコマンドよりも速い結果に。
  • 500MB
    fadviseの効果が出始めたのか、rw_fadvがcpコマンドを抜いた。mw_madvが最下位に急落、rw_fadvに1秒ほど差をつけられた。ファイルサイズが大きすぎるとmadviseは効果が無いのか?
  • 1GB
    fadviseおかげか、rw_fadvが速い。madviseはあまり効果が無いのか、mm_sync_madvとmw_madvの速度はイマイチ伸びず。cpコマンドは素のrwにも抜かれてしまったが、誤差の範囲内だと思いたい。

copybenchの中では、小さめのファイルはmm(mmap + mmap)が、大きめのファイルはrw(read + write)、rw_fadv(read + write + fadvise)が速い結果に。それでも数年前に比べると差は縮まっている様子。

rw_fadvを見る限りでは、小さいファイルへのfadviseは意味がないらしい。100MBって小さいとは言えないというか、10MBでも十分大きなファイルと言えると思うんだが、それはともかく。

madviseはあまりあてに出来ない印象。mwで使うと速くなるが、mmだと逆に遅くなるっぽい。

mmやmwの500MB以上の結果を見る限り、大きなファイルを一度のシステムコールでコピーするのは避けた方がいいかも。っと書いた後でmmap-write.cをよく見たらfor文使って複数回writeしてた。あれだ、大きいファイルをmmapで読み込むことが間違ってるんだ、きっと。

素のmw(mmap + write)は遅い。mw_madvもそんなに速くはないが、内部で似たようなことをしているsnowcpは速いので、やり方次第で速くなるということか?

cpコマンドは大きいファイルのコピーには向かないのか、1GBではrw_fadvに1秒も差をつけられている。

snowcpは思っていた以上に速かった。やはり別HDD間でのファイルコピーにはマルチスレッドが有効らしい。スレッドを使わない、小さなファイルのコピーも速かったのは予想外。