nodeで処理可能なプロセスが頭打ち

おかしい、テストではちゃんと毎分3万リクエストを普通に処理してたのに...
ナイショの設計マージンはその10倍なんだけど...
なんか、半分くらいで頭打ちしてる。
分散設計してあるので複数台自動クラスタ運用で、あふれた分は隣のサーバーに引っ越しているから、運用上はぜんぜん問題ないんだけど、システムスケールの見積もりと増設の投資予定が狂うじゃん。


モニタしているCPUもRAMもプロセス負荷もストレージもネットワークIOもデータベース負荷も、ほんと動いてるのか?ってくらい低い。
まぁ、そういう設計で動くようにしたのだから、当たり前なんだけど。
契約可能な仮想マシンの中でも、一番お金のかからない最低スペックで動作するようにシステム設計してある。
ちょっとリソースを少なくしすぎて、テストでログをギカバイト単位で吐かせると、ストレージが厳しくなるくらい。
このテストのログが想定外の負荷になっているのは、わかっているんだけど、これはしばらくは止められない。
通信の九割はUDPなので、置いてるクラウドの仮想ネットワークで、密かにパケット捨てられてるんじゃなかろうか?と邪推したくなるけど、そちらのモニタ結果ではそういう傾向はない。
ちょっとタイムアウト処理をタイトにやりすぎだったかなと反省し、余裕を持たす設定に変更しても、微々たる効果しかない。


よく考えたら、テストしたのはCentOS6.7で、運用機はCentOS7に変わってて、設定してたはずのファイルハンドル数の拡張がチャラになってたせいじゃないかな...
鯖管じゃないので、そのへんは管轄外ではあるわけなんだけど...
前は、自分で設定してたので、kernelビルドでも拡張してたけど、念のためforeverdでの起動時にも明示してたような。


しょうがない、systemdになって、ulimitの流儀も変わっているので、新しく設定せねばね。


デフォルトは、だいぶ少ない。

# ulimit -n
1024
# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7281
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7281
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
# cat /proc/sys/fs/file-max
185106
# cat /proc/sys/fs/file-nr
1632   	0      	185106


動いているパフォーマンス要因になっているnodeアプリケーションのプロセスを調べる。

# cat /proc/`pidof mogera`/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             7281                 7281                 processes
Max open files            4096                 4096                 files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       7281                 7281                 signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

4096のようだ。
これは少ないわ。
でも、これ、どこで設定されているのかね。
調べてみたけど、なんか見当たらない。


普通はどのくらいが設定されているのか、systemdのserviceまわりから拾ってみる。

/usr/lib/systemd/system/
LimitNOFILE=16384
/etc/systemd/system/
LimitNOFILE=10240

なるほど。


んで、設定する。
LimitNOFILEは、/etc/systemd/system/.d/override.conf に書くのが良いらしいけど、めんどくさいので直で追記する。
mogera.serviceの[Service]に追記。

# vi /usr/lib/systemd/system/mogera.service
LimitNOFILE=16384

daemon-reloadしないと新しい設定は有効にならないようだ。

# systemctl daemon-reload
# systemctl restart mogera
# grep "open files" /proc/`pidof mogera`/limits
Max open files            16384                16384                files

増えている。


分散システムの隣を停止モードにして、接続クライアントを追い出す。
隣は、停止モードでクライアントがいなくなると、自動でコンディションを再設定して再度起動してくる。
追い出されたクライアントは、こちらのサーバーに接続してくる。
おお、見えない天井打ってたグラフは、それを越えてきた。
いい感じ〜。


というわけで、マイクロサービス実装の全部のnodeサーバーの設定にも反映してみた。
デプロイはgitからやるようにしたので、今後も反映されるだろう。


でもね、一晩観察してみると、まだ隣にわずかに漏れてくるんだな...
まだ謎は残る...