深入分析Tomcat无响应问题及解决方法

  问题描述

  生产环境下有几台tomcat,但突然某个时候发现所有的请求都不能响应了,由于我们的web server使用的是nginx,会将请求反向到tomcat上,所以起初怀疑是nginx就没有收到请求,但查看日志后发现,nginx中大量出现499的返回,这说明问题还是出在tomcat上.

  问题排查

  首先我想到的是不是CPU跑满了,虽说CPU没有报警但还是本能的top命令看下系统负载,发现系统只有0.x的负载,cpu,内存消耗都是正常的.

  由于CPU没有出现异常,所以应该不是GC出现了问题,但还是检查了下GC log,果然GC也没问题

  此时必须让jstack上场了,果然在使用jstack后发现很多线程都是WAITING状态

  

"http-nio-127.0.0.1-801-exec-498" daemon prio=10 tid=0x00002ada7c14f800 nid=0x16a6 waiting on condition [0x00002ada9c905000]

  java.lang.Thread.State: WAITING (parking)

  at sun.misc.Unsafe.park(Native Method)

  - parking to wait for <0x00000007873e6990> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)

  at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)

  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)

  at org.apache.http.pool.PoolEntryFuture.await(PoolEntryFuture.java:133)

  at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:282)

  at org.apache.http.pool.AbstractConnPool.access$000(AbstractConnPool.java:64)

  at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:177)

  at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:170)

  at org.apache.http.pool.PoolEntryFuture.get(PoolEntryFuture.java:102)

  at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:240)

  at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:227)

  at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:173)

  at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195)

  at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:85)

  at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)

  at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186)

  at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)

  at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)

  at com.weimai.utils.HttpClientUtil.doGet(HttpClientUtil.java:105)

  at com.weimai.utils.HttpClientUtil.doGet(HttpClientUtil.java:87)

  at com.weimai.utils.WeiBoUtil.checkUser(WeiBoUtil.java:214)

  at com.weimai.web.UserInfoController.newWeiboLogin(UserInfoController.java:1223)

  at sun.reflect.GeneratedMethodAccessor390.invoke(Unknown Source)

  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

  at java.lang.reflect.Method.invoke(Method.java:606)

  此时意识到问题应该出现http连接上,马上用netstat查看下801端口的连接状态,果然发现很多请求都是CLOSE_WAIT,这里简单解释下CLOSE_WAIT状态,如果我们的client程序处于CLOSE_WAIT状态的话,说明套接字是被动关闭的,整个流程应该是这样

  因为如果是server端主动断掉当前连接的话,那么双方关闭这个TCP连接共需要四个packet

  server -> FIN -> client

  server <- ACK <- client

  这时候server端处于FIN_WAIT_2状态,而我们的程序处于CLOSE_WAIT状态

  server <- FIN <- client

  这时client发送FIN给server,client就置为LAST_ACK状态。

  server -> ACK -> client

  server回应了ACK,那么client的套接字才会真正置为CLOSED状态

  我们的请求处于CLOSE_WAIT状态,而不是LAST_ACK状态,说明还没有发FIN给server,那么很简单,去看HttpClientUtil中如何处理就知道了,果然在查看HttpClientUtil代码中发现对于非正常关闭的http连接没有做abort,补充完善好try catch finally块后问题得到解决.

(0)

