一次线上问题排查的坎坷经历
一次线上问题排查的坎坷经历
问题描述:某生产环境在业务高峰期,偶现服务调用时延突刺问题,时延突然增大的服务没有固定规律,比例虽然很低,但是对客户的体验影响很大,需要尽快定位出问题原因并解决。
问题分析
服务调用时延增大,但并不是异常,因此运行日志并不会打印ERROR日志,单靠传统的日志无法进行有效问题定位。利用分布式消息跟踪系统,进行分布式环境的故障定界。
通过对服务调用时延进行排序和过滤,找出时延增大的服务调用链详细信息,发现业务服务端处理很快,但是消费者统计数据却显示服务端处理非常慢,调用链两端看到的数据不一致,怎么回事?
对调用链的埋点日志进行分析发现,服务端打印的时延是业务服务接口调用的时延,并没有包含:
-
通信端读取数据报、消息解码和内部消息投递、队列排队的时间;
-
通信端编码业务消息、在通信线程队列排队时间、消息发送到Socket的时间。
调用链的工作原理图
调用链埋点日志改进
优化调用链埋点日志,措施如下:
-
包含客户端和服务端消息编码和解码的耗时
-
包含请求和应答消息在业务线程池队列中的排队时间;
-
包含请求和应答消息在通信线程发送队列(数组)中的排队时间
同时,为了方便问题定位,我们需要打印输出Netty的性能统计日志,主要包括:
-
每条链路接收的总字节数、周期T接收的字节数、消息接收CAPs;
-
每条链路发送的总字节数、周期T发送的字节数、消息发送CAPs;
优化之后,上线运行一天之后,我们通过分析比对Netty性能统计日志、调用链日志,发现双方的数据并不一致,Netty性能统计日志统计到的数据与前端门户看到的也不一致,因为怀疑是新增的性能统计功能存在BUG,继续问题定位。
性能统计功能问题定位
首先对消息发送功能进行CodeReview,发现代码调用完writeAndFlush之后直接对发送的请求消息字节数进行计数,代码如下:
消息发送性能统计问题总结
通过对writeAndFlush方法展开分析,我们发现性能统计代码存在如下几个问题:
-
业务ChannelHandler的执行时间
-
ByteBuf在ChannelOutboundBuffer 数组中排队时间
-
NioEventLoop线程调度时间,它不仅仅只处理消息发送,还负责数据报读取、定时任务执行以及业务定制的其它I/O任务
-
JDK NIO类库将ByteBuffer写入到网络的时间,包括单条消息的多次写半包
由于性能统计遗漏了上述4个步骤的执行时间,因此统计出来的性能比实际值更高,这会干扰我们的问题定位。
其它常见性能统计误区汇总
1、调用write 方法之后就开始统计发送速率,示例代码如下:
2、消息编码时进行性能统计,示例代码如下:
编码之后,获取out可读的字节数,然后做累加。编码完成,ByteBuf并没有被加入到发送队列(数组)中,因此在此时做性能统计仍然是不准的。
正确的做法
1、调用writeAndFlush方法之后获取ChannelFuture;
2、新增消息发送ChannelFutureListener,监听消息发送结果,如果消息写入网络Socket成功,则Netty会回调ChannelFutureListener的operationComplete方法;
3、在消息发送ChannelFutureListener的operationComplete方法中进行性能统计。
示例代码如下:
问题定位出来之后,按照正确的做法对Netty性能统计代码进行了修正,上线之后,结合调用链日志,很快定位出了业务高峰期偶现的部分服务时延毛刺较大问题,优化业务线程池参数配置之后问题得到解决。
留给读者的思考
除了消息发送性能统计之外,Netty数据报的读取、消息接收CAPs性能统计也非常容易出错,我们第一版性能统计代码消息接收CAPs也不准确,大家知道为什么吗?这个留作问题,供大家自己思考。
相关推荐
大厂高手骆俊武出品的《漫谈线上问题排查》电子书
JAVA线上问题排查和工具 内容详细 结合实际工作 贴合实际
### 线上问题排查知识点 #### 一、查找 JDK 安装路径及验证方法 在 Linux 系统中,为了高效地排查线上 Java 应用的问题,首先需要明确 Java Development Kit (JDK) 的安装位置。这可以通过以下两种方式实现: 1. ...
在处理Java线上故障时,工程师需要具备一系列的技能来快速定位并解决生产环境中的问题。本文档围绕Java线上故障排查提供了详尽的方案和知识点,覆盖了从问题定位到解决方案的多个方面。 首先,了解Java线上常见问题...
性能问题可能与协议栈配置不当、网络拥塞控制、路由问题等有关。 7. 性能调优: - 性能调优是一个持续的过程,需要根据观测到的系统表现来调整系统参数,包括但不限于CPU调度器参数、内存分配策略、I/O调度策略等。...
Java线上故障排查是一项复杂而关键的任务,需要系统地收集和分析信息,以便快速定位并解决问题。文档中提到的各个知识点将帮助我们深入了解如何在Java环境中有效进行线上故障排查。 首先,文档提到了几种常见的排查...
线上问题排查是开发和运维工作中的一个重要组成部分,其目的是为了快速定位和解决问题,保证系统的稳定运行。在排查问题的过程中,使用合适的方法和工具至关重要,它们可以帮助我们更高效地进行问题分析和定位。下面...
JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙! 本文档将详细介绍 Java 线上...本文档提供了一个完整的 Java 线上故障排查套路,涵盖了 CPU、磁盘、内存、网络和 GC 等多个方面的故障排查方法。
Arthas是一款功能强大且灵活的在线问题排查工具,它可以帮助开发者快速定位和解决在线问题。本文将详细介绍Arthas在线问题排查思路,包括常见的排查场景、改进策略和排查思路。 常见的排查场景 在实际开发中,我们...
Java线上故障排查是每个Java开发者或运维人员必备的技能之一,尤其在生产环境中,快速定位并解决问题至关重要。本文将深入探讨Java线上故障排查方案,帮助你掌握一系列实用的方法和技术。 一、日志分析 1. 日志级别...
在IT运维与开发工作中,线上问题的排查与解决是维护系统稳定性和用户体验的关键环节。本篇文章将基于提供的文件信息,深入解析线上问题调查中常用的Linux性能检测工具及JVM性能相关命令,并提供详细的解释与应用场景...
在这个案例中,主要涉及的是线上服务的内存管理与问题排查,特别是针对Java应用程序的内存报警。以下是相关的知识点: 1. **内存报警**:当服务器的内存使用率超过一定阈值时,系统会发送报警,提示可能存在内存...
本文主要讨论了四种常见的线上故障类型:CPU问题、频繁GC、上下文切换过多以及磁盘问题,并提供了相应的排查工具和方法。 首先,CPU异常是较易察觉的故障类型。当CPU使用率过高时,通常需要通过`jstack`分析线程...
博客地址: https://blog.csdn.net/lydms/article/details/125238249 Xmind整理: https://download.csdn.net/download/weixin_44624117/8561266 相关资料: ...
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...
Java开发线上问题排查命令详解 Java开发中的线上问题排查命令详解是指在Java开发中使用的一些常用命令来排查和解决线上问题。这些命令主要来自JDK的lib/tools.jar类库,安装JVM时会被安装到机器的bin目录下。 以下...
线上问题处理是电子商务领域不可或缺的一环,对于确保网站稳定运行和提升用户体验至关重要。本培训旨在深入讲解如何高效地分析、定位并解决线上问题,以及如何预防类似问题的再次发生。 1. **分析**: 在线上问题...
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...