Apache+Starmanの高速化

Apache+Starmanのチューニングをいろいろ試して計測してみた。

0.環境

AWS EC2 t2.micro Amazon Linux
1CPU
1GB Memory

Perl v5.16.3
Apache 2.2.29
Starman 0.4011

1.実行するアプリ

hello.psgi

my $app = sub {
    return [
        200,
        [ "Content-Type", "text/plain" ],
        [ "Hello!" ],
    ];
};
$ starman --workers 64 hello.psgi

2. 測定

別のインスタンスから、abを使ってベンチマークを測定。

$ ab -n 10000 -c 100 <URL>

starmanへ直接、prefork、worker、starman --disable-keepaliveといろいろ試してみた。

[#/sec]
直接 2343.08
prefork 1573.77
prefork --disable-keepalive 1256.11
worker 1754.70

ApacheからReverseProxyするオーバヘッドがかなり大きい。 いろいろ試してみたけどなかなか数値が上がらず…。

ちなみにApacheは、できるだけプロセスのforkが少なくなるように設定した。

KeepAlive On

<IfModule prefork.c>
StartServers           64
MinSpareServers        64
MaxSpareServers        64
ServerLimit           256
MaxClients            256
MaxRequestsPerChild  4000
</IfModule>

<IfModule worker.c>
StartServers            16
MaxClients             256
MinSpareThreads         25
MaxSpareThreads         75
ThreadsPerChild         25
MaxRequestsPerChild  10000
ServerLimit            256
</IfModule>

3. Nginxを試してみる

ずっとApache+Starmanで考えていたけど、これを見てnginxを試してみたくなった。

location /test_tcp/ {
    proxy_pass http://127.0.0.1:5000/;
}

location /test_uds/
    proxy_pass http://unix:/tmp/starman.sock:/;
}

さっきと同じ条件で測定。
StamanがUnix domain socketに対応しているのでそれも試してみる。

[#/sec]
TCP socket 1703.56
Unix domain socket 2132.53

4. 結論

Nginx+Unix domain socketが最速。

NginxとApache共存もできるので、Nginxをメインにするのもありかも。

d.hatena.ne.jp
このブログ記事を参考にさせてもらいました。