线上高延迟请求排查

标签: 问题排查 Java | 发表时间:2024-10-28 19:21 | 作者:
出处:http://crossoverjie.top/

前几天排查了一个业务接口执行高延迟的问题,也挺有参考意义的,分享一下排查过程。

现象是业务反馈有一个接口业务逻辑其实很简单,但是调用一次耗时,如下图所示:

排查应用运行状态

首先第一步需要查看当时的应用运行状态,包含当时的日志、JVM 的各种监控等。

因为我们接入了 OpenTelemetry,所以 trace 和日志是可以关联起来的。

点击链路系统旁边的日志按钮可以直接跳转。

可以通过 trace_id 查询到相关日志:

通过日志可以看出耗时大约在 4s 多一点,然后结合代码发现这两段日志分别是在进入一个核心业务方法之前和方法内打印的。

而第一行日志是在一个自定义限流器中打印的,这个限流器是使用 GuavaRateLimiter实现的。

我的第一反应是不是这个限流器当时限流了,从而导致阻塞了;但查看了当时的 QPS 发现完全低于限流器的配置,所以基本可以排除它的嫌疑了。

JVM 监控

之后我们查询当时的 JVM 监控发现当时的 GC 频繁,而堆内存也正好发生了一次回收,初步判断是 GC 导致的本次问题。

但为啥会导致频繁的 GC 呢,还需要继续排查。

内存排查

我们在应用诊断中集成了 Pyroscope的持续剖析,可以实时查看内存的占用情况。

image.png

通过内存分析发现有大量的 JSON 序列化占用了大量的内存,同时还发现 Pod 已经被重启好几次了:
image.png

image.png

查看原因发现是 Pod OOM 导致的。

因此非常有可能是 GC 导致的,恰好那段时间发生了 GC 内存也有明显变化。

最后再通过 arthas 确认了 GC 非常频繁,可以确认目前的资源是是非常紧张的,咨询业务之后得知该应用本身占用的资源就比较大,没有太多优化空间,所以最终决定还是加配置。

image.png
还是提高硬件效率最高,目前运行半个月之后 Pod 内存表现稳定,没有出现一次 OOM 的异常。

总结

虽然最后的处理的方式是简单粗暴的,但其中的过程还是有意义的,遇到不同的情况也有不同的处理方式。

比如在排查过程中发现内存消耗异常,通过内存分析发现代码可以优化,那就优化代码逻辑。

如果是堆内存占用不大,但是 Pod 还是 OOM 导致重启,那就要看看 JVM 的内存分配是否合理,应该多预留一些内存给堆外使用。

但这个过程需要有 完善的可观测系统的支撑,比如日志、监控等,如果没有这些数据,再回头排查问题就会比较困难。

总之这个排查过程才是最主要的,大家还有什么排查问题的小 tips 也欢迎在评论区分享。

相关 [线上 延迟] 推荐:

线上高延迟请求排查

- - crossoverJie's Blog
前几天排查了一个业务接口执行高延迟的问题,也挺有参考意义的,分享一下排查过程. 现象是业务反馈有一个接口业务逻辑其实很简单,但是调用一次耗时,如下图所示:. 首先第一步需要查看当时的应用运行状态,包含当时的日志、JVM 的各种监控等. 因为我们接入了 OpenTelemetry,所以 trace 和日志是可以关联起来的.

hibernate的延迟加载

- - ITeye博客
    代码的逻辑是:查询出id为1的major, 并输出其名字. 很明显, 代码的逻辑是对的.   可一运行就会报错:. 翻译过来就是:  延迟加载异常:不能初始化代理 --- session不存在. 出现这个报错信息的原因就在于hibernate的延迟加载机制.     所谓的延迟加载就是程序在使用load, iterator方法执行查询及关联查询时, 并不会马上发送并执行sql语句, 而是在调用(被查询)对象属性的getter方法时才去执行查询.

Hibernate延迟加载机制

- - 企业架构 - ITeye博客
转自:http://blog.163.com/xi_zh_qi/blog/static/8501594200812695053939/.    延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作. 在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载.

SSL延迟有多大?

- - 阮一峰的网络日志
据说,Netscape公司当年设计 SSL协议的时候,有人提过,将互联网所有链接都变成HTTPs开头的加密链接. 这个建议没有得到采纳,原因之一是HTTPs链接比不加密的HTTP链接慢很多. (另一个原因好像是,HTTPs链接默认不能缓存. 自从我知道这个掌故以后,脑袋中就有一个观念:HTTPs链接很慢.

Mybatis查询延迟加载

- - Elim的个人空间
Mybatis 查询延迟加载. 1.1        启用延迟加载. 1.2        分析.        Mybatis的延迟加载是针对嵌套查询而言的,是指在进行查询的时候先只查询最外层的SQL,对于内层SQL将在需要使用的时候才查询出来. Mybatis的延迟加载默认是关闭的,即默认是一次就将所有的嵌套SQL一并查了将对象所有的信息都查询出来.

马云道歉 提价新规延迟

- Adam - cnBeta.COM
手心写着四五个“忍”字,急飞回国的阿里巴巴集团董事局主席马云昨天再度为淘宝进行了一场危机公关. 认错、道歉、自辩、诉苦,马云在“原则决不退让”之余终究出了缓招,其中,阿里巴巴将投入18亿元扶持淘宝商城卖家,保证金由阿里集团和卖家各出一半,同时对老商家延后调整年费.

Redis响应延迟问题排查

- - searchdatabase
  本文将有助于你找出Redis 响应延迟的问题所在.   文中出现的延迟(latency)均指从客户端发出一条命令到客户端接受到该命令的反馈所用的最长响应时间. Reids通常处理(命令的)时间非常的慢,大概在次微妙范围内,但也有更长的情况出现.   如果你正在经历响应延迟问题,你或许能够根据应用程序的具体情况算出它的延迟响应时间,或者你的延迟问题非常明显,宏观看来,一目了然.

relay fetch 解决mysql replication 主从延迟

- - CSDN博客推荐文章
      mysql replication 中主从延迟是一个比较常见的问题,请看前期一篇博文: 怎样解决MySQL数据库主从复制延迟的问题. 根据目前有些公司使用的方案,最近测试了两个,其中之一是阿里的relay fetch ,业绩说法数据预热,当然也有其他开源类似开源工具,目前诸如 mk-slave-prefetch及 replication-prefetch等,感兴趣可以去看看.

背景图延迟加载(lazyload)技术

- - Web骇客
图片延迟加载技术目前已经被各种网站广泛的使用,但最近的一篇《 PS美女试验的惊人结果 》文章中使用的却是背景图延迟加载技术. 为什么要使用背景图延迟加载技术. 之所以使用图片延迟加载技术,是为了避免浪费带宽. 有些页面上嵌入了很多图片(上面所说的《 PS美女试验的惊人结果 》里就嵌入了30多张高清美女图),但电脑的屏幕一次只能显示一张或顶多2张.

延迟消息队列设计

- -
由于Kafka不支持延迟消息,而目前公司技术栈中消息中间件使用的是Kafka,业务方希望使用RocketMQ满足延迟消息场景,但如果仅仅只是需要延迟消息功能而引入多一套消息中间件,这会增加运维与维护成本. 在此背景下,我们希望通过扩展Kafka客户端提供延迟消息的支持. 本篇将介绍四种延迟消息实现方案的原理,以及分析其优缺点.