TokyoTyrant で ttacceptsock failed エラー
TokyoTyrantを使用していて、ある日、ttacceptsock failedというエラーがログに吐かれていました。
ソースを読んでみると、ttutil.c の ttacceptsock() 内でのTCPコネクションのaccept時に、エラーが出ているようです。printデバッグでエラーコードをしらべてみると、EMFILEでした。
EMFILE
1プロセスがオープンできるファイル・ディスクリプタ数の上限に達した。
(参考: http://www.linux.or.jp/JM/html/LDP_man-pages/man2/accept.2.html)
1プロセスがオープンできるfd数はデフォルトで1024のようです。つまり、デフォルトのままだと1024以上のクライアントが登場したときにコネクションが確立できなくなります。
[tsukasa@ubuntu] $ ulimit -a
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-m: resident set size (kbytes) unlimited
-u: processes 4096
-n: file descriptors 1024
-l: locked-in-memory size (kb) 32
-v: address space (kb) unlimited
-x: file locks unlimited
-i: pending signals 4096
-q: bytes in POSIX msg queues 819200
-e: max nice 0
-r: max rt priority 0
TokyoTyrantは10000コネクション以上の環境でも高速に動くことが売りみたいなので、上限値をあげてあげました。
/etc/security/limits.conf に以下を追加します。設定方法は同ファイルのコメント内に丁寧に書かれています。
root soft nofile 16384
root hard nofile 16384
tsukasa soft nofile 16384
tsukasa hard nofile 16384
これで、上限値が16384になりました。ログインしなおして確かめます。
[tsukasa@ubuntu] $ ulimit -a
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-m: resident set size (kbytes) unlimited
-u: processes 4096
-n: file descriptors 16384
-l: locked-in-memory size (kb) 32
-v: address space (kb) unlimited
-x: file locks unlimited
-i: pending signals 4096
-q: bytes in POSIX msg queues 819200
-e: max nice 0
-r: max rt priority 0
これでTokyoTyrantの本領を発揮させてあげることができます。
でも、この問題ってapacheやMySQLなどでも起きたりしないのでしょうか。