2012年6月25日月曜日

linux (CentOS 6.2 x86_64) で、「cpulimit」と --bwlimit を使って、マシン負荷を減らしネットワーク負荷を減らして rsync を実行する方法

1.rsync の高負荷を減らすには

Linux の rsync (Windows の robocopy に相当) は非常に便利です。ただしマシンやネットワークにとって高い負荷がかかって困る場合もあります。

  • rsync を実行すると、マシンに高い負荷がかかりの動作が重たくなる
  • rsync を実行すると、ネットワークに高い負荷がかかり、Web サイトの読み込みが遅くなる、あるいはエラーが発生する。

ここでは、「Linux (CentOS 6.2 x86_64 ディストリビューション)」の場合を例に、「マシンにとって低負荷、ネットワークにとっても低負荷」な rsync を実行する手順を説明します。

2.前準備

事前に、cpulimit というソフトをインストールしておきます。

(参考) Linux (CentOS 6.2 x86_64) に、「cpulimit」をインストールして、実行する (= 絶対的な優先度を下げる) 手順

http://hachitaro.blogspot.jp/2012/06/linux-centos-62-x8664-cpulimit.html

3.rsync スクリプトの例

私が作成した、「マシンとネットワークに低負荷の rsync」スクリプトを以下に記します。

スクリプトご利用上の注意」をよくお読みの上、ご了承いただいた方はご利用下さい。

「mybackup01.sh」

#!/bin/sh

# clamproc1501

# 実行中のスクリプトのディレクトリを取得
# CURDIR=`pwd`
CURDIR=`dirname $0`
# echo ${CURDIR}
thispchostname=`hostname -s`
echo ${thispchostname}


curdttmforlogfilename=`date +%Y%m%d%H%M%S`

logfilesdir='/var/log/1050/'
rsynclogdir='/var/log/1050/'
rsynclogfilename_suffix='rsynclog'

mkdir -m 777 -p ${logfilesdir}
mkdir -m 777 -p ${rsynclogdir}

shfilename=`basename $0`
logfilename_ext='.txt'
quotstr=



rsynclogdirfilename=${rsynclogdir}${curdttmforlogfilename}_${thispchostname}_${shfilename}_${rsynclogfilename_suffix}${logfilename_ext}


# 関数の戻り値
RETNOTSET=1
RETTRUE=11
RETFALSE=12

popd
wScriptDir=$(cd $(dirname $0) && pwd)
pushd

. ${wScriptDir}'/../0000_com/'com_proc.sh

PATH=/usr/bin:/bin


# syncing nas252 to nas253

func_check_other_proc() {
func_check_other_highload_process_running
rtn=$?
if [ "$rtn" -ne 11 ]
then
return ${rtn}
fi

return 11
}

func_rsync() {
# コピー元ディレクトリの指定
#
# 「hachitaro」ディレクトリごと、rsync するので、
# 「/mnt/nas123/usr/hachitaro/」
# ではなく
# 「/mnt/nas123/usr/hachitaro」
# を指定する。
rsync_sourcedir_file="mnt/nas123/usr/hachitaro"

# コピー先ディレクトリの指定
# rsync_dest_dir="/mnt/nas456/bk/server1001/pc/usr/"
rsync_dest_dir="/mnt/nas456/bk/server1001/pc/usr/"

# rsync の CPU 最大使用率を50%に制限。(CPUの優先度ではない)
cpulimit -e rsync -l 50 &

# rsync 実行
# rsync -avvv --stats ${rsync_sourcedir_file} ${rsync_dest_dir} | tee -a ${rsynclogdirfilename}

# rsync 実行
# --bwlimit=()KBytes
# 「 --bwlimit=1000」は、 1000KB/s (= 1MB/s) の意味
# 「 --bwlimit=10000」は、 10000KB/s (= 10MB/s) の意味
# 「 --bwlimit=50000」は、 20000KB/s (= 20MB/s) の意味
# 「 --bwlimit=50000」は、 50000KB/s (= 50MB/s) の意味
# 「--bwlimit=100000」は、100000KB/s (=100MB/s) の意味
rsync -avvv --stats --bwlimit=20000 ${rsync_sourcedir_file} ${rsync_dest_dir} | tee -a ${rsynclogdirfilename}


return 11
}


func_main() {
local -i rtn
rtn=1

func_check_other_proc
func_check_other_proc
rtn=$?
if [ "$rtn" -ne 11 ]; then return ${rtn}; fi


# rcync
func_rsync
rtn=$?
if [ "$rtn" -ne 11 ]; then return ${rtn}; fi

# すべての処理が終了して、ここまで処理がすすんだ場合、「処理はすべて正常終了」
# とみなす。

rtn=11
return ${rtn}


}



func_main
rtn=$?

curdttm=`date +%Y%m%d%H%M%S`
if [ "$rtn" -ne 11 ]
then
# 処理で以上が発生したため、これより以下の処理は続行はしない。
curdttm=`date +%Y%m%d%H%M%S`
msg="処理途中で異常が発生したため、処理を途中で中断しました。"' 2>&1'
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${thispchostname}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${clamproclogdirfilename}
else
# 処理が正常終了したため、次の処理へ進む
curdttm=`date +%Y%m%d%H%M%S`
msg="処理がすべて正常に終了しました。"' 2>&1'
echo "${quotstr}${curdttm}${quotstr} ${quotstr}${thispchostname}${quotstr} ${quotstr}${msg}${quotstr}" | tee -a ${clamproclogdirfilename}
fi


0 件のコメント:

コメントを投稿