java.net.SocketException: Too many open files
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 -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操作關閉掉即可解決。
posted on 2010-09-09 10:12 小一敗涂地 閱讀(4738) 評論(0) 編輯 收藏 所屬分類: tomcat、apache、jboss等服務器相關