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/
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からやるようにしたので、今後も反映されるだろう。
でもね、一晩観察してみると、まだ隣にわずかに漏れてくるんだな...
まだ謎は残る...