たまごかける日報

ここにAA貼りたい

出、出〜、mongos接続突然切奴〜wwwww

なんというか、ただの恥さらしブログになんだけど自戒のために残しておく。

なんかおかしい

ある日、本番稼働してない控えのmongosさんで変なエラーが出てアプリでもいっぱいエラーが出てきた。
なんかオカシイ。
エラー的には下記

Tue Nov 26 18:20:47.294 [conn88] Socket say send() errno:32 Broken pipe 10.10.10.10:27018
Tue Nov 26 18:20:47.294 [conn88] warning: problem while initially checking shard versions on RS01 :: caused by :: socket exception [SEND_ERROR] for 10.10.10.10:27018
Tue Nov 26 18:20:47.294 [conn88] DBException in process: socket exception [SEND_ERROR] for 10.10.10.10:27018

Broken pipe....?
mongos->mongodの接続が切れてる... ? _ ?

調べる

最初は単純にBroken pipeだからネットワーク的な問題かなと思い、
トラフィックが急にオチてたりethとかで変なエラーが出てないかを見たがそれっぽいものは特に何もナシ。


connectionsが頭打ちになってね?となり
そこ周りで調べてみることにした


f:id:kakerukaeru:20131201182710p:plain
mongodのプライマリシャードのconnectionsを確認してみる。
900ちょっとで停滞・・・?

実際にログインしてプロセス数を確認してみる

ec2-user@prd-mongod001(ip-10-10-10-10) ~
$ ps auxxx -L | grep mong | wc -l 
931

設定値は?

$ ulimit -u
1024

デフォルト・・・(´ェ`* ;;;)

すごくそれっぽい


作業

mongoさん優しい。ulimitの推奨値書いてた
http://docs.mongodb.org/manual/reference/ulimit/
ulimitの説明とかも書いてくれてるしなんて親切なの・・・

実際に、作業にはいる

vim /etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
#*          soft    nproc     1024

こっちをコメントアウトして、

vim /etc/security/limits.conf 
追記
root    soft    nofile  64000
root    hard    nofile  64000
root    soft    stack   unlimited
root    hard    stack   unlimited
root    soft    nproc   32000
root    hard    nproc   32000
*       soft    nofile  64000
*       hard    nofile  64000
*       soft    stack   unlimited
*       soft    nproc   32000
*       hard    nproc   32000

プロセス再起動

$ cat /proc/`pgrep mongo | head -1`/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            unlimited            unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             32000                32000                processes 
Max open files            64000                64000                files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       13087                13087                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us        

反映された
エラーも消えた。

実際の作業はchef流して、各mongo鯖のプロセスを再起動。
一応全てのmongoを1台ずつ再起動していったから、メンテに入れること無く作業は終わりました。
こんな所まで管理できるのもちょっと怖いね

感想

今回のサービスがAWS上で0から環境を作るというものだったのだが、
今まで社内の環境でKickstartとかでデフォルトで入ってた用意されたインフラ的なものにいかに助けられてたかという事を痛感した。
もっかいちゃんと読んでみよう。


おまけ1

f:id:kakerukaeru:20131201172112p:plain
mongod側のconnectionsをちょっと広い期間で見てみる。
(間にconnectionsが0にまで下がってるのは、僕がmongoのメモリリークのバグを踏んでサービスメンテ状態を2回引き起こしたからです、ごめんなさい死にます)

本当に今になって思えばなんだけど、
このグラフの期間で増設をしてmongosの台数が約2.5倍になったのに
mongodのconnectionが500 -> 900しかいかないなんて単純に考えてオカシイ

ちなみに、その後ulimitの変更を全ての鯖に適応したら
f:id:kakerukaeru:20131201201750p:plain
1200近くまで上がりました(′ʘ⌄ʘ‵)

おまけ2

ulimit適用してもOS再起動時に反映されてないんじゃないの?
【参考】http://blog.father.gedow.net/2012/08/08/ulimit-configuration/
といろいろ不安になったが、そもそも起動スクリプトにulimit書くとか以前に、起動ユーザーのulimitの値を引き継いでプロセスが上がってくるから、そんな心配はいらなかった
実際、試してみたら実行ユーザのulimitで上がってきました。

おまけ???

max processes1024
やんけ!と発見した後に、ulimitが原因だったと他に示す証拠が出てこなかったので、ステージング環境でmax processesを125とかにして再現するか試してみたらmongod自体が死んでテストにならなかった。うふふ
結局500ぐらいに変えて再発した。ので本番にも適用することにした。
状況証拠を集めみたいになってしまったが、今思えばmongodとかもログレベル上げてみれば良かったんや。