业务异常信息中包含了“too many open files”,最后定为是重启JAVA进程的时候,文件最大打开数被设置小了。
1、查看Java进程能够打开的最大文件数
cat /proc/[pid]/limits,其中max open files就是能打开的最大文件数。
2、查看java进程现在打开的文件数
lsof -p [pid] | wc -l
可以使用 lsof -p 26374 > /tmp/java_pid_lsof.log导出之后查看详情。
其中web应用中,很多jar包、日志文件、TCP连接等都占用文件数量。
3、针对java进程的open files限制,进行赋值。
在java进程启动的脚本中进行控制,例如:ulimit -n number,如果不设置,取父进程的限制,如果父进程无,则继承当前用户的限制设置。
用户的limits可通过/etc/security/limits.conf来控制,也可通过放入/etc/security/limits.d/*.conf来控制,limits.conf内容怎么写这个在文件本身有很详细的解释,就不在这里多说了。
4、查看特定用户的限制
通过ulimit -a来查看当前用户的限制描述。
5、系统级的限制如何看
两途径查看,系统级的限制对所有用户生效。
第一种:cat /proc/sys/fs/file-max
第二种:sysctl -a | grep file-max
6、查看文件被打开的进程
lsof path/filename
lsof /usr/local/JDK-1.6.0_06/jre/lib/jce.jar
7、其他
至于如何查到对应的Java代码中为什么打开了这么多的文件,主要可通过btrace监控文件API和socket open的相关API的调用,从而确定原因。
顺带说下,max processes是用于限制进程本身最多派生的子进程数以及线程数个数,对于java而言,主要就是限制线程数,可通过ulimit -u来做设置。
ulimit: usage: ulimit [-SHacdfilmnpqstuvx] [limit],可以通过红框里边的参数进行具体数值的参考及设置。
其它文章: http://blog.yufeng.info/archives/1380