http://www.myexception.cn/open-source/921974.html

Tomcat 假死原因分析

Tomcat 假死原因分析报告

最近监控服务发现有台tomcat 的应用出现了无法访问的情况,由于已做了集群,基本没有影响线上服务的正常使用。下面来简单描述该台tomcat当时具体的表现:客户端请求没有响应,查看服务器端tomcat 的java 进程存活,查看tomcat 的catalina.log ,没有发现异常,也没有error 日志.查看localhost_access.log 也没有最新的访问日志,该台tomcat 已不能提供服务。

根据前面的假死表象,最先想到的是网络是否出现了问题,于是开始从请求的数据流程开始分析。由于业务的架构采用的是nginx + tomcat 的集群配置,一个请求上来的流向可以用下图来简单的描述。

从上图可以看出,如果是网络的原因,可以从两个点进行分析。

1、从前端到nginx的网络情况;

分析nginx上的access.log ,在其中一台上可以查出当时该条请求的访问日志,也就是说可以排除这段网络的问题。

2、从nginx 到tomcat 的网络情况。

分析tomcat 的访问日志localhost_acess.log 上无法查出该条请求的访问日志。可以怀疑是否网络有问题。就该情况,从该台nginx ping 了一下tomcat server ,均为正常,没有发现问题。既然网络貌似没有问题,开始怀疑是tomcat本身的问题,在tomcat本机直接curl 调用该条请求,发现仍然没有响应。到此基本可以断定网络没有问题,tomcat 本身出现了假死的情况。

基于tomcat 假死的情况,开始分析有可能的原因。造成tomcat假死有可能的情况大概有以下几种:

一、tomcat jvm 内存溢出

分析当时的gc.log  ,

7581861.927: [GC 7581861.927: [ParNew
Desired survivor size 76677120 bytes, new threshold 15 (max 15)
- age   1:    5239168 bytes,    5239168 total
: 749056K->10477K(898816K), 0.0088550 secs] 1418818K->680239K(8238848K), 0.0090350 secs]

没有发现有内存溢出的情况

直接grep catalina.sh 也没有结果,证明没有发生内存溢出的情况 ,,这种假死可能可以排除。

grep OutOfMemoryException catalina.sh

二、jvm GC 时间过长,导致应用暂停

7581088.402: [Full GC (System) 7581088.402: [CMS: 661091K->669762K(7340032K), 1.7206330 secs] 848607K->669762K(8238848K), [CMS Perm : 34999K->34976K(58372K)], 1.7209480 secs] [Times: user=1.72 sys=0.00, real=1.72 secs]

最近的一次full gc 显示,也不应该会暂停几分钟的情况,这种假死可能可以排除。

三、load 太高,已经超出服务的极限

当时top一下linux

top

load average: 0.02, 0.02, 0.00
Tasks: 272 total,   1 running, 271 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.2%sy,  0.0%ni, 99.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  32950500k total, 23173908k used,  9776592k free,  1381456k buffers
Swap: 33551744k total,      236k used, 33551508k free, 12320412k cached

load 并不是高,,这种假死可能可以排除。

四、应用本身程序的问题,造成死锁。

针对这种情况,做了一下jstack,有少量线程处于TIMED_WAITING。

"Ice.ThreadPool.Client-75" daemon prio=10 tid=0x000000005c5ed800 nid=0x4cde in Object.wait() [0x0000000047738000]
  java.lang.Thread.State: TIMED_WAITING (on object monitor)
       at java.lang.Object.wait(Native Method)
       - waiting on <0x00002aab14336a10> (a IceInternal.ThreadPool)
       at IceInternal.ThreadPool.followerWait(ThreadPool.java:554)
       - locked <0x00002aab14336a10> (a IceInternal.ThreadPool)
       at IceInternal.ThreadPool.run(ThreadPool.java:344)
       - locked <0x00002aab14336a10> (a IceInternal.ThreadPool)
       at IceInternal.ThreadPool.access$300(ThreadPool.java:12)
       at IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:643)
       at java.lang.Thread.run(Thread.java:619)

