最艰难的事件就是意识本人!

集体网站 ,欢送拜访!

前言:

最近,测试部门的共事找到我,说他们测试时,没一会就发现服务接口申请始终无响应,Tomcat跟死掉了一样,也没有返回任何的谬误响应,说让我连忙排查下;听完后,我霎时激灵了下,妹的,最近老是出问题,领导都要给我开批评大会了。哈哈,开玩笑的,像我这么英俊的人,领导怎么会忍心批评我呢,哼,我把这个问题马上解决掉,都不会让领导晓得的!

简略说下程序部署状况:tomcat + oracle

排查过程:

排查时,能够应用命令进行排查,也能够应用可视化监控工具;例如应用应用JDK自带的 jvisualvm.exe 监控工具。

命令排查过程:

1、申请服务无响应,首先看看tomcat是否是真的挂掉了:

命令: ps -ef | grep tomcat

通过下面的命令查看tomcat运行着;执行后果如下:

留神: 如果此服务器中运行着多个tomcat,须要查看下图中画框的中央运行的tomcat地址是否正确;

通过命令查看发现,tomcat失常运行着,那么这就是处于假死状态,上面接着排查。

2、查看http申请是否达到了tomcat:

通过查看 tomcat 的 logs 目录下的 localhost_access_log 日志文件中 申请记录;

命令: tail -100f localhost_access_log

通过下面的命令查看实时的日志,执行完下面的查看日志的命令后,而后再次申请下程序,在日志中并没有发现申请记录,阐明tomcat处于一种假死状态,上面接着排查。

3、查看tomcat的JVM的GC状况:

查看GC状况,是否因为频繁的GC,长时间的GC,导致程序呈现长时间的卡顿,最终导致申请来不及解决,进入队列中进行期待,调用方长时间得不到响应,造成tomcat假死状态;

命令:jstat -gc pid time count

例如: jstat -gc 71129 1000 5 监控 71129 这个过程JVM的GC状况,每隔1000ms 输入一次,共输入5次;

命令执行后果参数解析:

通过下面命令查看GC状况,发现垃圾回收也不频繁,并且进行GC的工夫也不长,应该不是GC的起因。

4、查看tomcat的JVM的堆状况:

查看堆内存的状况,是否存在堆内存溢出 导致tomcat假死,无奈为新申请调配堆内存资源;

命令 : jmap -heap pid

例子: jmap -heap 71129 71129是正在运行tomcat的过程号 ;

通过命令执行后果得悉,堆内存中可应用内存还很大,不会呈现内存溢出的问题,所以也不是堆内存过小导致的tomcat假死。

5、查看tomcat的 JVM线程状况:

①、应用 jstack 命令导出以后JVM的线程dump快照,而后看看dump中线程都在干什么?

命令:jstack pid >> jvmThreadDump.log

例子:jstack 71129 >> jvmThreadDump.log

生成 71129 过程的 JVM的线程快照,并将快照内容重定向到 jvmThreadDump.log 文件中;

留神:生成的 jvmThreadDump.log 在你以后执行命令的目录下。

②、接着应用命令 more 查看 jvmThreadDump.log 内容;

命令 : more jvmThreadDump.log

如果的dump文件太大的话,须要应用more 命令一点点看;执行完more 命令的话,再按 enter 回车键 一点点展现文件内容;

③、通过查看线程快照文件,发现很多线程的状态是 WAITING 期待状态;

并且应用命令查看线程状态为 WAITING 的线程占总线程的比例:

留神:tomcatDump.log 为生成的线程快照文件名称,记得改为本人设置的名称 ;

count=`cat tomcatDump.log | grep java.lang.Thread.State | wc -l`; wait=`cat tomcatDump.log | grep WAITING | wc -l`; a=`echo | awk "{print $wait/$count*100}"`; echo "$a%"

执行命令,失去后果 : 91.9786% ,发现九成多的线程处于期待状态;

至此,找到了tomcat假死的起因,然而还需进一步确定 什么起因导致的大量线程始终期待?

通过查看调用的服务接口代码得悉,此接口业务逻辑中本人没设置任何的锁,所以应该不是本人写的代码的问题,然而此接口中波及到了很多 JDBC数据库操作,那是不是数据库连接池中的连贯不够用了呢?因为数据库连贯属于竞争资源,如果连接池中的连贯曾经耗尽了,那么接下来的进行 JDBC的线程就须要进行wait 期待连贯。

6、查看与数据库建设的TCP连贯状况:

在下面发现,大量线程处于期待状态,而通过剖析得悉,可能是因为数据库连接池中的连贯耗尽导致的,所以能够通过命令查看下,部署服务代码的服务器与数据库所在服务器建设的TCP连接数是否曾经达到了配置的数据库连接池的最大连接数;

命令:netstat -pan | grep 1521 | wc -l

因为本文中应用的数据库是Oracle,所以 grep 搜寻匹配的端口号是 1521;

