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 件のコメント:
コメントを投稿