Ubuntu 11.04でcopybench-1.0を実行してファイルコピー速度を比較してみた(ついでにcpコマンドとsnowcpも)
※2014年8月2日、表を縦に修正。
※2011年11月6日、続き。
※2011年6月14日、ちょっとだけ修正。
copybenchはUNIX系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間でのファイルコピーにはマルチスレッドが有効らしい。スレッドを使わない、小さなファイルのコピーも速かったのは予想外。