Tomcat 8挂起.请求仍在进行中,但没有回复

Joh*_*ohn 6 java mysql tomcat hang tomcat8

我正在运行Tomcat 8.0.14(最近从Tomcat 5.5升级)并且遇到了非常不一致的应用程序服务器挂起.

  • 发生挂起时,尝试导航到任何页面会导致无限等待
  • Tomcat作为Windows服务运行,服务仍在运行,但必须重新启动才能使应用程序重新联机.我查看了网络流量,看来tomcat正在接收请求,但没有生成任何响应.
  • 发生挂起时,所有http-nio线程都在等待获取与数据库的连接.由于处于等待模式的所有线程,这可能是前一点的原因.请参阅下面的一个线程的线程转储(它们都在做同样的事情,因此不需要发布整个线程转储).所有的nio线程似乎都在等待同一个锁(停车等待<7ed51011>).
  • 我们没有接近最大化堆空间的地方
  • 我们正在记录已放弃的连接,并且在日志中没有看到有关已放弃连接的任
  • 任何tomcat日志都绝对没有错误.没有连接池耗尽异常,内存不足异常等等.没有.

"http-nio-8080-exec-57" - Thread t@58985
   java.lang.Thread.State: WAITING
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for <7ed51011> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(Unknown Source)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
    at org.apache.tomcat.dbcp.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:582)
    at org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:439)
    at org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:360)
    at org.apache.tomcat.dbcp.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:118)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1412)
    at xx.xx.XXXXConnection.getConnection(XXXXConnection.java:62)
    at xx.xx.XX.insert(XX.java:36)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
    - locked <6aa0c93c> (a org.apache.tomcat.util.net.NioChannel)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

   Locked ownable synchronizers:
    - locked <242c7551> (a java.util.concurrent.ThreadPoolExecutor$Worker)
Run Code Online (Sandbox Code Playgroud)

我们尝试过以下方法:

  • 我们一直在使用VisualVM监视应用程序,而不是在挂起期间看到所有线程等待连接,我们没有看到任何指示问题的内容.
  • 我们已经分析了应用程序,并没有看到任何内存泄漏
  • 我们增加了连接池中的连接数,但是我们没有看到任何方式达到最大值(500).
  • 启用了垃圾收集的日志记录,只看到集合只需要几分之一秒.

我开始认为这可能是网络或ISP中的某些东西,因为它非常不一致.应用程序始终具有相当一致的负载,有时可以运行好几天,然后在几分钟内崩溃几次.也许网络以某种方式阻止了回复?

有人有任何想法吗?这让我感到疯狂,因为我们没有报告任何问题.

2015年8月31日更新

Tomcat今天早上像疯了似的.它在一个半小时内挂了7次.我一直在监视端口8080上的连接,并且它保持在110左右.在挂起期间服务器上仍然可以使用tomcat示例WAR.

**2015年9月7日更新**

有没有人看到下面的资源设置有问题?

<Resource name="jdbc/XX" auth="Container" type="javax.sql.DataSource"
        driverClassName="com.mysql.jdbc.Driver"
        maxActive="500" 
        minIdle="30" 
        maxIdle="200" 
        maxWait="20000"
        username="username" 
        password="password" 
        url="jdbc:mysql://localhost/XX?autoReconnect=true" 
    removeAbandoned="true" 
    removeAbandonedTimeout="60" 
    logAbandoned="true"/>
Run Code Online (Sandbox Code Playgroud)