php.ini 再設定

どうも 8Mは絞りすぎっぽい。があんまり大きくもできないので、じりじりと。
/etc/php.ini

;memory_limit = 8M      ; Maximum amount of memory a script may consume
memory_limit = 10M      ; Maximum amount of memory a script may consume

どんなモンかしら?

さくらのVPSを検討

結局過負荷問題はアドホックな対応しかできないので。

今は専用サーバエントリーなんだけど、予算の都合で上のクラスのサーバーを借りるのは難しい。

そもそもなんで専用サーバかという原点に戻ってみると、tiarra/keitaircが常駐出来る環境で*.jpで逆引き出来るって言うのが必要条件かなあと。(さくらの専用サーバを選んだ理由は、所有ドメインがさくらで全部管理されているのと、さくらのレンタルサーバを利用していた実績があるから)

で、逆引きは今や自分のドメインで逆引き出来ることにこだわらないので、さくらのVPSも出来たことだし、そっちに移行しても良いかなと。

が、さすがにディスク容量が足りなかったり、メモリーが512Mでは一台分丸ごと移行は難しい、気がする。

と言うわけで、一応こんな感じで借りたらどうかな案

  • tiarra/keitairc等の常駐プロセス用VPS
  • 管理していwebはさくらのレンタルサーバーに収容
  • 監視系としてVPSもう一個
  • できれば実験用にVPSもう一個

レンタルサーバーは複数台借りた方がいいのかその辺が微妙だけど、プレミアム1本として 980×3+1500=4440円 現状 7800円だから、3360円のコストダウン。

デメリットはサーバが複数台に渡るので管理がめんどくさいのと、VPSが思っているような性能がでるのか? だなー

しばらく考えよう。とりあえずVPS一個借りてみて様子を見るべきかなー。

若干改良

uptimeを呼んで数値を得るのではなくて直接/procから数値を読むようにした。
同時にswapの空きが10Mを切ったときも、リスタートするように変更。

元の書き殴りじゃあんまりなのでちゃんとstrictとwarningsを指定した。しばらく使いそうだしね。

#!/usr/bin/perl
use strict;
use warnings;

my $limit15 = 10;
my $limit5  = 15;
my $limit1  = 30;
my $limitM  = 10 * 1024;

print "$limitM:$limit15:$limit5:$limit1\n";

while(1){

    my $swapFree = 0;
    my $load15 = 0;
    my $load5 = 0;
    my $load1 = 0;

    open MEMINFO,"/proc/meminfo" or die;

    while(<MEMINFO>){
        next unless /^SwapFree/;
        my @workTbl = split(/[\s:]+/);

        $swapFree = $workTbl[1]+0;
    }

    close MEMINFO;

    open UPTIME,"/proc/loadavg" or die;

    while(<UPTIME>){
        my @workTbl = split(/[\s,]+/);

        $load15 = $workTbl[2] + 0;
        $load5 = $workTbl[1] + 0;
        $load1 = $workTbl[0] + 0;
    }

    close UPTIME;

    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time());
    $mon += 1;
    $year += 1900;

    if($load15 > $limit15){
        if($load5 > $limit5){
            if($load1 > $limit1){
                print '('. join(':',($swapFree,$load1,$load5,$load15)).") restart at $year/$mon/$mday $hour:$min:$sec : cpu busy\n" ;
                system("/sbin/service httpd restart");
                sleep(60);
            }
            else {
                print ' ('. join(':',($swapFree,$load1,$load5,$load15)).") step2 at $year/$mon/$mday $hour:$min:$sec \n" ;
            }
        }
        else {
            print ' ('. join(':',($swapFree,$load1,$load5,$load15)).") step1 at $year/$mon/$mday $hour:$min:$sec \n" ;
        }
    }

    if($swapFree <= $limitM){
        print '('. join(':',($swapFree,$load1,$load5,$load15)).") restart at $year/$mon/$mday $hour:$min:$sec : memlow \n" ;
        system("/sbin/service httpd restart");
        sleep(30);
    }
    sleep(10);
}

とりあえず対症療法……

たぶん、XMLsitemapまわりとかの更新通知後に、更新確認にアクセスが殺到するのが原因な気がするんだけど……

とりあえず、暫定的対症療法として、loadを監視してhttpdをリスタートするスクリプトをクイックハックしてみた。

#!/usr/bin/perl

while(1){
    print "check:";

    open UPTIME,"uptime|" or die;

    while(<UPTIME>){
        split(/[\s,]+/);

        $load15 = $_[12] + 0;
        $load5 = $_[11] + 0;
        $load1 = $_[10] + 0;

        print join(":",($load1,$load5,$load15)).":";
        if($load15 > 10){
            print '.';
            if($load5 > 15){
                print '.';
                if($load1 > 30){
                    print 'restart';
                    system("/sbin/service httpd restart");
                }
            }
        }
    }
    print "\n";

    close UPTIME;

    sleep(10);
}

全然資源が足りないっぽい……

ごはん食べて帰ってきたら、ロードアベレージ119.7とかでスラッジングをおこして事実上システム停止してた……。swapのフリーが0Kとかどう見てももうだめ。

再びさくらインターネットに連絡してリブート。

常駐プロセスのうち、運用上の必要度が低いものから数個止めた。具体的にはファイアウォールログをMySQLに書き込んでwebから履歴参照できるようにするデーモンと、clamav。clamavはもうこのサーバーでメール受けてないし、使ってる人もボクだけだから、ローカルでチェック済みのものをアップロードする分にはファイルシステム内スキャンは必要ないだろうと。

で、どうかなー?

現時点での.screenrc

なんかどうにも負荷がかってスラッジングをおこしがちなので、とりあえず状況を常時監視することにした。

~/.screenrc

defutf8 on
defkanji UTF-8
defencoding UTF-8
encoding UTF-8 UTF-8
defscrollback 10000
autodetach on
startup_message off
multiuser on
caption always "%n %t %= %{=b wk} %{=s wb}%y/%m/%d %{=s wb}%02c"
bind ^e encoding eucJP UTF-8
bind ^u encoding UTF-8 UTF-8
bind ^w encoding sjis UTF-8
bind ^j encoding jis UTF-8
chdir
screen -t "top +" /usr/bin/top
scrollback 0
split
focus down
screen -t "vmstat +" /usr/bin/vmstat 10
scrollback 200
split
focus down
chdir tiarra
screen -t "tiarra: errlog.stderr" /usr/bin/less errlog.stderr
screen -t "tiarra: errlog.stdout" /usr/bin/less errlog.stdout
chdir
screen -t "sakura.fairies.jp"
screen -t "* work tty *"

まあ、別途負荷がかかったときの対策なり、負荷がかからないようなチューニングが必要という前提で。

OAuthを自分のアプリで実装する方法を調べてみる

ゼロから学ぶOAuth | gihyo.jp あたりを眺めてみる。

Ruby on Rails で実装できるのであればちょっと挑戦してみてもいいかなあ。

OAuth 自体は権限委譲の枠組みなので、サービスを提供する「OAuth Service Provider」側がどのように委譲を許可するかは実装にゆだねられているのか。

たとえば社内システム連携等のアクセス制御にOAuthを利用するのであれば、認証の妥当性検証をオペレーターに判断させて、トークン等はシステムで直接配布しない運用とかでも行けそうだねー。