先日、Application Request Routing と Nginx の両方でロードバランサーを構築する話を書いたので、実際に動かしてみてパフォーマンスを調べてみました。
構築を行った話については、以下のリンクを参照してください。
両方を良く知るためのきっかけになればと思います。ちなみにこれが初 Nginx なので、勘違いしてる部分もあるかも知れません。指摘して貰えれば助かります。
機能・特徴について
ひとまず、それぞれの機能と特徴について簡単にまとめておきました。
Application Request Routing | Nginx | |
---|---|---|
パフォーマンス | ○ | ◎ |
リバースプロキシ | ○ | ○ |
フォワードプロキシ | △ (SSL 非対応) | △ (SSL 非対応) |
ロードバランサー | ○ | ○ |
セッションアフィニティ | ○ | ○ |
Keep-Alive | ○ | ○ |
SSL オフロード | ○ | ○ |
Gzip 圧縮 | ○ | ○ |
キャッシュ | ○ | ○ |
WebSocket | ○ | ○ |
URL 書き換え | ○ | ○ |
SPDY / HTTP2 | × | ○ |
SMTP / IMAP / POP3 | × | ○ |
プラットフォーム | IIS 7 以降のみ対応 | クロスプラットフォーム |
ARR は機能面では互角といった感じですが、パフォーマンスに関しては IIS のモジュールとして実装されている関係なのか Nginx には敵わない感じでした。と言っても極端にパフォーマンスが悪いことはないです。*1
パフォーマンスについて
検証のために用意した環境は以下の通りです。ARR と Nginx には一般的なチューニングを施しました。
- Azure VM
- Standard A2 (2 cores / 3.5GB)
- Windows Server 2012 R2 Datacenter
- IIS 8.5 + ARR 3.0
- Ubuntu Server 14.04 LTS
- Nginx 1.4.6
ロードテストのツールには loader.io を使って秒間 0 から 30000 までクライアントを増やすように設定して、その負荷を 1 分間かけ続けました。
タイムアウトはクライアント間は 10 秒、バックエンド間は 5 秒にしてあります。アクセスが単純なので、あくまでもこの結果は参考程度で留めておいた方が良い気がしました。
ARR の結果
Nginx の結果
ARR が 6000rps、Nginx が 15000rps といった感じで、ARR より Nginx のが倍以上処理出来てます。
Nginx は噂通り同時接続時のパフォーマンスがとても良かったです。いまいち IIS + ARR は CPU を効率的に使えていない気がしました。もっと良い設定があるのかもしれません。
ARRはIISとセットなのが敗因じゃないかと思う、重すぎる。
ごもっともです。
*1:というか Nginx が同時接続数にかなり強すぎる感じ