`

一次线上问题排查的坎坷经历

阅读更多

一次线上问题排查的坎坷经历

2015-08-30 林之风 Netty之家

一次线上问题排查的坎坷经历

 


问题描述:某生产环境在业务高峰期,偶现服务调用时延突刺问题,时延突然增大的服务没有固定规律,比例虽然很低,但是对客户的体验影响很大,需要尽快定位出问题原因并解决。

 


问题分析

 


 

服务调用时延增大,但并不是异常,因此运行日志并不会打印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也不准确,大家知道为什么吗?这个留作问题,供大家自己思考。

分享到:
评论

相关推荐

    漫谈线上问题排查.pdf

    大厂高手骆俊武出品的《漫谈线上问题排查》电子书

    JAVA线上问题排查和工具.pdf

    JAVA线上问题排查和工具 内容详细 结合实际工作 贴合实际

    线上问题排查

    ### 线上问题排查知识点 #### 一、查找 JDK 安装路径及验证方法 在 Linux 系统中,为了高效地排查线上 Java 应用的问题,首先需要明确 Java Development Kit (JDK) 的安装位置。这可以通过以下两种方式实现: 1. ...

    Java线上故障排查方案(2).pdf

    在处理Java线上故障时,工程师需要具备一系列的技能来快速定位并解决生产环境中的问题。本文档围绕Java线上故障排查提供了详尽的方案和知识点,覆盖了从问题定位到解决方案的多个方面。 首先,了解Java线上常见问题...

    线上问题排查-Linux 性能观测篇.pdf

    性能问题可能与协议栈配置不当、网络拥塞控制、路由问题等有关。 7. 性能调优: - 性能调优是一个持续的过程,需要根据观测到的系统表现来调整系统参数,包括但不限于CPU调度器参数、内存分配策略、I/O调度策略等。...

    Java线上故障排查方案.pdf

    Java线上故障排查是一项复杂而关键的任务,需要系统地收集和分析信息,以便快速定位并解决问题。文档中提到的各个知识点将帮助我们深入了解如何在Java环境中有效进行线上故障排查。 首先,文档提到了几种常见的排查...

    线上问题排查工具和手段

    线上问题排查是开发和运维工作中的一个重要组成部分,其目的是为了快速定位和解决问题,保证系统的稳定运行。在排查问题的过程中,使用合适的方法和工具至关重要,它们可以帮助我们更高效地进行问题分析和定位。下面...

    JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!.docx

    JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙! 本文档将详细介绍 Java 线上...本文档提供了一个完整的 Java 线上故障排查套路,涵盖了 CPU、磁盘、内存、网络和 GC 等多个方面的故障排查方法。

    线上问题排查思路.pdf

    Arthas是一款功能强大且灵活的在线问题排查工具,它可以帮助开发者快速定位和解决在线问题。本文将详细介绍Arthas在线问题排查思路,包括常见的排查场景、改进策略和排查思路。 常见的排查场景 在实际开发中,我们...

    Java线上故障排查方案.rar

    Java线上故障排查是每个Java开发者或运维人员必备的技能之一,尤其在生产环境中,快速定位并解决问题至关重要。本文将深入探讨Java线上故障排查方案,帮助你掌握一系列实用的方法和技术。 一、日志分析 1. 日志级别...

    线上问题调查常用命令

    在IT运维与开发工作中,线上问题的排查与解决是维护系统稳定性和用户体验的关键环节。本篇文章将基于提供的文件信息,深入解析线上问题调查中常用的Linux性能检测工具及JVM性能相关命令,并提供详细的解释与应用场景...

    【案例】记一次线上内存报警排查过程1

    在这个案例中,主要涉及的是线上服务的内存管理与问题排查,特别是针对Java应用程序的内存报警。以下是相关的知识点: 1. **内存报警**:当服务器的内存使用率超过一定阈值时,系统会发送报警,提示可能存在内存...

    线上故障排查全套路,总有一款适合你1

    本文主要讨论了四种常见的线上故障类型:CPU问题、频繁GC、上下文切换过多以及磁盘问题,并提供了相应的排查工具和方法。 首先,CPU异常是较易察觉的故障类型。当CPU使用率过高时,通常需要通过`jstack`分析线程...

    资料-线上问题排查利器-Alibaba Arthas.zip

    博客地址: https://blog.csdn.net/lydms/article/details/125238249 Xmind整理: https://download.csdn.net/download/weixin_44624117/8561266 相关资料: ...

    java开发 线上问题排查命令详解

    Java开发线上问题排查命令详解 Java开发中的线上问题排查命令详解是指在Java开发中使用的一些常用命令来排查和解决线上问题。这些命令主要来自JDK的lib/tools.jar类库,安装JVM时会被安装到机器的bin目录下。 以下...

    线上问题快速处理 PPT 培训精讲

    线上问题处理是电子商务领域不可或缺的一环,对于确保网站稳定运行和提升用户体验至关重要。本培训旨在深入讲解如何高效地分析、定位并解决线上问题,以及如何预防类似问题的再次发生。 1. **分析**: 在线上问题...

    线上adplatform集群机器cpu飙升问题排查总结.docx

    本文总结了线上adplatform集群机器CPU飙升问题的排查经验,并对JVM性能优化与问题排查进行了详细的分析和总结。 JVM性能优化 在排查线上adplatform集群机器CPU飙升问题时,我们首先需要了解JVM的性能优化策略。JVM...

    [OOM] 记一次线上OOM的问题 - ado19861

    本文将详细探讨一个线上出现的OOM问题,以及如何通过日志分析、使用Eclipse的Memory Analyzer Tool(MAT)以及最佳实践来定位和解决问题。 首先,我们看到的现象是Tomcat服务器在运行过程中出现了OOM错误,这通常...

Global site tag (gtag.js) - Google Analytics