おおいしつかさ


旅行とバイクとドライブと料理と宇宙が好き。
Ubie Discoveryのプログラマ。
Share:  このエントリーをはてなブックマークに追加

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などでも起きたりしないのでしょうか。