うまいぼうぶろぐ

linuxとhttpdとperlのメモ

apache でload average の値によってページを差し替えるサーバ負荷に優しい方法

# aws でauto scaling しろよ、というのはさておき


RewriteMap で外部のファイル/コマンドを実行した値を変数に入れて、RewriteCond で条件判別する。

このときリアルタイムな処理をするならRewriteMap で prg (External Rewriting Program) を使って、perlシェルスクリプトなどで動的にload averageの値を拾ってくれば良い。
が、リクエスト毎に外部プログラムが走るのでもしかしてオーバヘッドになりうるということと、そもそもload averageは1/5/15分平均の値で、1秒ごとに劇的に変化する値でもないので、例えばcron等でload averageをファイルに書き出しておいて、txt かdbmで見るほうがサーバ負荷に優しい気がする。

# オーバヘッドうんぬんは真面目に負荷かけて調べてないので予想

実験

スクリプトはだいぶ適当
毎分設定するcron

  • get_la.sh
#!/bin/sh
file=/var/tmp/la.txt
dbm=/var/tmp/la.dbm
	
ldavg_1=`cat /proc/loadavg | cut -d ' ' -f 1`
echo "ldavg_1 $ldavg_1" > $file
/usr/sbin/httxt2dbm -i $file -f db -o $db

apacheの設定

RewriteEngine On
#RewriteMap la txt:/var/tmp/la.txt
RewriteMap la dbm=db:/var/tmp/la.dbm
RewriteCond ${la:ldavg_1} >1.00
RewriteRule ^/index.html /var/www/html.simple/index.html [L]

これでload average が1を越えたら/var/www/html.simple/index.htmlが表示された