工場長のブログ

日々思ったことを書いてます。

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の性能が落ちてきた。

まとめ

nginxは少ないリソースでも安定した高いスループット性能を提供してくれる。
apacheと違ってリソースが潤沢でもレイテンシーが小さくなることはないが、逆にリソースが貧弱でもレイテンシーが大きくなりにくい。

という感じでしょうか。