Too many open files 対策

出たのはopscenterですが、、
td-agentとかは起動スクリプトに仕込まれてるし、ElasticsearchとかファイルI/O多いと出やすそうです。

#### ・エラー内容

```/var/log/opscenter/opscenterd.log
2015-12-01 02:09:59+0000 [] Unhandled Error
       exceptions.IOError: [Errno 24] Too many open files: '/usr/share/opscenter/content/js/ripcord/ripcord.js'
```

あーこれはulimitふやすやつかなと何となく思い出してきた。

#### ・現状確認

先輩がしらべてくれた該当プロセスのlimitはsoftlimitが抵触してそうでした。

```
$ sudo more /proc/834/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            10485760             unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             59327                59327                processes 
Max open files            1024                 4096                 files     #★←この行
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       59327                59327                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us        
```

#### ・対策

とりあえず、許可を得てsudo su - opscenterしてみたけどlimits.confかいてないと4096まではOKだけど
65536に広げようとしたら権限がなさそうなエラーが。

```
$ sudo su - opscenter
-bash-4.1$ ulimit -n 
1024
-bash-4.1$ ulimit -n 65536
-bash: ulimit: open files: cannot modify limit: 許可されていない操作です
-bash-4.1$ ulimit -n 4096
-bash-4.1$ ulimit -n
4096
```

で、この状態でプロセス再起動してもulimitに特に変化無し。
なのでtd-agentを見習って
　起動スクリプトのstartセクションにulimitを仕込む＋limits.confで上限を緩和
のコンボでulimitに変化が。

```
$ sudo vi /etc/security/limits.d/opscenter.conf 
opscenter - memlock unlimited
opscenter - nofile 100000
opscenter - nproc 32768
opscenter - as unlimited

$ sudo vi /etc/init.d/opscenterd
～略～
do_start()
{
    ulimit -n 65536 1>/dev/null 2>&1 || true   ##追加
    echo -n "Starting $NAME"
    daemon $OPSCENTER_SCRIPT || return 2
～略～

$ sudo service opscenterd restart
Restarting Cassandra cluster manager opscenterd
Stopping opscenterd                                        [  OK  ]
Starting opscenterd                                        [  OK  ]
$ sudo service opscenterd status
opscenterd (pid  10841) を実行中...
$ sudo more /proc/10841/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            10485760             unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             59327                59327                processes 
Max open files            65536                65536                files     #★←softlimit増えた
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       59327                59327                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us     
```

・limits.confだとOS再起動しないとだめそうだけどかかないと上限が4096までに。
・起動スクリプトのstartセクションに仕込むのが無難らしい

その後chefレシピでlimits.confと起動スクリプトをばら撒くcookbook_filesリソースを追加しときました。

以上。以下リンク先をよく読むのをお勧めしまっす。

#### ・参考サイト
http://mikio.github.io/article/2013/03/02_.html
http://blog.father.gedow.net/2012/08/08/ulimit-configuration/
http://ramblog.blog129.fc2.com/blog-category-4.html