当前位置: 首页 > 知识库问答 >
问题:

JAVA网SocketException:SpringHibernateTomcat时打开的文件太多

勾俊
2023-03-14

我有一个Hibernate,Spring,Debian,Tomcat,MySql堆栈在Linode服务器上与一些客户端一起生产。它是一个Spring多租户应用程序,为大约30个客户端托管网页。

应用程序开始罚款,然后过了一会儿,我得到这个错误:

java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390)
at java.net.ServerSocket.implAccept(ServerSocket.java:453)
at java.net.ServerSocket.accept(ServerSocket.java:421)
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:662)

但是,在抛出此错误之前,nagios会提醒我对服务器的ping停止响应。

以前,我有nginx作为代理,并得到这个nginx错误每个请求,但不得不重新启动tomcat无论如何:

2014/04/21 12:31:28 [error] 2259#0: *2441630 no live upstreams while connecting to upstream, client: 66.249.64.115, server: abril, request: "GET /catalog.do?op=requestPage&selectedPage=-195&category=2&offSet=-197&page=-193&searchBox= HTTP/1.1", upstream: "http://appcluster/catalog.do?op=requestPage&selectedPage=-195&category=2&offSet=-197&page=-193&searchBox=", host: "www.anabocafe.com"
2014/04/21 12:31:40 [error] 2259#0: *2441641 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 200.74.195.61, server: abril, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "www.oli-med.com"

这是我的server.xml连接器配置:

<Connector port="80" protocol="HTTP/1.1"
                maxHttpHeaderSize="8192"
               maxThreads="500" minSpareThreads="250"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true"
               acceptorThreadCount="2" />

我尝试使用本教程更改ulimit,我能够为运行tomcat的用户更改打开的文件描述符的硬限制,但没有解决问题,应用程序仍然挂起。

上次我必须重新启动服务器时,它运行了大约3个小时,我有以下关于套接字打开连接的值:

lsof -p TOMCAT_PID | wc -l
632 (more or less!! i did not write the exact number)

这个数字突然开始增长。

我有一些应用程序非常相似,这一个在其他服务器上,不同的是,他们是一个独立的版本,这是一个多租户架构,我注意到,在这个应用程序我得到这些类型的套接字连接,这不会发生在独立的版本任何其他装置:

java    11506 root  646u  IPv6 136862      0t0     TCP lixxx-xxx.members.linode.com:www->180.76.6.16:49545 (ESTABLISHED)
java    11506 root  647u  IPv6 136873      0t0     TCP lixxx-xxx.members.linode.com:www->50.31.164.139:37734 (CLOSE_WAIT)
java    11506 root  648u  IPv6 135889      0t0     TCP lixxx-xxx.members.linode.com:www->ec2-54-247-188-179.eu-west-1.compute.amazonaws.com:28335 (CLOSE_WAIT)
java    11506 root  649u  IPv6 136882      0t0     TCP lixxx-xxx.members.linode.com:www->ec2-54-251-34-67.ap-southeast-1.compute.amazonaws.com:19023 (CLOSE_WAIT)
java    11506 root  650u  IPv6 136884      0t0     TCP lixxx-xxx.members.linode.com:www->crawl-66-249-75-113.googlebot.com:39665 (ESTABLISHED)
java    11506 root  651u  IPv6 136886      0t0     TCP lixxx-xxx.members.linode.com:www->190.97.240.116.viginet.com.ve:1391 (ESTABLISHED)
java    11506 root  652u  IPv6 136887      0t0     TCP lixxx-xxx.members.linode.com:www->ec2-50-112-95-211.us-west-2.compute.amazonaws.com:19345 (ESTABLISHED)
java    11506 root  653u  IPv6 136889      0t0     TCP lixxx-xxx.members.linode.com:www->ec2-54-248-250-232.ap-northeast-1.compute.amazonaws.com:51153 (ESTABLISHED)
java    11506 root  654u  IPv6 136897      0t0     TCP lixxx-xxx.members.linode.com:www->baiduspider-180-76-5-149.crawl.baidu.com:31768 (ESTABLISHED)
java    11506 root  655u  IPv6 136898      0t0     TCP lixxx-xxx.members.linode.com:www->msnbot-157-55-32-60.search.msn.com:35100 (ESTABLISHED)
java    11506 root  656u  IPv6 136900      0t0     TCP lixxx-xxx.members.linode.com:www->50.31.164.139:47511 (ESTABLISHED)
java    11506 root  657u  IPv6 135924      0t0     TCP lixxx-xxx.members.linode.com:www->ec2-184-73-237-85.compute-1.amazonaws.com:28206 (ESTABLISHED)

我猜它们是某种自动连接。

所以我的问题是:

我如何确定问题是由于我的代码、服务器还是某种攻击造成的?您建议采用哪种方法来解决这个问题?

提前感谢:)

共有3个答案

景永望
2023-03-14

