BLOGTIMES
2011/05/02

Too many open files と言われたときは

  linux 
このエントリーをはてなブックマークに追加

テスト用に起動しておいた Tomcat の動きが怪しいなと思ったら、ログに Too many open files の文字が大量に出ていました。どうやらシステムで許されているディスクリプタの上限値にあたってしまったようです。ちなみに CentOS の ulimit の値はデフォルトではこんな感じになっていました。ファイルディスクリプタの上限は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) 32743 max locked memory (kbytes, -l) 32 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) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 32743 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited

ユーザーが root の場合には素直に ulimit 使うところですが、今回は一般ユーザーで動かしている Tomcat だったので /etc/security/limits.conf に下記の行を挿入してとりあえず回避することができました。

user_name soft nofile 65536 user_name hard nofile 65536

ちなみにこのファイルはどういう風に読み込まれているのか、ちょっと詳しく調べてみたら下記のような話が見つかりました。
この回避方法は daemon 系のプロセスだと思わぬところでハマるようなので気をつけないといけないようです。

ファイルディスクリプタ数の上限変更とlimits.confの罠 (ゆめ技:ゆめみスタッフブログ)

daemon系プロセスのファイルディスクリプタ数上限を設定する際、/etc/security/limits.conf は使えません。状況によっては一見設定されたように見えますが、大きな落とし穴にはまることになります。
面倒ですが、必要なプロセス毎にulimitを用いて適切に設定しましょう。

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/4195
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン