かなり前の話になるけどnginx + uWSGI で秒間2000アクセスくらいさばく必要があったので負荷試験をやった。
アプリケーションによってオプションの最適値はいろいろあると思うし、負荷をかけるとアプリ側にボトルネック見つかったりすると思うので、そういうのはめいめいやっていただくとして、あのー、やってるときに、ある多重数にすると突然全部エラーになる、みたいな、これはサーバの限界とかでなく明らかに何かの制限に引っかかってんなーという事象がいくつかあって、調べて対応するなどした。
有名なお話が多いけど、もしかしたら誰か探してるもしれないからまとめておくね。
同時100アクセスの壁
最初に出会った壁。Apache Benchで100より多くの同時アクセスをすると死ぬ。そんな貧弱なサーバを買った覚えはない。誰だ。お前だ。uWSGIのlistenキューのデフォルトが100だからだ。
listen=10000
とか適当に上げてuWSGIの再起動。
同時128アクセスの壁
上で出てきた話の関連で、そもそもuWSGIのlistenキューのデフォルトが100である理由は、OSの設定がそんなもんだからとのこと。
Linuxのsomaxconn のデフォルトは128。これも変更。
適当に上げて、設定読み込み、NGINX、uWSGIの再起動。
同時1000アクセスの壁
これはuWSGI Emperorを使って複数のuWSGIアプリをまとめているときだけの話だけど、同じvassalを起動する制限(スロットリング)があって、デフォルトはミリ秒単位で1000個までとなっている。Fork爆弾対策らしいけど、これは知らなかったから半日ハマった。nginxで絞るからいいのでは……とか思うけどそういうわけにもいかないのか。
uwsgi emperor のオプション
emperor-throttle=10000
とか適当に上げた。
おしまい!