Java tomcat中的错误";“打开的文件太多”;
我有一个在tomcat上运行的应用程序,有时会出现以下错误:Java tomcat中的错误";“打开的文件太多”;,java,tomcat,servlets,tomcat7,Java,Tomcat,Servlets,Tomcat7,我有一个在tomcat上运行的应用程序,有时会出现以下错误: SEVERE: Socket accept failed java.net.SocketException: Too many open files at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398) at java.net
SEVERE: Socket accept failed
java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
at java.net.ServerSocket.implAccept(ServerSocket.java:522)
at java.net.ServerSocket.accept(ServerSocket.java:490)
at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:216)
at java.lang.Thread.run(Thread.java:722)
EDIT2:
在做了一些测试之后,我意识到如果我先关闭DataInputStream,然后关闭InputStream,我会在通信的另一部分得到消息之前的一个数字(我不知道为什么)。我改变了关闭流程的顺序,似乎一切都正常。但我还是有问题。有什么想法吗
finally {
if(is != null) {
try {
is.close();
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
}
if (dis != null) {
try {
dis.close();
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
}
if(os != null) {
try {
os.close();
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
}
if (dos != null) {
try {
dos.close();
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
}
}
您可以通过将以下内容添加到
/etc/security/limits.conf
,来更改打开文件的限制,这可能很有用:
* soft nofile 2048 # Set the limit according to your needs
* hard nofile 2048
然后您可以使用shell上的sysctl-p
重新加载配置。检查
为了完整起见,您可以使用以下命令验证打开文件的当前限制:
ulimit-n
执行以下操作以获取tomcat7的pid,例如1234
ps aux |grep tomcat7
然后呢
cat/proc/1234/limits
读取如下行
Max open files 16384 16384 files
这是Tomcat允许的最大打开文件数。要增加它,请按照以下说明操作
@gaboroncancio发布的答案基本正确,但他关于如何使设置生效的建议并不完全正确
sysctl-p
将重新加载/etc/sysctl.conf
,或作为参数传入的任何文件。但是,sysctl
命令将无法识别/etc/security/limits.conf
的格式
要重新加载
/etc/security/limits.conf
,您只需注销并重新登录。按照以下说明快速分析服务器的当前配置,并调整tomcat硬限制和软限制以解决此问题
这将显示该进程的所有打开的文件
ls -l /proc/tomcatPID/fd
这将显示打开文件的计数
ls -l /proc/tomcatPID/fd | wc -l
=============================
#!/bin/bash
PID=$(ps -ef|grep tomcat6|grep -v grep |awk '{print $2}')
value=$(ls -l /proc/$PID/fd | wc -l)
echo `date`@$PID:$value >> /usr/local/filecount.txt
if [ $value -gt 2000 ];
then
printf "\n\n\n\n\n" >> /usr/local/files_report.txt
echo "-------------------------------`date`--Starting Session----------------------" >> /usr/local/files_report.txt
openfiles=$(ls -l /proc/$PID/fd | awk '{print NR,$11 "" >> "/usr/local/files_report.txt"}')
echo "--------------------`date`---Ending Session ------------------------------" >> /usr/local/files_report.txt
fi
=================
要增加打开文件的限制,请更新/etc/security/limits.conf
要检查特定于tomcat的打开文件的数量,请执行以下操作:
硬限制:su-tomcat-c'ulimit-Hn'-s'/bin/bash'
软限制:su-tomcat-c'ulimit-Sn'-s'/bin/bash'
您可以使用corn作业运行下面的脚本,以了解打开文件的详细信息
ls -l /proc/tomcatPID/fd | wc -l
=============================
#!/bin/bash
PID=$(ps -ef|grep tomcat6|grep -v grep |awk '{print $2}')
value=$(ls -l /proc/$PID/fd | wc -l)
echo `date`@$PID:$value >> /usr/local/filecount.txt
if [ $value -gt 2000 ];
then
printf "\n\n\n\n\n" >> /usr/local/files_report.txt
echo "-------------------------------`date`--Starting Session----------------------" >> /usr/local/files_report.txt
openfiles=$(ls -l /proc/$PID/fd | awk '{print NR,$11 "" >> "/usr/local/files_report.txt"}')
echo "--------------------`date`---Ending Session ------------------------------" >> /usr/local/files_report.txt
fi
=================
是的,我检查了这个网站,但作为一项服务,它的最大使用量也不超过200,为什么要将限制提高到4096?你应该首先在网站上搜索你的错误:共享你的代码!如果没有任何代码片段,我们将无能为力。@developerwjk首先,我检查了网站,增加打开文件的限制可能是个主意,但由于我没有达到限制的上限,我想这并不能解决我的问题。tomcat是在Windows还是在Linux机器上运行?我已经检查并将打开的文件数量增加到无法访问的数量。我认为这更像是对应用程序内部线程的糟糕管理,是吗?是的,我想你可能在应用程序中泄漏了文件处理程序/连接。有没有办法查看那些打开的文件的列表?查看哪个线程打开了它们会很有用。格式化好。是的,重新加载值需要返回日志