Nginxのmulti_acceptの意味とon・offでのApache Benchの結果(同時アクセス比較)
Nginxのmulti_acceptはonが絶対という風潮
自分も信じてonにしていましたが、怪しくなったので調査。
on・offでabベンチをした結果などを共有します。
1、multi_acceptの公式の説明
Syntax: multi_accept on | off; Default: multi_accept off; Context: events multi_acceptが無効になっている場合、ワーカープロセスは一度に1つの新しい接続を受け入れます。 それ以外の場合、ワーカープロセスは一度にすべての新しい接続を受け入れます。 ※Google翻訳
Nginx公式の説明は本当わかりにくい。
デフォルトではoffなので、絶対にonが良いというものではないのがわかる。
何かしら理由がある場合にonにするものなので、
ここを理解せず使うのは怖いものがあります。
実際の挙動を見るとわかりやすい。
2、multi_acceptをonにするとこうなる
一つのワーカープロセスを集中して使うようになる。
公式の説明通りです。
普通は全てのワーカープロセスで順番に処理するのですが、
multi_acceptをonにすると一つのワーカープロセスで処理をする。
ただ、限界を迎えた場合?は別のワーカープロセスも使うことを確認。
これによりいろいろとリソースを無駄にすること無く処理できる。
実際、Nginxのメモリ総合使用量も少なくなります。
低スペックのマシンで有効にしたい。
そう、multi_acceptは速度アップではなく「サーバー負荷軽減」のためのもの。
同時アクセスの処理が増えるというものではない。
3、multi_acceptのon・offによる同時アクセス処理数
Apache Benchで比較してみます。
・ab -n 100 -c 100 https://doudonn.com/index.html
・各6回試行した平均値
multi_accept | on | off |
Requests per second | 344 | 355 |
multi_acceptをOFFにした方がわずかに速い。
測定は6回ですが、それ以前に試験的に10回以上測定しており、
それでもoffにした方が速かったので、速くなることは間違いないと結論。
ワーカープロセスもちゃんと全部使っています。
この方が安心する。
まとめ
スペックに余裕がある場合はmulti_acceptはOFFが良いだろう。
デフォルトでoffになっている理由がわかります。
ただ、onにしてもそれほど悪くならないので、onでも大きな問題は無いと思う。
メモリやコネクションがボトルネックになっている場合もonで良いと思う。
このあたりのバランスが難しい。
この結果から、自分はロードバランサ・バックエンド両方multi_acceptをoffにしました。
特に負荷の大きいロードバランサでoffにすると大きな効果がありました。
重たい処理をするほどoffにする方が良いのかもしれない。
そんな感じなので、
「どのサイトもmulti_acceptはonって書いてある!」と思考停止でonにせず、
自分のサイトではどうだろうか?と測定してみてほしい。