今天早上,收到一个报警,有个服务器的http往返时延飙升,同时曝出大量404,很是折腾了一番,特记录下思考和排查经过。

1.这是单纯的时延增大,还是有什么其他情况还未掌握?

因为不知道是只有时延变大而已,还是同时有别的情况,第一反应是先看日志有没有异常。

看了一下,一片风平浪静,既是好消息也是坏消息。好消息是核心业务还在,不然一定会打日志,坏消息是日志提供不了任何信息。当然这也说明了我们的日志肯定有不到位的地方。

2.换个思路,日志风平浪静,是否只是服务器启动了什么任务,占用了大量cpu/IO等?GC呢?

于是去看监控,服务器CPU利用率、磁盘利用率、内存利用率、Swap交换次数都很正常。

那么会不会是一次长时间的FGC导致请求大量堆积了呢?又去看gc,结果发现也很正常,这段时间连fgc都没有触发过,minorGC的时间也在合理范围内。此路不通

3.再换个思路,往返时延增大,又没有全部404,看起来像是服务器处理不过来了,那么既然服务器资源充足,为什么处理不过来了呢?是不是tcp的问题

于是去查tcp连接和端口,果然发现了一点端倪,服务器上有大量的close_wait。熟悉tcp的人应该知道,close_wait是tcp连接时,被动关闭的一方会产生的状态。所以往返时延增大就有了一个合理的解释:大量处于close_wait的未关闭socket无法被释放,导致tomcat的可用连接非常少,从而请求堆积,往返时延增大,甚至超时。

4.继续思考,为何有大量的close_wait?

通常情况下,可能是程序员没有关闭socket,我们的项目里不存在这种情况。那么,目前最大的可能是:请求阻塞在什么地方了,客户端已经超时发送fin,所以服务端就变成了close_wait,在等待请求执行完之后才能切换状态。TCP的状态切换是排错基本功,同学们一定要掌握啊!

5.被阻塞的请求阻塞在了什么地方?

这个其实比较好处理,因为通常情况下,阻塞发生在IO处。再顺一下业务逻辑,最大的嫌疑是数据库。查一下sql执行时间,发现一条简单的select 1 from dual,执行时间都非常长。那就好解释了,sql执行太慢,连接池连接耗尽,后续请求只能阻塞。打电话给运维,运维:啊?我刚刚做表迁移来着,忘了告诉你们......我:*%&&@*@@&&¥&……()*

6.小插曲,sql超时是会报异常的,为何日志里没有报警呢?

答案是,服务器的主业务压根不走数据库,丫只是因为可用连接太少了所以才时延上升。走数据库的那个链接应该是报了异常的,只是有位大仙把测试时的日志输出到console的设置覆盖了线上输出到文件的设置...

一次线上tomcat应用请求阻塞的排查经过的更多相关文章

  1. 填坑!线上Presto查询Hudi表异常排查

    1. 引入 线上用户反馈使用Presto查询Hudi表出现错误,而将Hudi表的文件单独创建parquet类型表时查询无任何问题,关键报错信息如下 40931f6e-3422-4ffd-a692-6c ...

  2. 解决线上Tomcat启动慢

    vim /application/jdk/jre/lib/security/java.security # securerandom.source=file:/dev/randomsecurerand ...

  3. gor实现线上HTTP流量复制压测引流

    一.使用背景 gor 是一款go语言实现的简单的http流量复制工具,它的主要目的是使你的生产环境HTTP真实流量在测试环境和预发布环境重现.只需要在 代理例如nginx入口服务器上执行一个进程,就可 ...

  4. 线上故障排查——drools规则引擎使用不当导致oom

    事件回溯 1.7月26日上午11:34,告警邮件提示:tomcat内存使用率连续多次超过90%: 2.开发人员介入排查问题,11:40定位到存在oom问题,申请运维拉取线上tomcat 内存快照dum ...

  5. Vue 2.x 3.x 配置项目开发环境跟线上环境

    先找到package.json  (这是nuxt版的vue 可能会跟一般vue不一样  当然总体上差不多的) "scripts": { "dev": " ...

  6. 你要偷偷学会排查线上CPU飙高的问题,然后惊艳所有人!

    GitHub 20k Star 的Java工程师成神之路,不来了解一下吗! GitHub 20k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 20k Star 的Java工 ...

  7. 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程

    简述C#中IO的应用   在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...

  8. 一个线上问题的思考:Eureka注册中心集群如何实现客户端请求负载及故障转移?

    前言 先抛一个问题给我聪明的读者,如果你们使用微服务SpringCloud-Netflix进行业务开发,那么线上注册中心肯定也是用了集群部署,问题来了: 你了解Eureka注册中心集群如何实现客户端请 ...

  9. 解Bug之路-记一次线上请求偶尔变慢的排查

    解Bug之路-记一次线上请求偶尔变慢的排查 前言 最近解决了个比较棘手的问题,由于排查过程挺有意思,于是就以此为素材写出了本篇文章. Bug现场 这是一个偶发的性能问题.在每天几百万比交易请求中,平均 ...

随机推荐

  1. Hibernate学习笔记(5)---Query接口

    Hibernate中具有三种检索方式(HQL,QBC,SQL) Query接口 一个查询接口,用于向数据库中查询对象.并控制执行查询的过程.Query接口内封装了一个HQL查询语句. 举个栗子 //查 ...

  2. 原生JavaScript如何解决父元素查找指定类名的子元素的问题

    问题:已知一个元素的类名是right并且这个元素的祖先元素的类名为parent,现在想通过原生JavaScript获得这个类名为right的元素. 我的思路:利用递归.先判断已知的祖先元素(题中的pa ...

  3. Linux下设置SSH端口

    SSH 为 Secure Shell的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是目前较可靠,专为远程登录会话 ...

  4. Javascript中遍历数组方法的性能对比

    Javascript中常见的遍历数组的方法 1.for循环 for(var i = 0; i < arr.length; i++) { // do something. } 2.for循环的改进 ...

  5. TypeScript体验

    TypeScript 在线玩 http://www.typescriptlang.org/play/index.html ts最终编译成js  网站最终还是要引用js.  ts面向对象的感念更加直观, ...

  6. 【转载】Linux下的IO监控与分析

    近期要在公司内部做个Linux IO方面的培训, 整理下手头的资料给大家分享下 各种IO监视工具在Linux IO 体系结构中的位置 源自 Linux Performance and Tuning G ...

  7. 【转载】Linux cgroup资源隔离各个击破之 - io隔离

    Linux Cgroup blkio子系统的用法.   blkio子系统支持的两种IO隔离策略 .1. (Completely Fair Queuing 完全公平队列)cfq io调度策略,支持按权重 ...

  8. [转载]阿里云MySQL优化主从同步,降低数据延迟

    1. 背景 为了提高系统的可用性和数据保护,MySQL通常采用master-slave的部署结构,简单高效,master和slave之间使用binlog来复制数据. binlog支持statement ...

  9. 从Unity中的Attribute到AOP(二)

    上一篇文章我们初步了解了一下Attributes的含义,并且使用系统自带的Attributes写了点代码.在进一步解剖我们的代码之前,我觉得有个概念可能需要巩固一下:什么是元数据? 我们知道C#代码会 ...

  10. my discipline life

    周一  ~   周五 7.30 ---  8.00 起床,洗漱等 8.00 ---  8.30 默写8-10个英语单词 8.35 ---  9.10 吃早餐,骑自行车去公司 12.20  ---  1 ...