ブログトップ 記事一覧 ログイン 無料ブログ開設

理想未来はどうなった? このページをアンテナに追加 RSSフィード Twitter

2011-12-17

rsyncの負荷を抑える方法

リモートサーバーとのファイル同期の際にrsyncコマンドを使用すると便利ですが、特に何も指定しない場合は全力で働いてくれるため負荷が掛かります。
rsyncの負荷を抑える方法について、いくつか記載したいと思います。



1. 転送速度を調整する

bwlimitオプションを付けることで、転送する速度を調整できます。
指定する値の単位はKbps単位で指定すします。
例えば、1MB/secの場合は 1024KB/sec→8192 Kbps/secなので --bwlimit=8192を指定します。

rsync -e "ssh" --bwlimit=8192 remotehost:/remote_srcdir/ /local_destdir 


2. sshを使用する場合、負荷の低い暗号方式でCPU負荷を抑える

ssh経由でrsyncを使用する場合、セキュリティ上特に問題がなければ arcfour(RC4)のように負荷の低い暗号方式を使用することでCPU負荷を抑えることが可能です。

rsync -e "ssh -c arcfour" remotehost:/remote_srcdir/ /local_destdir 


3. ローカルサーバー側の負荷を抑える

ローカルサーバー側のrsyncの負荷を抑えるにはioniceおよびniceを使用することで抑えることが可能です。

ionice -c3 nice -n 19 rsync -e "ssh" --bwlimit=8192 remotehost:/remote_srcdir/ /local_destdir 


4. リモートサーバー側の負荷を抑える(sshを使用する場合)

sshを使用している場合にリモートサーバー側の負荷を抑えるには rsync-pathオプションでioniceおよびniceを指定した上でrsyncが実行されるようにすることで負荷を下げることが可能です。

rsync -e "ssh" --rsync-path="ionice -c3 nice -n 19 rsync" remotehost:/remote_srcdir/ /local_destdir


5. リモートサーバー側の負荷を抑える(xinetdを使用する場合)

リモート側がxinetdを使用している場合、niceだけであれば/etc/xinetd.d/rsyncでniceを指定することで優先度を下げることができますが、ioniceまで指定する場合は、rsyncをラップするスクリプトを作成しrsyncの前にioniceおよびniceを実行することで優先度を下げることが可能です。


例えば、ラップするスクリプトを /usr/local/bin/slow_rsync.sh として下記のような内容で作成します。

#!/bin/bash

/usr/bin/ionice -c3 /bin/nice -n 19 /usr/bin/rsync $@

作成したスクリプトに実行権限を与えます。

# chmod +x /usr/local/bin/slow_rsync.sh

/etc/xinetd.d/rsyncを修正

# default: off
# description: The rsync server is a good addition to an ftp server, as it \
#	allows crc checksumming etc.
service rsync
{
	# disable	= yes
	disable		= no
	socket_type     = stream
	wait            = no
	user            = root
	#server          = /usr/bin/rsync
	server          = /usr/local/bin/slow_rsync.sh
        # server_args     = --daemon
	server_args     = --daemon --config=/etc/rsyncd.conf
	log_on_failure  += USERID
        only_from       = 192.168.1.0/24 127.0.0.1
}

/etc/rsyncd.confを編集します。
既に用意されている場合は変更の必要はありませんが、テストするための仮の設定として以下のような内容で記載します。

#
# Global
#
uid = nobody
gid = nobody

#
# www file modules
#
[www]
        path = /var/www
        use chroot = no
        read only = yes

xinetdをリロードします。

# service xinetd reload


実際に反映されているか確認してみます。

$ dd if=/dev/zero of=/var/www/html/tmpfile bs=1 count=0 seek=1G
$ mkdir -p /var/tmp/dest
$ cd /var/tmp/dest 
$ rsync -az 127.0.0.1::www/html ./ & 
$ ionice -p`pgrep -u nobody rsync` 
idle: prio 7
$ ps -lu nobody
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 R    99 26515 26514 67  95  19 - 17274 -      ?        00:00:00 rsync

ioniceがidle(-c3) prio 7(最低)
psの結果がNI 19と最低優先度で実行されていることがわかるかと思います。



以上、上記組み合わせることで大幅に負荷を下げることができると思います。
何らかのお役に立てれば幸いです。

参考

リモートサーバー側の負荷を抑えてrsyncを実行する方法

関連記事

一瞬で巨大ファイルを作成する方法 - 理想未来はどうなった?
サイトをできるだけ止めずにMySQLデータベースの再構築を行う方法 - 理想未来はどうなった?
PHPでlibvirt APIを使ってみる - 理想未来はどうなった?
ionice -- I/Oスケジューリングクラスおよび優先度を設定/変更する - 理想未来はどうなった?
inotail -- パフォーマンスが良いtailコマンド - 理想未来はどうなった?