相关推荐

  • 关于 Tomcat进程意外退出的问题解析

    节前某个部门的测试环境反馈tomcat会意外退出,我们到实际环境排查后发现不是jvm crash,日志里有进程销毁的记录,从pause到destory的整个过程: org.apache.coyote.AbstractProtocol pause Pausing ProtocolHandler org.apache.catalina.core.StandardService stopInternal Stopping service Catalina org.apache.coyote.Abstr

  • tomcat报错:Wrapper cannot find servlet class ...问题解决

    tomcat发布工程时,在浏览器输入正确的地址,遇到如下问题: HTTP Status 500 - javax.servlet.ServletException: Wrapper cannot find servlet class xxx or a class it depends on .... .... java.lang.ClassNotFoundException: xxx .... ... 问题分析: web.xml文件中<servle-mapping>和<servlet-cl

  • Tomcat启动失败的问题排查与解决

    前言 最近在某应用更新代码后部分机器发布失败,发布失败的机器上Tomcat一直没有启动成功,日志卡在Deploying web application,重启数次之后仍然是一样的情况.所以进行排查问题,下面记录了所有的排查过程,需要的朋友们可以参考学习. 排查过程 1. Tomcat启动线程卡住 下文中Tomcat启动线程代指线程名为localhost-startStop-$id的线程. 使用jstack打印出Tomcat的线程堆栈: jstack `jps |grep Bootstrap |aw

  • Tomcat能起开,但是访问不进8080首页的问题解决方案

    最近公司项目遇到这个问题,tomcat能起开,但是访问不进8080首页,经过网上查找资料,终于解决了此问题,这里记录一下,希望能帮助遇到同样问题的同行! 第一步:双击eclipse的service下tomcat,弹出界面 第二步 由于是默认灰色的,要将部署好的项目移除后再进行修改 第三步,将其改为 Use Tomcat installation 第四步,保存即可,如果出现保存不了的情况,则是项目还在运行,将项目关掉再试一次即可! 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • Tomcat服务无法启动的问题的解决方法

    去年下半年公司就决定投入人力物力"跟风"做大数据方向的研究并应用到后续项目中,于是乎,我们也得熟悉下Java才行了. 先弄个JavaEE的开发环境再说吧.装JDK.JRE,其实JDK下面已经有JRE了,如果在服务器上的话,只需装JRE:然后配置环境变量: 新建:JAVA_HOME:D:\Java\jdk1.7.0_51新建:CLASS_PATH:.;%JAVA_HOME%\lib编辑:PATH:在最前面加上 %JAVA_HOME%\bin; 接着装Tomcat,startup.bat.

  • 深入分析Tomcat无响应问题及解决方法

    问题描述 生产环境下有几台tomcat,但突然某个时候发现所有的请求都不能响应了,由于我们的web server使用的是nginx,会将请求反向到tomcat上,所以起初怀疑是nginx就没有收到请求,但查看日志后发现,nginx中大量出现499的返回,这说明问题还是出在tomcat上. 问题排查 首先我想到的是不是CPU跑满了,虽说CPU没有报警但还是本能的top命令看下系统负载,发现系统只有0.x的负载,cpu,内存消耗都是正常的. 由于CPU没有出现异常,所以应该不是GC出现了问题,但还是

  • jQuery的Ajax时无响应数据的解决方法

    复制代码 代码如下: $.ajax( { type: "POST", url: "/MemberComment.aspx/GetOrderToBeCommentCount", success: function(result) { //ToDo: } ) 使用时JS也没有报错.这个是我最郁闷的事了.不知道哪错.. 5分钟...10分钟....20分钟..... 从c#代码到浏览器一个个排查问题发现都OK. 最后问题的原因是改为如下就OK,少了2个属性: 复制代码 代

  • idea日志乱码和tomcat日志乱码问题的解决方法

    1 idea启动tomcat乱码 遇到的问题: idea整合SSM项目,tomcat启动,启动时查看idea上的tomcat日志,出现乱码: 但是直接用tomcat 的 startup.bat启动,无乱码: 2,出现的原因: 查看tomcat/conf/logging.properties java.util.logging.ConsoleHandler.encoding = GBK 而本window系统使用的也是GBK编码,所以直接使用bat文件启动正常,但是idea上配置的是UTF-8,所以

  • 有关tomcat内存溢出的完美解决方法

    tomcat内存溢出设置JAVA_OPTS 答案1 设置Tomcat启动的初始内存 其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4.可以利用JVM提供的-Xmn -Xms -Xmx等选项可 进行设置 三.实例,以下给出1G内存环境下java jvm 的参数设置参考: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -D

  • 新装linux系统/etc/sysconfig目录下无iptables文件的解决方法

    今天新装了Linux,希望去做些防火墙的策略,使用service iptables status查看防火墙的状态时,无任何反应,且使用service iptables start也启动不聊.后来发现在/etc/sysconfig目录下没有iptables文件(防火墙的策略一般都写在此文件中). 原因:在新安装的Linux系统中,防火墙默认是被禁掉的,一般也没有配置过任何防火墙的策略,所有不存在/etc/sysconfig/iptables文件. 解决方法: 在控制台使用iptables命令随便写

  • Windows Server 2008 R2网站访问PHP响应慢的解决方法

    最近换了台新服务器,由于内存是8G的,所以就换了Windows Server 2008 R2 这款系统,虽然有点陌生,但是熟悉了一下感觉性能非常好,但是在配置完PHP环境之后却发现了问题,访问HTML速度飞快,而访问PHP网页时就要卡顿几秒,好像响应很慢的样子,排除了带宽的因素之后,在百度上搜了一圈,竟然解决了,现在将方法转载给大家,其实解决方法很简单哦. IIS7.5网站访问PHP响应慢的原因 原因是PHP5.3以上支持IPv6协议,但是大家的服务器未使用IPv6,当访问PHP的时候会连接My

  • SpringBoot应用部署到Tomcat中无法启动的解决方法

    背景 最近公司在做一些内部的小型Web应用时, 为了提高开发效率决定使用SpringBoot, 这货自带Servlet容器, 你在开发Web应用时可以直接在本地像运行控制台应用一样启动,省去了重复部署的时间:配置上相比于SpringMVC也是有了大大的简化.SpringBoot的应用可以直接打成一个可运行的jar包, 你无需发愁为了不同应用要部署多个Tomcat.但是实际部署时你会发现打成Jar包的方式有一个致命的缺点, 当你改动了一个资源文件.或者一个类时, 打要往服务器重新上传全量jar包.

  • 腾讯云服务器tomcat端口无法访问的解决方法

    最近用腾讯云配置了服务器,在使用的时候发现tomcat端口无法访问,所以在网上找了点资料,一共有两种情况,下面总结一下,希望对大家有所帮助,也给自己留个笔记. 第一种情况: 如题:https://console.cloud.tencent.com/cvm/securitygroup需要去这个地址设置安全组. 说实话,一句mmp不知当讲不当讲.使用说明这块太乱了. 当然更改了安全组和防火墙还是不行.于是我查看Tomcat的记录,发现: /home/apache-tomcat-8.5.37/bin/

  • idea启动Tomcat时控制台乱码的解决方法(亲测有效)

    目录 前言 解决方法: 方法一: 方法二: 方法三: 方法四: 总结 前言 很多人在idea中启动项目时会出现控制台的中文乱码,其实也无伤大雅,但是本人看着不舒服所以在网上查找了一些方法和各位分享一下 解决方法: 方法一: 1.打开tomcat配置页面,Edit Configurations. 2.选择项目部署的tomcat,在配置项VM options输入框中输入-Dfile.encoding=UTF-8,点击Apply或OK即可. 3.修改idea设置里的文件编码格式为utf-8. 我修改了

  • Tomcat内存溢出分析及解决方法

    JVM管理两种类型的内存,堆和非堆.堆是给开发人员用的上面说的就是,是在JVM启动时创建:非堆是留给JVM自己用的,用来存放类的信息的.它和堆不同,运行期内GC不会释放空间. 一.内存溢出类型 1.java.lang.OutOfMemoryError: PermGen space JVM管理两种类型的内存,堆和非堆.堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的.它和堆不同,运行期内GC不会释放空间.如果web app用了大量的第三方jar或者

随机推荐