読者です 読者をやめる 読者になる 読者になる

煙と消えるその前に

一服してるうちに忘れる、自分のための備忘録。とかとか

FishEyeでToo many open fileが出た

FishEye

背景

Atlassianのソースコード管理ソフトウェアFishEyeを使ってみたらToo many open fileエラーが出たのでメモ

環境

  • マシン

現象

クライアント側からgit cloneしようとしたら400が返ってきてアレ?!となった。
サーバ側のログを見てみたらこんなエラーが出てた

Caused by: java.io.IOException: Cannot run program "git" (in directory "/opt/atlassian/fisheye/var/cache/APE-Sapporo/clone"): java
.io.IOException: error=24, Too many open files

サバ側で軽く調べてみたらこんな感じ
再起動後に調べてみたのでまだセーフだけど、けっこうぎりぎりなのかな

$ sudo /usr/sbin/lsof -p [FishEyeのpid] | wc -l
982

デフォルトで開けるファイルディスクリプタの上限は1024だった。ついでにプロセスの値を見てもそうなってた

$ cat /proc/[pid]/limits  | grep "open files"
Max open files            1024                 1024                 files

対応

安直だけど、サーバ側の上限を上げてやることにします
/etc/security/limits.confを編集してやるのが早いんだけど、それだと全プロセスに影響するからちょっとやだなー・・・
ということで、FishEyeの起動スクリプトにulimitを追加しました。

  • diffはこんな感じ
$ diff /opt/atlassian/fisheye/bin/fisheyectl.sh{,.org}
55c55
<   nohup sh -c "ulimit -n 2048 && exec $FISHEYE_CMD $@ $FISHEYE_ARGS >> $FISHEYE_INST/var/log/fisheye.out 2>&1" &
---
>   nohup sh -c "exec $FISHEYE_CMD $@ $FISHEYE_ARGS >> $FISHEYE_INST/var/log/fisheye.out 2>&1" &
  • 再起動して制限を確認すると増えてた
$ cat /proc/[pid]/limits | grep "open files"
Max open files            2048                 2048                 files

ちなみに、このやり方だとFishEyeの起動ユーザをrootにしてやる必要がありました

$ sudo sh /opt/atlassian/fisheye/bin/fisheyectl.sh start