今天有朋友让帮忙看一下tomcat的问题,错误信息是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
针对这个问题有两个解决办法,一个治标一个治本。
1、治标
ulimit -n 2048 增加文件描述符最大数。
2、治本
检查程序,把socket和file操作都关掉。