はじめに
前回、さくら VPS 1G の CentOS に Apache と 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:つまり初期設定のまま