今天早上,收到一个报警,有个服务器的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. UE4中FString转UTF8及UTF8转FString

    FString转UTF8 FString szMsg = "test msg"; TCHAR* pSendData = szMsg.GetCharArray().GetData() ...

  2. RedHat7下PostGIS源码安装

    本文介绍在RedHat7环境下安装使用PostGIS的流程. 1. PostgreSQL 1.1 yum安装PostgreSQL 这个比较简单,直接使用yum安装即可. $ sudo yum inst ...

  3. master_pos_wait函数与MySQL主从切换

    背景 主从切换是高可用MySQL架构的必要步骤(即使用不发生,也要有备无患).一般设置为双M(M1.M2),假设当前状态为写M1,而M2只读,切换的大致流程如下: 1.  停止应用写M1,将M1设置为 ...

  4. app额外后台运行操作

    //在视图中运行操作中进行周期操作 - (void)applicationDidEnterBackground:(UIApplication *)application { [self beingBa ...

  5. Java集合系列[2]----LinkedList源码分析

    上篇我们分析了ArrayList的底层实现,知道了ArrayList底层是基于数组实现的,因此具有查找修改快而插入删除慢的特点.本篇介绍的LinkedList是List接口的另一种实现,它的底层是基于 ...

  6. UVALive 3882 - And Then There Was One【约瑟夫问题】

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  7. hihoCoder #1015 : KMP算法【KMP裸题,板子】

    #1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...

  8. android小说阅读源码、bilibili源码、MVP新闻源码等

    Android精选源码 一款基于 MVP+RxJava2+Retrofit2 的应用--熊猫眼 android 五子棋源码分享 android实现全国地图点击效果 android实现立体图案绘制的代码 ...

  9. [国嵌笔记][024][ARM汇编编程概述]

    汇编程序用途 1.在bootloader与内核初始化时,还没有建立C语言运行环境,需要用到汇编程序 2.在对访问效率要求很高的情况下,需要用到汇编程序 ARM汇编分类 1.ARM标准汇编:适合于Win ...

  10. JSP学习总结

    1. 为什么需要jsp?  Servlet对于逻辑处理是非常方便的,但是对于页面的展现是非常麻烦的.JSP的诞生是为了解决Servlet页面展现麻烦的问题的. 2. JSP的特点:     Jsp页面 ...