如果是mysql数据库则将端口号改为3306 即可, netstat -pan | grep 3306 | wc -l ;

如果设置了自定义的数据库端口号,则改为自定义的端口号即可;

通过命令查问到 曾经应用的数据库的连接数为 6 个,那接着看下设置的数据库连接池最大连接数;

数据源配置如下:

type="javax.sql.DataSource"

factory="com.alibaba.druid.pool.DruidDataSourceFactory"

url="jdbc:oracle:thin:@192.168.3.125:1521:ora11g"

driverClassName="oracle.jdbc.driver.OracleDriver"

username="root"

password="root"

auth="Container"

initialSize="2"

maxActive="6"

minIdle="3"

maxWait="30000"

timeBetweenEvictionRunsMillis="30000"

minEvictableIdleTimeMillis="600000"

maxEvictableIdleTimeMillis="900000"

poolPreparedStatements="true"

maxOpenPreparedStatements="20"

validationQuery="select 1 from dual"

testOnBorrow="false"

testOnReturn="false"

testWhileIdle="true"

filters="wall,stat,log4j2"

/>

通过查看数据源发现,连接池配置的最大连接数是 maxActive=”6″ ;发现目前程序中应用的连接数已达到最大值,那么前面再进行 JDBC 操作的线程将进入 期待状态 ,期待获取连贯;

至此,tomcat假死的排查过程就完结了,并且起因也找到了,就是数据库连接池中的连贯耗尽了;所以,在前面测试中,须要在数据源中将最大连接数设置的大一些,并且也再进一步查看下代码,看看是否存在数据库连贯应用完后没有进行敞开的问题。

除了数据库连接池连贯耗尽会导致tomcat假死外,还有一些其它的状况也会导致产生,例如: redis 连接池连贯耗尽,或者是redis连贯应用完不开释,最终导致redis连贯耗尽。

除了应用下面的命令进行问题排查外,也能够间接应用可视化监控工具进行排查,更加简便、直观。

可视化监控工具排查

应用 JDK 自带的 jvisualvm.exe 工具进行 JMX近程 可视化监控tomcat;

jvisualvm.exe 位于 $JAVA_HOME/bin 目录下;

1、应用JMX实现近程监控步骤:

上面应用 JMX实现近程监控的内容参考自:jvisualvm近程监控tomcat

①、在 Tomcat 的 bin 目录下的 startup.sh 文件中的 倒数第一行上 加上如下内容:

export CATALINA_OPTS="$CATALINA_OPTS

-Dcom.sun.management.jmxremote

-Djava.rmi.server.hostname=192.168.1.130

-Dcom.sun.management.jmxremote.port=7003

-Dcom.sun.management.jmxremote.ssl=false

-Dcom.sun.management.jmxremote.authenticate=false"

下面内容参数解析:

-Dcom.sun.management.jmxremote 启用JMX近程监控

-Djava.rmi.server.hostname=192.168.1.130 这是连贯你的tomcat所在的服务器地址

-Dcom.sun.management.jmxremote.port=7003 jmx连贯端口

-Dcom.sun.management.jmxremote.ssl=false 是否ssl加密

-Dcom.sun.management.jmxremote.authenticate=false 近程连贯须要明码认证

在 startup.sh 文件中增加上下面的内容后,须要将tomcat重启下才会失效;

②、将 jvisualvm.exe 关上,界面如下:

③、在近程上右击,增加主机,输出服务器的ip:就是在 startup.sh 文件中增加内容中的hostname

④、在近程主机上右击,增加 JMX连贯 ,手动在ip地址前面加上设置的jmx连贯端口7003,而后点击确定即可:

⑤、通过下面的步骤,就曾经实现了近程监控连贯了,而后本人双击就能进行监控界面了:

2、查看监督内容:

通过查看监督画面得悉,CPU、GC、堆Heap的状况都没有问题,那接着查看下线程的状况:

点击下面图片中的 线程Dump 按钮,生成线程的快照,快照文件内容局部如下:

通过查看快照文件内容发现,很多线程的状态的都是 WAITING 期待状态;

接下来的剖析排查过程就如下面的 命令排查过程 一样了。

总结:

下面的两种排查形式,自己比拟举荐还是应用第一种 命令排查 ,因为很多的状况是不会让你批改配置文件进行近程监控的,即使应用监控工具看起来更加直观、简便;所以,平时须要记一些罕用的排查命令,以备不时之需。

因为自己程度无限,如有问题,敬请提出;

❤不要遗记留下你学习的脚印 [点赞 + 珍藏 + 评论]嘿嘿ヾ

所有看文章不点赞都是“耍流氓”,嘿嘿ヾ(◍°∇°◍)ノ゙!开个玩笑,动一动你的小手,点赞就完事了,你每个人出一份力量(点赞 + 评论)就会让更多的学习者退出进来!非常感谢! ̄ω ̄=

