Ubuntu 11.10でcpコマンドとsnowcpのファイルコピー速度を比較してみた(XFS編)
※2012年9月10日、続き。
※2011年11月18日、最下部に追記。
前回のベンチマークではcpコマンドとsnowcpの差が結構出ていたのだが、utさんにコメントを頂いた際にUbuntu 11.10 + ext4の組み合わせで改めてテストしてみたところ、速度差はほとんどなかった。cpコマンドは速い。
Ubuntu 11.10に移行してから大きめのファイルはXFSなパーティションに保存するようにしたのだが、XFSを使うのはほぼ初めてなのでどれくらいの速さなのか調べてみた。測定方法は前回とほぼ同じで以下の通り。
- それらを、それぞれSSDからHDDに2回ずつコピー。
- timeコマンドで実行時間を計測。
- 一度コピーした後にPCをシャットダウンしているのでキャッシュの影響は無し。
- XFSのマウントオプションは、noatime,nodiratime,osyncisdsync,logbufs=8。
- cpコマンドはオプション無しで実行。
- snowcpのバッファサイズは32MB。
- snowcpでコピーする際、fallocateを使って事前に領域を確保し、断片化を低減。
- snowcpでバッファサイズを超えるテストファイル(100MB・500MB・1GB)をコピーする際、マルチスレッドで並行コピー。
- snowcp 0.13.0 betaで100MB・500MB・1GBのファイルをコピーする際、O_DIRECTフラグ(Direct I/O)を使用。
以下結果(単位は秒)。
cp | snowcp 0.12.5 beta | snowcp 0.13.0 beta | |
1MB | 0.011 | 0.010 | 0.011 |
10MB | 0.058 | 0.060 | 0.059 |
100MB | 0.581 | 0.590 | 0.660 |
500MB | 4.534 | 4.566 | 3.426 |
1GB | 9.458 | 9.250 | 6.924 |
- 1MB・10MBでは差が無い。
- 100MBではsnowcp 0.13.0 betaがやや遅い。100MB程度ではO_DIRECTを使うと逆に遅くなるのか?
- 500MBではsnowcp 0.13.0 betaが他よりも1秒ほど速い。cpと0.12.5 betaの速度はおよそ110MB/s、0.13.0 betaはおよそ145MB/s。結構な差。
- 1000MBでも速度差は変わらず。0.12.5 betaの速度が思ったほど出ない。単にマルチスレッドにしただけでは意味がないのか?
今回分かったこと。
- XFSなパーティションに大きなファイルを書き込む場合、O_DIRECTを使用しないと速度が出ない。
- 小さめのファイルをコピーする際はO_DIRECT無しの方が速度が出るっぽい(事前に何度かテストしてそう感じたような気がする)。
- 並行コピーする意味はない。ただ、snowcpではファイルの読み込みにmmapを使用しているので、そこをreadに変えてfadviseを使えばもっと速度が出るかも?
※2011年11月18日。マウントオプションのosyncisdsyncは廃止されたらしい。付けてもエラーは表示されないが、/proc/mountsの内容は付けない場合と同じになる。nodiratimeはxfs.txtには書かれていないが効果はあるっぽい。