GNU parallel を本番環境で使ってみました。
本番環境では、10 台程度ある Apache のウェブサーバのアクセスログを mod_log_rotate で 1 時間ごとに出力して、バッチ処理のサーバで集めています。
最初は、シェルスクリプトで、次のようにしていました。
次の例はウェブサーバが s1 〜 s10 まであって、$LOG_DIR/$LOGFILE に 1 時間ごとに出力したアクセスログがあると想定しています。当然ながら、下記のシェルスクリプトの実行ユーザで対象のサーバへ SSH 経由に接続できるものと想定しています。
for s in s1 s2 s3 s4 s5 s6 s7 s8 s9 s10; do
ssh -q $s "test -f $LOG_DIR/$LOG_FILE"
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
rsync -az -e "ssh -q" $s:$LOG_DIR/$LOG_FILE-$s
fi
done
対象のサーバごとに順番に rsync しているため、対象サーバが増えるごとに rsync する時間がかかってしまいます。
10 台の場合、約 1 分 30 秒ほどかかっていました。
そこで、「GNU Parallelがすごすぎて生きるのがつらい – As a Futurist…」を参考にしながら、次のように並列で rsync するようにしてみました。
parallel -j +0 'rsync -azq -e "ssh -C -c arcfour -q" {}:$LOG_DIR/$LOG_FILE-{}' ::: s1 s2 s3 s4 s5 s6 s7 s8 s9 s10
GNU Parallel を使うとワンライナーで済んでしまいます。実際には、rsync に失敗することがあるので、3回ほどリトライ処理を行っています。
「-j +0」の部分は、お使いのサーバの CPU コア数などによって調整してください。
これによって、今まで 1 分 30 秒かかっていましたが、GNU Parallel を使ったバージョンだと 10 秒程度で終わるようになりました。これなら、ウェブサーバが増えても処理時間の延びを減らすことができそうです。
Tags: server







