tarコマンドを負荷制御(bwlimit指定)して実行する方法

このエントリーをはてなブックマークに追加
ちょっと個人的に便利なTipsだったのでメモついでにBlog書いてみました。

tar.gz形式でディレクトリを圧縮するシーンは日常でよく目にしますよね?ただtarさん本気出しすぎるとDiskIOを食いつぶしてしまいそうになるのでnice/ioniceで制限!でもあんまり制限されてない・・・なんて事も良くあります。
運用中のサーバでも安心してtarできるようにどうにかできないかな?と調べてたらcstreamコマンドを使うという良い方法がありましたので個人的なメモついでにBlogで共有しようかなと思いポストです。

■cstreamコマンドで帯域制御

cstreamコマンドとは

cstream(1)                BSD General Commands Manual               cstream(1)
NAME
     cstream - direct data streams, with bandwidth limiting, FIFO, audio, duplication and extended reporting support.

ざっくり言うとデータストリームの制御とかできるよ!っていうコマンドっぽいです。オーディオアプリケーションのデータレートのエミュレーションとかで利用されているそうです。オプションではcstreamコマンドの-tを使うのですが、以下がmanでの内容になります。


   -t num    Limit the throughput of the data stream to num bytes/second. Limiting is done at the input side, you can rely on cstream not accepting more than this rate. If the number you give is positive, cstream accumulates errors and tries to keep the overall rate at the specified value, for the whole session. If you give a negative number, it is an upper limit for each read/write system call pair. In other words: the negative number will never exceed that limit, the positive number will exceed it to make good for previous underutilization.



バイト/秒単位でスループットの制御ができるみたいですね。


■cstreamコマンド×tarコマンド


帯域制御するためにcstreamコマンドを経由させる必要があるので、tarを標準出力に出して、パイプでつなげてcstreamに渡してあげれば良さそうです。

以下の様な感じで実行してあげましょう

$ BW=1 # 今回は1MB/secで検証
$ tar zcfp - source_dir | cstream -t $((${BW}*1024*1024)) > target_file.tar.gz

tar を - オプションで標準出力に出して、パイプでcstreamコマンドに渡してあげてリダイレクト。簡単ですね。


実際に帯域制御できているのか検証してみましょう


$ du -s source_dir/
1808976 source_dir/

※ 約1.8GBあるディレクトリを圧縮する

1MB/secで作成

$ BW=1
$ time tar  zcfp - source_dir  | cstream -t  $((${BW}*1024*1024)) > /tmp/target_file.tar.gz

real    10m0.135s
user    2m48.445s
sys     0m11.029s

$ du -s /tmp/target_file.tar.gz
614896 /tmp/target_file.tar.gz
※ 約10分で圧縮完了(約600MBに圧縮)

2MB/secで作成

$ BW=2
$ time tar  zcfp - source_dir  | cstream -t  $((${BW}*1024*1024)) > /tmp/target_file.tar.gz

real    5m0.082s
user    2m47.548s
sys     0m9.741s

$ du -s /tmp/target_file.tar.gz
614896 /tmp/target_file.tar.gz
※ 約5分で圧縮完了(約600MBに圧縮)


ちゃんと倍のbwlimit指定したら倍の速さで圧縮ができました。vmstat/iostatを見ても負荷も抑えられてたので期待通りの動きをしてくれました。良いですね。

運用中のサーバのバックアップを取るシーンでは重宝しそうな感じです。これの応用でデータベースのDump取得の負荷制御もできそうです。(SCP/rsyncは標準で帯域制御のオプションがついているのでそれを使う)

これでバックアップの負荷のせいでNagiosアラートがなるなんて事も減りそうです。
次の記事
« Prev Post
前の記事
Next Post »
Related Posts Plugin for WordPress, Blogger...