Apacheでサーバ負荷が高いときのリダイレクトについて実験その2
「Twitterのくじらを実装するのはどういうのがスタンダードなのか?」の続き。
コメントやTwitterで
「ロードアベレージを別プロセスでチェックし、ファイルの有無で判断する」
方法を伝授されたので、そちらのベンチも取ってみました。
Apacheのhttpd.conf
RewriteEngine on RewriteCond /tmp/loadcheck.file -f RewriteRule ^/(.*)$ http://192.168.126.134/redirect.html [R,L]
ロードアベレージチェックスクリプト(loadcheck.pl)
適当。perlがインストールされていれば動くものにしたかったので
極力cpanモジュールを使わない方法で。
インターバル5秒にしていますが、ここまで狭くなくていい気もする
#!/usr/bin/env perl use strict; my $check_ldavg = 3.0; my $check_file = "/tmp/loadcheck.file"; my $interval = 5; while(1){ my ($ldavg1, $ldavg2, $ldavg3) = `uptime` =~ /load average:\s+([.0-9]+),\s+([.0-9]+),\s+([.0-9]+)/; if($ldavg1 > $check_ldavg){ open my $fh , ">" , $check_file; }else{ unlink $check_file; } #print $ldavg1, "\n"; sleep $interval; }
このスクリプトをこんな感じでバックグラウンド実行させておくと。
nohup perl /etc/httpd/loadcheck.pl > /dev/null 2>&1 &
というわけで
未設定時とほとんど変わらないのでこの方法がよさそうですね。
また、ロードアベレージチェックファイルをロードバランサにrsyncしたりして
ロードバランサ側でロードアベレージチェック振り分け、などもできるかもしれませんね。*1
*1:負荷が上がっているときの処理なので、個々のサーバで完結させた方がいいような気もするけど