我们有同样的奇怪的问题(我们的tomcat服务每天晚上重新启动(它清理打开的句柄),所以错误不是经常发生)。我们使用带有ajp协议的apache代理。这个问题是错误的协议实现。
我们的连接器配置如下:

<Connector
        port="8009"
        protocol="org.apache.coyote.ajp.AjpNioProtocol"
        connectionTimeout="1800000"

        acceptorThreadCount="2"
        maxThreads="400"
        maxConnections="8192"
        asyncTimeout="20000"
        acceptCount="200"
        minSpareThreads="40"
        compression="on"
        compressableMimeType="text/html,text/xml,text/plain"

        enableLookups="false"
        URIEncoding="UTF-8"
        redirectPort="8443" />

请注意:协议="org.apache.coyote.ajp.AjpNioProtocol"
这个实现为我们做到了——不再有打开的文件句柄。更多信息可以在这里找到:https://itellity.wordpress.com/2013/07/12/getting-rid-of-close_waits-in-tomcat-67-with-mod_proxy/
我希望这能帮助某人。有一个愉快的一天!

柴琨
2023-03-14

您是否检查了运行tomcat的用户的ulimit?默认情况下,Linux最多只能打开1024个文件。更多关于如何更改Linux中打开的文件数量限制的信息?

您可能在配置中有太多的连接,或者由于某些原因您没有正确关闭某些IO流(极不可能)。

我将通过增加uLimited来接近它,然后运行一些负载测试来查看是什么导致了文件的使用。

尉迟明贤
2023-03-14

好的,原来问题是jdbc连接设置,maxActive设置为20个连接,我将限制改为200,问题就停止了。

我认为这就是问题所在,这要归功于appdynamics。com是一个很棒的工具,它可以让您检查应用程序InfraeStructure性能指标中的大量指标。

此外,我还发现了这篇关于这个主题的精彩文章,它帮助我调整了我的应用程序:

http://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency

政府文件也有助于:

https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html.

我猜到达的连接开始了一个查询,首先崩溃了服务器响应能力,然后填补了操作系统套接字的限制,在linux中,打开套接字是打开文件。我希望这能帮助到某人!

编辑

喂!这个解决方案在短期内解决了这个问题,但是出现了另一个关于JDBC连接的错误,应用程序没有关闭连接,我在这里打开并解决了一个关于这个问题的问题

 类似资料:
  • 我正在Tomcat上运行一个web应用程序。我的应用程序连接到其他web服务以满足客户端的请求。有时我会得到java。网在打开URL连接时出现UnknownHostException,之后有时我开始使用java。网SocketException:打开的文件太多。我的服务器不再进一步接受连接。请导游。

  • 问题内容: 我使用多个文件来执行一些文件I / O(写入19个文件,确实如此)。写他们几百次后,我得到了。但实际上我一次只能打开几个文件。这里有什么问题?我可以验证写入是否成功。 问题答案: 在Linux和其他UNIX /类似UNIX的平台上,操作系统对进程在任何给定时间可能具有的打开文件描述符的数量进行了限制。在过去,此限制曾经是硬接线1,并且相对较小。如今,它要大得多(几百/千),并且受“软”

  • 问题内容: 我写了一种测试套件,它占用大量文件。一段时间(2h)之后,我得到了。我仔细检查了所有文件句柄是否再次关闭它们。但是错误仍然存​​在。 我试图找出使用允许的文件描述符的数量以及当前打开的文件描述符的数量: 因此,如果我运行以下测试: 我得到以下输出: 真奇怪,我期望打开的文件描述符会越来越多。我的脚本正确吗? 我正在使用python的记录器和子进程。那可能是我FD泄漏的原因吗? 谢谢,丹

  • 我们最近在尝试访问Unix服务器中的weblogic控制台时遇到了一个问题,我们将得到: 错误503--服务不可用 在日志文件中,它会指出: 原因:java。io。FileNotFoundException:/opt/weblogic1036/wlserver\u 10.3/server/lib/co 在谷歌上搜索了一番后,我找到了一个解决方案,其中指出/etc/security/limits。c

  • 我有一个错误:PHP无法打开流:打开的文件太多。 我在这里查看了stackoverflow的各种答案,但我无法解决这个问题。我主要尝试增加最大打开文件数的限制: 我已编辑/等/安全/限制。conf,其中我指定了: 保存并注销/重新启动该框后,命令: 仍打印出1024个。我不知道为什么这没有效果,我想这就是我得到php错误的原因。如果需要,我可以粘贴整个文件或任何其他配置文件。我使用的是PHP 5.

  • 今天早些时候,我访问了我最近推出的一个网站,页面上充斥着一个丑陋的jasperex0019:java.io.filenotfoundexception: /opt/tomcat/webapps/root/web-inf/lib/jstl-1.2.jar(打开的文件太多)。我检查了我的服务器日志和tomcat日志,它们充满了相同的错误。我增加了tomcat的最大打开文件限制,作为保持网站运行的临时解