Toconangoのブログ

プログラミングのユルフワ備忘録です。間違った記載等ありましたらご連絡頂けますと幸いです。

tarコマンドの負荷を減らしたい cstreamを使ってみた

今回やりたいこと

tarコマンドを使って、深夜にバックアップを行っているのですが、
バックアップ中にCPU使用率が上昇しアラートが上がってしまい困っています。
これを、なんとかしたい‥

前提として、負荷制御に関するいろいろ

負荷制御する 〜cstream以外の方法

CPU負荷とI/O負荷は違います。

今回制御したいのは、CPU負荷です。

sleepしながらゆっくり実行とかの方法もあるようです。 が、

CPU使用率を下げる目的でSleep(0)を呼び出すのは正しくない気がします。

とのこと。*1

nice(プロセスの優先度を指定するコマンド)を使う方法もありますが、

深夜に実行してるバッチの負荷を下げる目的なので、

今回の目的にはあまり効果がないかもです。

ちなみにI/O負荷を下げる目的では、

ioniceを使ったりする、らしい。*2

負荷を確認する方法いろいろ

下記の記事参考にさせていただきました。

Linuxサーバの負荷や使用率を調査するコマンドと手順 | EasyRamble

TOPコマンドを使いこなしてTOPを狙う。 - コンピュータクワガタ

負荷制御する 〜cstreamについて

cstreamは、ファイルシステムのキャッシュを使わずに書き込んだり、 書き込みの帯域を制限できたり デバイスへの書き込み処理の際にごにょごにょしてくれるもののようです。

です。*3

その他、下記の記事参考にさせていただきました。

tarコマンドを負荷制御(bwlimit指定)して実行する方法 - SHANON Engineer's Blog

大量データを「cstream」で捌く! | ADMAGE blog ―技術者目線のアドテク知識発信ブログ―

Postgresフルバックアップ時の負荷を下げたい | 東京うぇ部

実際に行ったインストール方法、使い方などは、以下の通りです。

本題、cstreamを使って負荷制御

環境

CentOS Linux release 7.0.1406 (Core)
x86_64

cstreamのインストール

rpmでインストール

rpmこちら

$ wget http://pkgs.repoforge.org/cstream/cstream-3.1.0-1.el6.rf.x86_64.rpm

$ sudo rpm -ivh cstream-3.1.0-1.el6.rf.x86_64.rpm

yumでインストール

rpmforge-releaseダウンロード

$ wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm

RPMforgeリポジトリインストール

$ sudo rpm -ivh rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm

ダウンロードしたファイルを削除

$ sudo rm -f rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm

rpmforge-releaseアップデート

$ sudo yum -y update rpmforge-release

cstreamインストール

ただinstallするだけだと、el7のrpmが存在しないためインストールできません。

$ sudo yum -y install cstream
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * rpmforge: ftp.riken.jp
 * updates: ftp.riken.jp
パッケージ cstream は利用できません。
エラー: 何もしません

el7のrpmが存在しないため、el6を利用できるよう、下記を追加

$ sudo vi /etc/yum.repos.d/rpmforge.repo
[rpmforge-el6]
name = RHEL $releasever - RPMforge.net - dag
baseurl = http://apt.sw.be/redhat/el6/en/$basearch/rpmforge
mirrorlist = http://mirrorlist.repoforge.org/el6/mirrors-rpmforge
#mirrorlist = file:///etc/yum.repos.d/mirrors-rpmforge
enabled = 0
protect = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag
gpgcheck = 1

インストール

(※yumで負荷の上がる華奢なサーバーなのでniceを使いました。)*4

$ sudo nice -n 19 yum -y install cstream --enablerepo=rpmforge-el6

cstreamを使ってtarのスループットを1MB/secに制御

制御前の処理内容

tar cvzf backup.zip \
         -C /var \
         www/data/config/ \
         www/data/logs/ \
         www/html/upload

1MB/secに制御

BW=1
tar cvzf - \
         -C /var/ \
         www/data/config/ \
         www/data/logs/ \
         www/html/upload \
         | cstream -t  $((${BW}*1024*1024)) > \
         backup.zip

これでCPU負荷下げることできました。 終わり。