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と最低優先度で実行されていることがわかるかと思います。
以上、上記組み合わせることで大幅に負荷を下げることができると思います。
何らかのお役に立てれば幸いです。