HTC Aria つづき | Home | 今年もよろしくお願いします
2010/12/24 0:23 | 印刷

完全に備忘録。
知らない人は知らないTomcatの問題。
アクセスが多いサイトで標記のエラーが出て、画像ファイルなどにアクセスが出来なくなる現象がありました。原因は文字通りファイルを沢山開きすぎよ!なんですが。

環境はCentOS 5上で動作するTomcat 6で、ホストするアプリケーションはこのインスタンスでは1つだけ。開くファイルが多いと言ってもそんなにアクセスがあるわけではないのですが。

自分自身の書いたプログラムの場合はバグの可能性を疑うことなく一旦スルーして、まずは設定関係を疑ってみます。

まずLinuxでオープンできるファイル数の確認、

# cat /proc/sys/fs/file-max
206044
十分です。実際の使用数は、
# cat /proc/sys/fs/file-nr
3328   0   206044
あれ、なんか余裕みたい。

次に、プロセス単位のファイル制限値は、

# ulimit -a 
...
open files  (-n) 1024
...
お、意外に少ないんですね。これがたぶんデフォルト値でTomcatもこの制限を食らっているものと思われます。

プロセス単位で開いているファイルの数を調べるコマンドはなく、lsofコマンドで開いているファイルを列挙してその行数をカウントするしかないようで、

# /usr/sbin/lsof -p <pid> | wc -l
800から900くらいだった
こんな感じなので一時的に制限値を超えているのでしょう。

で、さきほどのulimitコマンドですが、

# ulimit -n 4096
とやってからプロセスを起動すると4096にセットされるようですので、デーモンとして起動しているスクリプトで設定してあげると解決しそうです。
# /etc/init.d/tomcat

start() {
    ulimit -n 8192
    $DEAMON \
    ...
    ...

この設定後1週間ほど運用していますが、

# /usr/sbin/lsof -p <pid> | wc -l
1215
おおっ、やはり微妙に制限値を超えていたようですね。
バグじゃなく、解決したようで安心です。ただこの数値がジリジリ増えていくようなら自分のプログラムを疑うことにします。


追記:
1ヶ月経ってエラーは出ていませんがオープンファイルの数が2000を超えました。制限値を大きくとっているので問題無いですが、どこまで増えていくのだろうか少し不安です。

いや~、サーバ管理は大変ですね。
解決したように見えますが、その後の地味~~な監視も怠るわけにはいかないので、精神的なストレスが大きいでしょう。
周りが理解してくれていれば良いのですが・・・
そうなんですよ、やっつけで放置するとあとで酷い目にあうんで。何時間もダウンするような事態だと精神的に持たないよ。。

コメント追加

タイトル
名前
E-mail
Webサイト
本文
情報保存 する  しない
  • 情報保存をすると次回からお名前等を入力する手間が省けます。
  • E-mailは公開されません - このエントリーの新規コメント通知が必要なら記入します。