ali*_*cia 20 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.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)
Run Code Online (Sandbox Code Playgroud)
....
SEVERE: Error processed default web.xml named conf/web.xml at /local/myApp/apache-tomcat/conf/web.xml
java.io.FileNotFoundException: /local/myApp/apache-tomcat/conf/web.xml (Too many open files)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at org.apache.catalina.startup.ContextConfig.getWebXmlSource(ContextConfig.java:1838)
at org.apache.catalina.startup.ContextConfig.getGlobalWebXmlSource(ContextConfig.java:1745)
at org.apache.catalina.startup.ContextConfig.getDefaultWebXmlFragment(ContextConfig.java:1418)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1253)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:878)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:369)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5269)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3926)
at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:426)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519)
at java.lang.Thread.run(Thread.java:722)
Run Code Online (Sandbox Code Playgroud)
我检查打开文件的限制,它是1024,但当我用lsof检查应用程序的打开文件数量接近200时,如果没有达到限制,为什么会这样呢?我应该增加限额吗?有没有其他理由得到这个错误?让服务再次正常运行的唯一方法是重新启动tomcat,还有另一种恢复正常的方法吗?
提前致谢.
编辑:这是处理doPost方法的servlet,一开始我没有关闭每一个流,可能是那个吗?我添加了finally语句:
InputStream is = null;
DataInputStream dis = null;
OutputStream os = null;
DataOutputStream dos = null;
String paramName = "";
try {
os = response.getOutputStream();
is = request.getInputStream();
dis = new DataInputStream(is);
dos = new DataOutputStream(os);
.....
}catch (Throwable e) {
LOGGER.error(e.getMessage());
} finally {
if (dis != null) {
dis.close();
}
else if(is != null) {
is.close();
}
if (dos != null) {
dos.close();
}
else if( os != null) {
os.close();
}
}
Run Code Online (Sandbox Code Playgroud)
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
Zou*_*ias 15
执行以下操作以获取tomcat7的pid(例如1234)
ps aux |grep tomcat7
Run Code Online (Sandbox Code Playgroud)
然后呢
cat /proc/1234/limits 阅读如下所示的行
Max open files 16384 16384 files
这些是Tomcat允许的最大打开文件数.要增加它,请按照以下说明操作
知道您可以通过将以下内容添加到以下内容来更改已打开文件的限制可能很有用/etc/security/limits.conf:
* soft nofile 2048 # Set the limit according to your needs
* hard nofile 2048
Run Code Online (Sandbox Code Playgroud)
然后,您可以sysctl -p在shell上重新加载配置.看看这篇文章.
为了完整起见,您可以使用以下方法验证打开文件的当前限制: ulimit -n
小智 7
这将显示该进程的所有打开文件.
ls -l /proc/tomcatPID/fd
Run Code Online (Sandbox Code Playgroud)
这将显示打开文件的数量.
ls -l /proc/tomcatPID/fd | wc -l
Run Code Online (Sandbox Code Playgroud)
增加打开文件限制更新/etc/Secirity/limits.conf.
要检查没有特定于tomcat的打开文件:
硬限制: su - tomcat -c 'ulimit -Hn' -s '/bin/bash'
软限制: su - tomcat -c 'ulimit -Sn' -s '/bin/bash'
您可以使用玉米作业运行以下脚本以了解打开文件的详细信息.
=============================
#!/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
=================
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
47087 次 |
| 最近记录: |