"ContainerBackgroundProcessor[StandardEngine[Catalina]]" daemon prio=10 tid=0x00002aacc4347800 nid=0x651 waiting on condition [0x00000000435f7000]
  java.lang.Thread.State: TIMED_WAITING (sleeping)
       at java.lang.Thread.sleep(Native Method)
       at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1378)
       at java.lang.Thread.run(Thread.java:619)

"version sniffer" daemon prio=10 tid=0x00002aacc4377000 nid=0x645 in Object.wait() [0x0000000040f3c000]
  java.lang.Thread.State: TIMED_WAITING (on object monitor)
       at java.lang.Object.wait(Native Method)
       - waiting on <0x00002aaaee20b7b8> (a java.lang.Boolean)
       at com.panguso.map.web.service.LocateServiceFactory$IpDataVersionSniffer.run(LocateServiceFactory.java:351)
       - locked <0x00002aaaee20b7b8> (a java.lang.Boolean)
       at java.lang.Thread.run(Thread.java:619)

"ReplicaSetStatus:Updater" daemon prio=10 tid=0x000000005d070800 nid=0x636 waiting on condition [0x0000000044001000]
  java.lang.Thread.State: TIMED_WAITING (sleeping)
       at java.lang.Thread.sleep(Native Method)
       at com.mongodb.ReplicaSetStatus$Updater.run(ReplicaSetStatus.java:428)

从jvm 堆栈信息可以看出,其中有可能出现线程锁死的情况为:IceInternal 和访问mongdb 的客户端 com.mongodb.ReplicaSetStatus$Updater类。针对这两种情况,看了一下源码,基本排除。

五、大量tcp 连接CLOSE_WAIT

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

TIME_WAIT 48

CLOSE_WAIT 2228

ESTABLISHED 86

常用的三个状态是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭。

CLOSE_WAIT 从上面的图可以看出来,如果一直保持在CLOSE_WAIT 状态,那么只有一种情况,就是在对方关闭连接之后,服务器程序自己没有进一步发出ack 信号。换句话说,就是在对方连接关闭之后,程序里没有检测到,或者程序压根就忘记了这个时候需要关闭连接,于是这个资源就一直被程序占着。个人觉得这种情况,通过服务器内核参数也没办法解决,服务器对于程序抢占的资源没有主动回收的权利,除非终止程序运行。

由于咱们自己使用的是HttpClient ,并且遇到了大量CLOSE_WAIT 的情况。所以怀疑这个点可能出了问题。

查看了咱们的httpClient 的写法需要改正:

HttpGet get = newHttpGet(url.toString());

InputStream ins = null;

