tomcat與apache整合的時候,在tomcat/conf/server.xml中配置ajp最大連接參數(shù)maxThreads為1024。然后重啟服務器,當線程數(shù)達到1024峰值的時候,報
java.net.SocketException: Too many open files錯誤。
以下為網(wǎng)上摘抄的解決方案與解惑:
在Unix/Linux系統(tǒng)中,無論是socket還是file訪問,在后臺為該訪問程序分配了一個文件描述符(descriptor),該文件描
述符為應用程序與基礎操作系統(tǒng)之間的交互提供了通用接口。Unix/Linux系統(tǒng)對每個進程能打開文件描述符有最大限制,一般默認是1024。如果在操
作socket和file的時候忘記關閉,當超過系統(tǒng)默認的最大限制,則出現(xiàn)java.net.SocketException: Too many
open files。
查看系統(tǒng)默認文件描述符的最大限制數(shù)
#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 增加文件描述符最大數(shù)
就我目前遇到的問題,的確是因為socket打開連接太多了。
當然,網(wǎng)上其他人說的,諸如文件流沒有關閉,也可能會導致這個問題。如果是這種情況,請檢查程序,把不必要的socket或file操作關閉掉即可解決。