cp と rsync 実行速度と負荷の違いを計測してみた
mvコマンドは、パーティションが異なる移動の場合、ファイルをコピーして、コピー元ファイルを削除するという処理の流れになるかと思います。
ここでのファイルのコピーは、cpコマンドとほぼ同じ動作になります。
しかし、rsyncは、ちょっと違います。
rsyncは、そもそも同期をとる、あるいは、バックアップ採取用のコマンドなので、必ず、コピー元とコピー先の違いを確認しようとします。
(ざっくりとした説明ですが)その違いを確認するためにコピー元とコピー先のおなじエリア(ブロック)のチェックサムを作成し、それを比較することで同じかどうかを判定しています。
そのため、チェックサムを作成する分、CPUに負荷がかかります。
逆に、CPUに負荷がかかっている間は、HDDの負荷は軽減するんです。
では、実際に、cp と rsync とで 処理時間を計測し、その時の負荷を比較してみましょう。
ここでは、/var , /var2 は、パーティションの異なるディレクトリとします。
また、timeコマンドは、処理の時間を計測するコマンドです。
$ time ls -l /var/aaa.bin
-rw-r--r-- 1 root root 4294967296 6月 15 08:57 /var/aaa.bin
real 0m0.078s
user 0m0.000s
sys 0m0.004s
|
このように指定すると lsコマンドが要した処理時間が出力されます。
- real : 実際にリアクションが戻るまでの時間
- user : 実行したプログラムが要した時間
- sys : OSが要した時間
cpコマンドを使ってコピーしてみる
cpコマンドを使って、単純に /var/aaa.bin → /var2/aaa.bin へコピーします。
$ time cp /var/aaa.bin /var2/aaa.bin
real 0m34.131s
user 0m0.076s
sys 0m13.528s
|
この結果から、このファイルをコピーするのに34秒かかったことがわかります。
rsyncコマンドを使ってコピー(制限無)してみる
rsyncコマンドを使って、単純に /var/aaa.bin → /var2/aaa.bin へコピーします。
また、ここでは、-av オプションを指定しています。それぞれ以下の意味になります。
- -a : アーカイブモード(ファイル属性もコピーする)
- -v : 状況を出力する
$ time rsync -av /var/aaa.bin /var2/aaa.bin
sending incremental file list
/var/aaa.bin
sent 4,296,015,959 bytes received 35 bytes 86,788,201.90 bytes/sec
total size is 4,294,967,296 speedup is 1.00
real 0m48.429s
user 0m41.772s
sys 0m24.264s
|
この結果から、このファイルをコピーするのに48秒かかったことがわかります。
cpコマンドと比べて、約1.5倍遅いのがわかります。
rsyncコマンドを使ってコピー(制限有)してみる
rsyncコマンドを使って、帯域制限(bwlimit オプション)を指定して /var/aaa.bin → /var2/aaa.bin へコピーします。
bwlimitオプションは、帯域制限をKBPS(kilobytes per second)で指定することで、CPUの負荷、HDDの負荷、あるいは、ホスト間であれば、ネットワークの負荷をコントロールすることができます。
もちろん、ここでは、ローカルディスク間となりますが、その場合でも、このオプションを使って負荷をコントロールすることができます。
$ time rsync -av --bwlimit=20000 /var/aaa.bin /var2/aaa.bin
sending incremental file list
/var/aaa.bin
sent 4,296,015,959 bytes received 35 bytes 20,408,627.05 bytes/sec
total size is 4,294,967,296 speedup is 1.00
real 3m30.003s
user 0m44.960s
sys 0m25.376s
|
この結果から、このファイルをコピーするのに3分30秒かかったことがわかります。
rsyncコマンドの制限無時から比べて、約4倍遅いのがわかります。
vmstat で負荷をグラフ化してみる
先のコマンドでファイルをコピーした際のシステム状態を vmstat コマンドでモニタリングした結果をグラフ化したものが以下の図です。
cpコマンドでは、cpuの負荷以上にHDDへの負荷が強烈にかかっているのがわかるかと思います。
rsyncコマンド(制限無)では、HDDへの負荷は少ないですが、cpuへの負荷が高くなっています。
rsyncコマンド(制限有)では、cpuおよびHDDへの負荷は少ないですが、時間が長くなっています。
このように 思った通りにCPUおよびHDDの負荷がかかっているがわかるかと思います。
rsync は、ローカルディスク間でも使えるので便利ですね。
cpu負荷が高くなるのは、ちょっと・・・と思われる方も多いと思いますが、最近のcpuはコア技術が発達したのもあって、ある程度、負荷が掛かっても他のプロセスへ与える影響も小さくなっています。
また、特に最近では、大きなファイルを扱うことが多くなりました。
そういうこともあいまって、HDDの負荷が致命的な場面も増えてきたのは間違いないのではないでしょうか。
HDDの負荷軽減には、いろんな回避策はあるかと思いますが、cpコマンドやmvコマンドの代わりに rsyncを一度試されるのも良いかもしれません。一つの解決策になるかもしれません。
コメントを投稿 :