tomcat 服务器无响应,关于tomcat:数据库连接池连接耗尽导致tomcat请求无响应呈现出假死状态...相关推荐

  1. mysql事务锁导致tomcat崩溃_数据库连接池连接耗尽,导致tomcat请求无响应,呈现出假死状态...

    最困难的事情就是认识自己! 个人网站 ,欢迎访问! 前言:最近,测试部门的同事找到我,说他们测试时,没一会就发现服务接口请求一直无响应,Tomcat跟死掉了一样,也没有返回任何的错误响应,说让我赶紧排 ...

  2. net core mysql 连接池_EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽

    EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽 发布时间:2019-02-18 22:05, 浏览次数:1152 , 标签: EF Core DbContextPool ...

  3. ef mysql 连接数_EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽

    原标题:EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽 DbContextPool 是 ASP.NET Core 2.1 引入的新特性,可以节省创建 DbContext ...

  4. EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽

    DbContextPool 是 ASP.NET Core 2.1 引入的新特性,可以节省创建 DbContext 实例的开销,但没有想到其中藏着一个小坑. 最近有一个 ASP.NET Core 项目持 ...

  5. 数据库连接池连接异常com.alibaba.druid.pool.GetConnectionTimeoutException

    数据库连接池连接异常com.alibaba.druid.pool.GetConnectionTimeoutException 参考文章: (1)数据库连接池连接异常com.alibaba.druid. ...

  6. Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索

    Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索 简介 在上文中探索了数据库连接池的获取,下面接着初步来探索下数据库连接的关闭,看看其中具体执行了那些操作 连接关闭 下面的具体的代 ...

  7. 启动Tomcat服务器报错:Several ports (8005, 8080, 8009) required by Tomcat v9.0 Server at localhost are alrea

    启动Tomcat服务器turret遇到的问题: Several ports (8005, 8080, 8009) required by Tomcat v9.0 Server at localhost ...

  8. 数据库连接池连接数量配置多大合理

    前段时间在一个老项目中经历过一个问题:一个 Dubbo 服务,启动的时候慢的要死,后来看日志查原因整个过程一直在初始化数据库连接.一看数据库连接参数,连接池大小:1024. 很多入行晚的同学没有经历过 ...

  9. 数据库连接池连接超时报错

    文章目录 一.问题原因: 二.解决办法 1.重启服务器 2.连接池配置 1)数据库连接池增加探活配置(`推荐这种方式`) 2)增大数据库默认的超时等待时间(wait_timeout) 3)JDBC配置 ...

  10. java使用数据库连接池连接MySQL/MariaDB--DBCP2

    如果每次操作数据库都需要重新连接数据库,那么会很浪费资源.因此建议使用数据库的连接池来满足多线程的数据库操作. Java中数据库连接池有多种实现方法,推荐使用DBCP,这是Apache 提供的数据库连 ...

最新文章

  1. 【知识图谱】人工智能技术最重要基础设施之一,知识图谱你该学习的东西
  2. Android仿网易新闻导航栏PagerSlidingTabStrip
  3. 老赖整治升级,不还钱直接扣微信钱包!
  4. 前端学习(2473):创建页面组件
  5. Spring Cloud服务网关 Zuul
  6. 你真的会用搜索引擎吗
  7. 苹果mac轻量级思维导图软件:Xmind
  8. matlab晶格图,科学网-MATLAB软件绘制一维双原子晶格的格波色散曲线-李金磊的博文...
  9. MFC 键盘鼠标钩子
  10. Scratch跑酷游戏
  11. win10你的设备遇到问题,需要重启的五种解决方法
  12. 《2021年IT行业项目管理调查报告》发布
  13. VB、C#等高级语言与三菱PLC(Q系列、L系列、FX系列)串口、以太网通讯的DLL及源代码
  14. Java环境搭建及JAVA-jdk环境变量配置
  15. 上品携手SAP领跑服装零售行业
  16. 马云号召快递公司提升员工待遇:快递员带回家的钱要让家人惊喜
  17. android rom指什么,【安卓基础知识】什么是ROM、RAM
  18. 汽车上的“黑匣子”,EDR成为中美智能汽车产业竞争的关键战场
  19. ThinkPHP缓存文件写入失败!:./Runtime/Cache/..
  20. 教你解决磁盘提示磁盘结构损坏且无法读取的办法

热门文章

  1. React简介--尚硅谷react全家桶笔记总结
  2. spring学期总结
  3. iOS 本地通知基本使用
  4. 用js屏蔽脚本加载的广告
  5. 分子量(Molar Mass, ACM/ICPC Seoul 2007, UVa1586)java
  6. ACM程序设计 -L (字符串倒输出)
  7. python实现爬虫_Python开发简单爬虫
  8. Codeforces - Ivan and Burgers
  9. 自然数学-自然常数e
  10. 第5章第16节:案例:制作一份漂亮的翻页动画 [PowerPoint精美幻灯片实战教程]