アルパカDiary Pro

はてなブログProではありません

Apacheでサーバ負荷が高いときのリダイレクトについて実験その2

「Twitterのくじらを実装するのはどういうのがスタンダードなのか?」の続き。
コメントやTwitter
ロードアベレージを別プロセスでチェックし、ファイルの有無で判断する」
方法を伝授されたので、そちらのベンチも取ってみました。

Apachehttpd.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 & 

ベンチマーク

ab -n 5000 -c 5 'http://192.168.126.136/'
Requests per second:    1000 [#/sec] (mean)

というわけで

未設定時とほとんど変わらないのでこの方法がよさそうですね。
また、ロードアベレージチェックファイルをロードバランサにrsyncしたりして
ロードバランサ側でロードアベレージチェック振り分け、などもできるかもしれませんね。*1

*1:負荷が上がっているときの処理なので、個々のサーバで完結させた方がいいような気もするけど