try{

HttpResponse response = excuteHttp(httpClient, get);

// HttpResponse response = httpClient.execute(get);

if(response.getStatusLine().getStatusCode() != 200) {

thrownewMapabcPoiRequestException(

"Http response status is not OK");

}

这种写法意味着一旦出现非200 的连接,InputStream ins 根本就不会被赋值,这个连接将永远僵死在连接池里头.

解决方法:

if(response.getStatusLine().getStatusCode() != 200) {

get.abort();

thrownewMapabcPoiRequestException(

"Http response status is not OK");

}

应该改为显示调用HttpGet 的abort ,这样就会直接中止这次连接,我们在遇到异常的时候应该显示调用,因为无法保证异常是在InputStream in 赋值之后才抛出。但是这种情况也是发生在httpClient 后端的服务出现了没有响应的情况,

转载于:https://blog.51cto.com/liuer/1338758

tomcat装死原因汇总相关推荐

  1. Tomcat假死原因排查

    tomcat假死?为什么会假死呢,可能大多数人不会碰到这个问题,如果出现问题,重启服务器就好了,可是如果这个问题没有解决的话,那么就可能会存在相应的隐患,如果你的用户量多,那么必然你的请求量就高,这样 ...

  2. 电脑运行慢的原因汇总

    电脑运行慢的原因汇总 病因一:病毒作怪          由于计算机中感染了病毒这个可恨的家伙,使得计算机运行速度大幅度变慢.其作用机理有二:一是病毒***后,首先占领内存这个据点,然后便以此为根据地 ...

  3. java 进程假死原因_分析java进程假死状况

    1 引言 1.1 编写目的 为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照. 1.2编写背景 最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近 ...

  4. tomcat 假死现象(转)

    1.1 编写目的 为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照. 1.2编写背景 最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近又发现有台 ...

  5. tomcat挂死问题

    tomcat7版本: 1.修改server.xml的 <Connector connectionTimeout="20000" acceptCount="1500& ...

  6. 朋友圈装死,微博蹦迪,Python教你如何掌握女神情绪变化 | CSDN博文精选

    作者 | A字头 来源 | 数据札记倌 很多人都是在朋友圈装死,微博上蹦迪. 微信朋友圈已经不是一个可以随意发表心情的地方了,微博才是! 所以你不要傻傻盯着女神的朋友圈发呆啦! 本文教你如何用Pyth ...

  7. IDEA 启动tomcat 端口占用原因以及解决方法( 使用debug模式)

    IDEA 启动tomcat 端口占用原因以及解决方法( 使用debug模式) 参考文章: (1)IDEA 启动tomcat 端口占用原因以及解决方法( 使用debug模式) (2)https://ww ...

  8. 地图相关应用系统部署到现场报错原因汇总

    文章目录 开发环境 问题现象 原因汇总 开发环境 1. 地图服务器:ArcGIS Server 10.3 2. 地图客户端: ArcGIS Destop 10.3 3. 数据库: Oracle 11g ...

  9. java移动文件导致tomcat死掉_原 netty导致tomcat假死

    一.系统需求: 保证后台系统在大并发下正常处理每一个业务连接请求. 二.运作方式: Netty+tomcat.在tomcat的web.xml配置文件中配置一个Listener类用来在tomcat初始化 ...

最新文章

  1. NSOperationQueue
  2. java面试题2019 答案
  3. nginx的location配置root、alias用法和区别
  4. AB1601之iic驱动改造
  5. AptanaStudio3+PHP程序远程调试的方法和步骤
  6. 【翻译】Vue.js中的computed是如何工作的
  7. 3.3 Spark概述
  8. .net core 与ELK(4)后台运行els可视化工具和Kibana
  9. 修改QQ聊天窗口大小
  10. 计算机网络工程税收分类编码,工程款税收分类编码
  11. python转义字符与原字符
  12. ASP.NET MVC随想录——锋利的KATANA
  13. 基于HTML+CSS制作静态页面【剪纸文化15页】传统文化设计题材 dreamweaver制作静态html网页设计作业作品...
  14. PHP流量卡发货查单系统源码 流量卡物流发货运单号查询平台 一键安装版
  15. 浪漫--》“慢”+“浪”
  16. 诗词锦集(持续更新)
  17. 计算机寸出,电脑显示器长31cm宽23cm是多少寸?
  18. python 数值运算 m op n_测验1 Python基本语法元素 (第1周)
  19. 计算机主板上的fan,通用解决方案:计算机主板上的CPU_FAN,SYS_FAN,CHA_FAN,CPU_OPT接口知识...
  20. openwrt桥接上海电信宽带+高清4KIptv适用

热门文章

  1. 西南科技计算机在线自测,西南科技大学2017春季第一学期高等数学1在线自测答案...
  2. gitlab+svn自动增量发包
  3. 【HDOJ 5384】Danganronpa
  4. 使用RxJava帮助低功耗蓝牙(BLE)进行通信
  5. 剖析context:component-scan/、mvc:annotation-dri...
  6. 【cocos2d-x从c++到js】06:Google的继承写法解析
  7. 菜鸟入门Java语言学习六大要点
  8. Re_Write序列号
  9. flink写入hive的时区问题
  10. aop面向切面编程到底是干嘛的?