【实战篇】用SkyWalking排查线上[xxl-job xxl-rpc remoting error]问题

一、组件简介和问题描述

SkyWalking 简介

Apache SkyWalking 是一个开源的 APM(应用性能管理)工具,专注于微服务、云原生和容器化环境。它提供了分布式追踪、性能监控和依赖分析等功能,帮助开发者快速定位和解决性能瓶颈和故障。

xxl-job 简介

xxl-job 是一个轻量级的分布式任务调度框架,支持定时任务的管理与执行。它提供了简单易用的界面和丰富的功能,适合于各种业务场景。

遇到的问题

在使用 xxl-job 的过程中,突然有一天开始遇到了以下错误:

  • 错误码:500
  • 错误信息msg:xxl-rpc remoting error(Read timed out)

并且出现了大量的调度结果失败,但是执行结果成功的情况

这个错误通常表示在与 xxl-job 的 RPC 通信过程中发生了超时,可能由以下原因引起:

  1. 网络问题:服务间的网络连接不稳定,导致请求超时。(排查了不是这个问题)
  2. 服务没收到任务下发(如果这样的话它是不会执行的)
  3. 服务收到下发但是没有及时回复给xxl-job服务(怀疑)

二、开始使用SkyWalking 排查问题

JVM指标查看

发现发生了很多次年轻代、老年代GC,每分钟花费最多快达到了1秒

第一次发生是在10-12 21:35

此时发生了老年、年轻代GC

21:35分的时候发生一次

此时也是发生了老年、年轻代GC

三、猜测并调整

是不是每次发生调度失败的时候都会有GC 存在呢,我们试着修改一下JVM启动参数

bash 复制代码
-Xmn3G
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=6
-XX:InitiatingHeapOccupancyPercent=40
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200

1. 年轻代和老年代的设置

  • -Xmn3G:设置年轻代的大小为 3 GB。年轻代的大小会影响到 GC 的频率。适当增大年轻代的大小可以减少年轻代 GC 的次数,但同时也要注意不要过大,以免影响老年代的内存。

2. Survivor Ratio

  • -XX:SurvivorRatio=8:这个参数定义了 Eden 区和 Survivor 区的比例。在你的设置中,Eden 区占 8 份,Survivor 区占 1 份。适当调整这个比例,可以优化对象在年轻代中的存活时间,从而减少 GC 次数。可以考虑增加 Survivor 区的比例,以便更多的存活对象能够进入 Survivor 区,减少晋升到老年代的频率。

3. 最大晋升阈值

  • -XX:MaxTenuringThreshold=6:这个参数定义了对象在年轻代中存活的最大 GC 次数,超过这个次数的对象将被晋升到老年代。如果希望减少老年代的 GC 次数,可以考虑增加这个值,允许对象在年轻代中存活更长时间,从而减少晋升到老年代的频率。

4. 堆占用率

  • -XX:InitiatingHeapOccupancyPercent=40:这个参数定义了老年代开始 GC 的堆占用率。适当提高这个值,可以延迟老年代的 GC,减少其发生频率。

5. G1 垃圾回收器

  • -XX:+UseG1GC-XX:MaxGCPauseMillis=200:G1 垃圾回收器旨在减少 GC 暂停时间,适当调整这些参数可以优化 GC 性能。通过设置合理的暂停目标,可以在一定程度上减少 GC 的次数。

6. 直接内存大小

  • -XX:MaxDirectMemorySize=512m:虽然这个参数主要控制直接内存的使用,但合理配置可以避免因直接内存不足而导致的额外 GC。

四、调整后重启服务

重启服务后发现老年代已经很久没有了GC触发,年轻代的GC也没有了那么频繁

CPU利用率也不再那么高了

五、回到问题

发现这个错误已经不报了,并且全部是调度、执行都成功

  • 错误码:500
  • 错误信息msg:xxl-rpc remoting error(Read timed out)

六、GC的解释

年轻代 GC

  • 类型:通常使用的是 Minor GC。
  • 影响:年轻代 GC 通常会导致短暂的 STW,暂停所有应用程序线程。由于年轻代 GC 的目的是清理短生命周期的对象,因此它的执行时间通常较短,通常在几毫秒到几秒之间。

老年代 GC

  • 类型:通常使用的是 Major GC 或 Full GC。
  • 影响:老年代 GC 通常会导致更长时间的 STW,因为它需要检查整个堆的内容。老年代的 GC 过程可能会更复杂,导致暂停时间更长,通常从几秒到几十秒不等。

G1垃圾回收器的特点

  1. 并行性

    • G1 GC 在进行垃圾回收时会使用多个线程来并行处理,这样可以更有效地利用多核 CPU,减少停顿时间。
  2. 增量式回收

    • G1 将堆分为多个区域(Region),在进行垃圾回收时,它会增量地回收这些区域,而不是一次性回收整个堆。这种方式可以降低 GC 的停顿时间。
相关推荐
Linux-18742 天前
分布式链路追踪系统之docker-compose安装skywalking
云原生·docker-compose·skywalking·分布式链路追踪系统·应用程序性能监控
流烟默3 天前
SpringBoot应用链路追踪 traceId 技术方案
spring boot·skywalking·traceid
Linux-18743 天前
分布式链路追踪系统之二进制安装skywalking
elasticsearch·云原生·skywalking·分布式链路追踪系统·应用程序性能监控
令狐前生7 天前
SpringBoot3项目集成Skywalking示例
skywalking
乒乓狂魔8 天前
SkyWalking 也能 AI 智能化了
人工智能·skywalking
摇滚侠16 天前
Skywalking 应用性能监控和可观测性分析平台 简介
skywalking
Databuff16 天前
skywalking 快速使用入门
skywalking
摇滚侠18 天前
Apache Skywalking 实战 阅读笔记 第三章
笔记·apache·skywalking
摇滚侠19 天前
Apache Skywalking 实战 阅读笔记 第二章
笔记·apache·skywalking
Databuff19 天前
国产开源APM databuff 成为 CNCF 顶级项目opentelemetry 官宣Vendor
运维·开源·skywalking·apm·可观测性·opentelemetry