ランダムマッチングのcgiをApacheBenchで速度を調べたところ、
Request per second がだいたい 2/sec
要するに一回の取得に0.5secぐらいかかっている。お、遅い! なんて遅いんだ!
これはやばい。さすがに月480円は伊達じゃない。
ということで、index.htmlに対して行うと
Request per second がだいたい 975.04/sec
さすがに十分早い。
ということは、遅い原因は、Apacheかperlかmariadbかのいづれか。
試しに、mariadbなしのCGIで調べると、
やはり Request per second だいたい2/sec
レコードが2件しかないのにmariadbが遅いってことはないだろ。
犯人は、perlかapacheに絞られるが、index.htmlが遅くない以上、犯人はperlになる。
通常のcgiはコンパイルやプロセス起動がHTTPアクセスの度に発生するので、このへんが格安VPSの劇遅いCPU環境で負荷になっているのではないだろうか。
参考ブログでも以下の言及があった。(10年前の記事w)
不必要なライブラリを極力ロードしないように気を付けているadiaryですら、
cgi実行時間の約9割がPerlのコンパイル時間です。
とうことで、このへんの負荷を低減するために、CGIプロセスが常駐するfastcgi環境を構築してみる。
yum install fastcgid
モジュールはこれであっさり入った。
locate "mod_fcgid.so"
ダイナミックリンクライブラリのインストール場所を確認する。
拡張子fcgiがfcgidで動くようにapacheの設定を変更。
httpdをrestartする
1文だけ表示するcgiを作って、通常とfastcgiで比較する
通常cgi
Request per second がだいたい 2.3/sec
fcgid
Request per second がだいたい 23.53/sec
おー!十倍速くなった! (それでも遅いんだけど。480円だし)
ただし、fcgiの中で、mysqlにアクセスするとうまく動いてない。
まだ調査中。
動いた。mysqlのハンドラをグローバル変数にしてて、その関係で動かなかった模様。
引数で渡したら動いた。
ただ、アクセス数を増やすとfailedの割合が増えるのでちょっととほほって感じ
kimoto.hatenablog.com
調べると、CGIのレスポンスの長さが変わったらfailedとみなす仕様らしい。
なんじゃそりゃ。
ランダムレコード取得だから、当然毎回長さは変わる。
SQLを動かした結果を表示せずにCGI終了させてみると、abのfailedは0になった。
別にCGIがこけているわけではない模様。
ab -n 50 -c 50でたたいても 24 Time per secondは出ていたので、めでたしめでたし。
fcgidで動かすperlスクリプト
#!/usr/bin/perl
use FCGI;
use CGI;
use strict;
use warnings;
my $request = FCGI::Request();
while ($request->Accept() >= 0) {
our $cgi = CGI->new;
print CGI::header(-charset=>"utf-8");
print "FASTCGI";
}
exit;
参考
adiary.blog.abk.nu
tweeeety.hateblo.jp