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を使うのはほぼ初めてなのでどれくらいの速さなのか調べてみた。測定方法は前回とほぼ同じで以下の通り。

  • ddコマンドでSSDにテストファイルを作成(例:dd if=/dev/zero of=1mb bs=1M count=1)
  • それらを、それぞれ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を使えばもっと速度が出るかも?
  • fallocateのコストは気にしなくていい。対応しているファイルシステムでは積極的に使うべき(Ubuntu 11.10のext4のfallocateは腐っているが)。


※2011年11月18日。マウントオプションのosyncisdsyncは廃止されたらしい。付けてもエラーは表示されないが、/proc/mountsの内容は付けない場合と同じになる。nodiratimeはxfs.txtには書かれていないが効果はあるっぽい。