tomcat与apache整合的时候,在tomcat/conf/server.xml中配置ajp最大连接参数maxThreads为1024。然后重启服务器,当线程数达到1024峰值的时候,报
java.net.SocketException: Too many open files错误。
以下为网上摘抄的解决方案与解惑:
在Unix/Linux系统中,无论是socket还是file访问,在后台为该访问程序分配了一个文件描述符(descriptor),该文件描
述符为应用程序与基础操作系统之间的交互提供了通用接口。Unix/Linux系统对每个进程能打开文件描述符有最大限制,一般默认是1024。如果在操
作socket和file的时候忘记关闭,当超过系统默认的最大限制,则出现java.net.SocketException: Too many
open files。
查看系统默认文件描述符的最大限制数
#ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
pending signals (-i) 1024
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
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 32764
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
查看某一进程打开的文件描述符
#lsof -p 进程ID
java 12451 root 1w REG 8,2 6130 2297363 /opt/log.txt
java 12451 root 43u sock 0,5 6741803 can't identify protocol
针对这个问题,解决办法如下:
ulimit -n 2048 增加文件描述符最大数
就我目前遇到的问题,的确是因为socket打开连接太多了。
当然,网上其他人说的,诸如文件流没有关闭,也可能会导致这个问题。如果是这种情况,请检查程序,把不必要的socket或file操作关闭掉即可解决。