読者です 読者をやめる 読者になる 読者になる

さくら VPS 1G の CentOS で Apache + gunicorn のベンチマークをとってみた

はじめに

前回、さくら VPS 1G の CentOSApache と mod_wsgi をインストールしてベンチマークをとってみた。

いろいろな構成でベンチマークをとらないと、インフラ経験ゼロな自分にはどの構成が一番いいのか判断つかないので、次は Apache と gunicorn を組み合わせてみることにした。

gunicorn をインストール

sudo pip install gunicorn

WSGI アプリの作成

gunicorn で動かす Web アプリは、mod_wsgi のとき使ったものを流用する。ただ、gunicorn で動かすには Python パッケージじゃないとダメなので、/var/www に hello ディレクトリを作成し、そこに配置しておく。

sudo mkdir /var/www/hello
cd /var/www/hello
sudo vim hello.py

hello.py は前回と同じ。Hello world を表示するだけ。

def application(environ, start_response):
    status = "200 OK"
    response_headers = [("Content-type", "text/plain")]
    start_response(status, response_headers)
    return ["Hello world!"]

gunicorn の起動

ワーカー数を 60 に指定。デーモンとして実行する。

cd /var/www/hello
sudo gunnicorn -w 60 -D hello:application

ちなみに、デーモンとして実行している gunicorn を終了したいときは

kill <gunicornの親プロセスID>

を実行すればいい。

Apache の設定

/etc/httpd/conf/httpd.conf は前回のものをベースに*1、mod_proxy で gunicorn にリクエストを流すように設定する。

ProxyPass /gunicorn http://localhost:8000

あと、mod_wsgi を読み込まないようにしておく。
設定ファイルを保存したら Apache を再起動。

sudo /etc/init.d/httpd restart

curl で gunicorn にリクエストを流せているか確認する。

curl http://<IP アドレス>/gunicorn

Hello world! が表示されたので、上手くいったみたいだ。

ベンチマークをとってみる

Apache Bench を使って、Apache + gunicorn でもベンチマークをとってみる。gunicorn のバージョンは 0.14.2。

同時接続数50固定でリクエスト数を増やしてテスト
リクエスト数 リクエスト/秒
1000 39.51
2000 41.34
4000 42.54
6000 42.77
8000 43.14
10000 43.08
リクエスト数1000固定で同時接続数を増やしてテスト
同時接続数 リクエスト/秒
10 38.59
50 39.53
100 39.08
150 38.92
200 36.67
300 34.66
400 38.30
ベンチマーク後のメモリ使用量
             total       used       free     shared    buffers     cached
Mem:       1020688     816212     204476          0      35504     132152
-/+ buffers/cache:     648556     372132
Swap:      2096472        788    2095684

まとめ

Apache + gunicorn でベンチマークをとってみたけど、mod_wsgi のときと比べて、結果はほとんど変わらなかった。Apache と gunicorn を同じマシン上で動かしているからで、別マシンだと違ってくるんだろう。

Apache + mod_wsgi はアプリケーションサーバーで、Apache + gunicorn はリバースプロキシ+アプリケーションサーバーなので、比較対象としてはふさわしくない気もするけど。

メモリ使用量は、mod_wsgi に比べて 30MB ほど増えている。ということは、メモリの大部分は Apache が喰っていることになる。Apache + mod_wsgi で 700MB ほど使っていたことを考えると、アプリケーションサーバーは gunicorn の方がメモリがはるかに少なく済みそうだな。

*1:つまり初期設定のまま