EC2でnginx動かしてパフォーマンス検証した。
ひとまず動かしてみる。
yumでインストール。楽でいいね。
$ sudo yum install nginx ==snip== Running Transaction Installing : libxslt-1.1.26-2.6.amzn1.x86_64 1/5 Installing : GeoIP-1.4.8-1.5.amzn1.x86_64 2/5 Installing : libXpm-3.5.8-2.8.amzn1.x86_64 3/5 Installing : gd-2.0.35-10.9.amzn1.x86_64 4/5 Installing : nginx-1.0.15-1.9.amzn1.x86_64 5/5 ==snip== Installed: nginx.x86_64 0:1.0.15-1.9.amzn1 Dependency Installed: GeoIP.x86_64 0:1.4.8-1.5.amzn1 gd.x86_64 0:2.0.35-10.9.amzn1 libXpm.x86_64 0:3.5.8-2.8.amzn1 libxslt.x86_64 0:1.1.26-2.6.amzn1
いろいろ一緒にインストールされた。
起動してみる。
$ sudo nginx
ブラウザからアクセスしたら無事にページが表示されました。
パフォーマンスを検証する
- 比較対象がないとということでapacehと比較することにした。
- 条件を決める
- 測定にはjmeterを使うことにする。
- webサーバーによく使われそうなm1.smallとm1.largeでそれぞれ検証する
- スレッドグループのパラメータは以下の感じ
- スレッド数を5, 30でそれぞれ計測
- スレッドグループをそれぞれ60秒間動かしたときのlatency, スループットを計測
- 接続もしくはレスポンスに300ms以上かかったものはエラーとみなし、エラーレートも計測する。
- リクエストで1KBのデータを投げてレスポンスも1KBのデータを返すことにする。
- ちょっとはまったのが、nginxはPOSTリクエストに対して静的ファイルを返せないらしい。405 not allowedが返ってしまう。なので、queryストリングに1KB分のデータを載せることにした。
結果は以下のとおり。
- m1.small
計測項目 | apache | nginx | |
---|---|---|---|
5スレッド | latency(平均値) | 27 | 13 |
latency(中央値) | 5 | 13 | |
スループット | 153.4req/s | 321.2req/s | |
エラーレート | 0.09% | 0.00% | |
30スレッド | latency(平均値) | 113 | 13 |
latency(中央値) | 39 | 13 | |
スループット | 261.0req/s | 1904.7req/s | |
エラーレート | 33.40% | 0.00% |
- m1.large
計測項目 | apache | nginx | |
---|---|---|---|
5スレッド | latency(平均値) | 4 | 13 |
latency(中央値) | 5 | 13 | |
スループット | 875.3req/s | 322.1req/s | |
エラーレート | 0.01% | 0.00% | |
30スレッド | latency(平均値) | 5 | 13 |
latency(中央値) | 5 | 13 | |
スループット | 3823.4req/s | 1903.9req/s | |
エラーレート | 0.00% | 0.00% |
nginxは環境に左右されずにそれなりの性能を出す。
apacheは負荷<リソースな状態なときに高い性能を出す(ようにみえる。)
ちょっと気になったのでm1.largeで更に大きな負荷(500スレッド)をかけてみた。
- m1.large
計測項目 | apache | nginx | |
---|---|---|---|
500スレッド | latency(平均値) | 83 | 24 |
latency(中央値) | 23 | 18 | |
スループット | 5118.7req/s | 9697.2req/s | |
エラーレート | 15.78% | 0.00% |
やはり負荷が高なくなってくるとリソースが比較的豊富なm1.largeでもapacheの性能が落ちてきた。