记一次线上程序宕机问题分析【写 GC 日志导致进程挂起】
1. 背景
运维侧持续反馈了几次线上业务程序 A 出现宕机告警的信息,重启后一段时间后又出现宕机,这里针对最后一次告警进行深入排查和分析。
首先这一次故障出现在 2024-03-14 04:18:23,和以往的宕机故障略有不同,以往的现象是切换 GC 日志文件时卡住然后进程挂掉,这一次是写 GC 日志时进程卡住进入假死状态,但是这一次是过了两分钟后能够自动恢复;
部署方式:一台物理机虚拟化出来多台 VM,业务模块部署再 VM 上;
2. 问题排查过程
2.1 程序监控分析
在监控图中,程序问题发生前的各项指标没有明显的变化,当时处于凌晨业务低峰期,程序的压力也非常低,按照目前的各项指标来看,初步判断该问题和程序业务功能无关,如果问题根因是由程序业务功能导致,那么有可能是缺失了监控指标。

2.2 程序日志分析
在 grafana 上查看 loki 收集到的程序日志,发现该故障期间的两分钟没有任何输出;

通过日志进行聚合统计出来的流量图也显示在故障期间没有任何日志输出;

小结:确认故障期间程序处于挂起/假死状态,这个状态下所有业务功能都不工作,有可能导致这个问题的原因大概有:
- 出现了 Full GC、mixed GC 等让业务线程停顿的 GC 类型,且 GC 时间长达两分多钟;
- 出现了 swap 空间交换,swap 空间交换会让进程挂起;
- 其他操作系统、机器级别的异常。
2.3 GC 日志分析
通过查看 GC 日志,发现进程停顿了 156 秒,看上去是一次耗时非常长的 GC,且 GC 类型为 mixed GC, mixed GC 会对老年代进行回收,回收时会让业务线程停止工作;

通过对 GC 日志进行筛选,看到实际 GC 时间大于 100 毫秒的只有 4 次,最长的一次是 156 秒,其次是 760 毫秒,这两次 GC 时间比较高,存在一个共同点是 read > user + sys;

看到这里就让人很疑惑了,比较合理的应该是 real <= user + sys;
- user 表示在用户态执行的 GC 操作耗时,例如垃圾标记等动作,如果回收的数据比较多,可能这个值比较大,在多核 CPU + 多线程 GC 的情况下甚至大于 real;
- sys 表示在内核态执行的 GC 操作耗时,例如在操作系统内核中执行的代码耗时;
- real 表示实际让业务线程停止工作的耗时。
由于这里发现了 real > user + sys,看上去这部分耗时从 GC 日志中没法找到是哪个步骤的耗时,出现这种现象可能是 GC 日志没有打印齐全,或者有一部分耗时无法被 JVM 统计到,于是再看看 JVM 启动参数。
以下是模块 A 的启动 JVM 参数(已省略不必要的),可以看到使用的是 G1 垃圾收集器,-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime 这几个参数其实已经可以打印比较详细的 GC 日志了,也能够记录到各个步骤的耗时,所以这里判断这个问题可能是和操作系统甚至是机器硬件有关系;
-server -Xms500M -Xmx8192M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m -Xloggc:./logs/gc.%p.log
结合下图的 GC 过程,可以看到,线程停顿时间其实包括写 GC 日志的时间,再次断定和操作系统甚至是机器硬件有关系;

2.4 机器监控分析
通过监控可以看到,问题发生的时候,刚好机器的硬盘利用率达到了 100%,持续时间为 2 分钟左右,和告警恢复时间吻合,初步判断该故障和硬盘利用率有关。

通过监控程序的源码发现,该指标数据来源于 iostat -dxm 2 2 这个命令,如下图所示,这个命令可以查到硬盘的各项指标,例如读写速度、IO 请求占比等,而监控图 上看到的则是下图中最后的一列;

查看 iostat 的文档,%util 列的含义表示的是 IO 请求占比监控硬盘时表示的是硬盘 IO 请求占比,监控网络时表示网络 IO 请求占比,这个占比越高,说明读写越繁忙,不过查阅资料后发现在现在硬盘有并行读写功能后这个占比即使到了 100% 也无法说明 IO 饱和了,还需要结合其他指标来看;

这里结合硬盘读写这个指标来看,当时的读写速度都为 0,说明这台机器有很多 IO 请求,但是硬盘处于无法读写状态,结合 CPU 使用情况这项指标,初步判断是这个时候是往硬盘发送了多次的 IO 请求,所以 CPU 升高,但是硬盘处于无法读写状态,所有的 IO 请求都被挂起,最终 %util 也占到 100% 了。

3. 问题确认
通过和运维侧的沟通,确认到物理机有数据备份的操作,备份时需要对硬盘进行进行读写,最终可能引发了该问题;
4. 参考
https://www.linkedin.com/blog/engineering/archive/eliminating-large-jvm-gc-pauses-caused-by-background-io-traffic
https://blog.gceasy.io/2016/12/08/real-time-greater-than-user-and-sys-time
相关文章:
记一次线上程序宕机问题分析【写 GC 日志导致进程挂起】
1. 背景 运维侧持续反馈了几次线上业务程序 A 出现宕机告警的信息,重启后一段时间后又出现宕机,这里针对最后一次告警进行深入排查和分析。 首先这一次故障出现在 2024-03-14 04:18:23,和以往的宕机故障略有不同,以往的现象是切…...
position embedding
文章目录 1. 四种position embedding2. pytorch 源码[后续整理] 【因比较忙,后续整理】 1. 四种position embedding Position Embedding 1. Transformer 1.1 1d absolute 1.2 sin/cos constant 1.3 2. Vision Transformer 2.1 1d absolute 2.2 trainable 3. Swin T…...
【leetcode hot 100 739】每日温度
解法一:暴力解法 class Solution {public int[] dailyTemperatures(int[] temperatures) {int ntemperatures.length; // 指向要找下一个更高温度的地方int[] result new int[n];for(int left0;left<n;left){int rightleft1; // 指向正在找最高温度的地方wh…...
netplan是如何操控systemd-networkd的? 笔记250324
netplan是如何操控systemd-networkd的? netplan通过以下方式操控systemd-networkd: 工作原理:netplan读取位于/etc/netplan/目录下的YAML格式的配置文件,这些配置文件描述了网络接口的配置。netplan会将这些配置文件解析并转换为systemd-ne…...
Cookie、Session 与 Token:核心区别与应用场景解析
目录 引言 基础概念解析:三大身份验证技术详解 Cookie:浏览器中的"身份证" Session:服务器记忆的"对话" Token:加密的"通行证" 三种技术的深度对比分析 存储位置与数据流向 安全性全面对比…...
结合DrRacket学习《如何设计程序,第二版》
如何设计程序语言 DrRacket用于学习程序语言和设计程序语言,如何设计程序手册:How to Design Programs 如何设计程序,第二版:How to Design Programs, Second Edition 系统程序设计 设计师需遵循一系列严谨且系统的步骤&#…...
状态空间模型解析 (State-Space Model, SS)
一、文章摘要 状态空间模型(State-Space Model, SS)是一种广泛应用于控制系统、信号处理和系统建模的数学表示方式。MATLAB 提供的 ss 类用于描述线性时不变(LTI)系统的状态空间表示。本类实现了 LTI 系统的构造、属性设置、变换…...
zabbix添加IIS网站计数器(并发连接数)
0. Zabbix Agent 配置 PerfCounter = iis_Current_Connections,"\Web Service(_Total)\Current Connections",30 1.在被监控主机,powershell输入perfmon.msc 2.点击添加按钮 3.在下拉菜单中点击小箭头...
uniapp处理流式请求
在uniapp里面处理流式请求相对于web端来说有点麻烦,下面我将讲述几种处理流式请求的方式。 1.websocket WebSocket 是处理实时数据流的最佳选择之一,UniApp 提供了原生的 WebSocket 支持: <template><view class"container&…...
代码随想录算法训练营第四十一天|买卖股票专题:121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
动规五部曲牢记于心 1、确定好dp[j]数组,以及下标含义 2、推导出dp[j]公式 3、初始化,关键dp[0][0]、dp[0][1],第i天,后面的01表示状态:持有、不持有 4、确定遍历顺序: 如果求组合问题,不考虑排…...
AI小白的第七天:必要的数学知识(概率)
概率 Probability 1. 概率的定义 概率是一个介于 0 和 1 之间的数,表示某个事件发生的可能性: 0:事件不可能发生。1:事件必然发生。0 到 1 之间:事件发生的可能性大小。 例如,掷一枚公平的硬币…...
[Windows] 图吧工具箱
[Windows] 图吧工具箱 链接:https://pan.xunlei.com/s/VOMCXYDix3pvwdkU7w7bfVsDA1?pwdk8v5# DIY爱好者的必备工具...
Docker镜像迁移方案
Docker镜像迁移方案 文章目录 Docker镜像迁移方案一:背景二:操作方式三:异常原因参考: 一:背景 比如机器上已经有先有的容器,但是docker pull的时候是失败的二:操作方式 1、停止正在运行的容器…...
1264. 动态求连续区间和-acwing -树状数组
原题链接:1264. 动态求连续区间和 - AcWing题库 给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和。 输入格式 第一行包含两个整数 n 和m,分别表示数的个数和操作次数。 第…...
三分钟读懂微服务
一、什么是微服务 微服务,简单来说,就是把一个庞大复杂的软件系统,拆分成一个个小型的、独立的服务模块。打个比方,一个大型商场就如同传统的单体架构软件系统,里面所有的店铺、设施都紧密关联在一起。而微服务架构下…...
【AIGC】图片变视频 - SD ComfyUI视频生成
效果图 完整过程 SD ComfyUI 下载 下载 https://pan.quark.cn/s/64b808baa960 解压密码:bilibili-秋葉aaaki 完整 https://www.bilibili.com/video/BV1Ew411776J/ SD ComfyUI 安装 1.解压 2.将controlnet内部文件复制到 ComfyUI-aki-v1.6\ComfyUI\models\control…...
JVM详解(包括JVM内存模型与GC垃圾回收)
📖前言: 学会使用Java对于一个程序员是远远不够的。Java语法的掌握只是一部分,另一部分就是需要掌握Java内部的工作原理,从编译到运行,到底是谁在帮我们完成工作的? 接下来着重对Java虚拟机,也就…...
cocos creator 笔记-路边花草
版本:3.8.5 实现目标:给3d道路生成路边景观花草 在场景下创建一个节点,我这里种植两种花草模型,兰花和菊花,所以分别在节点下另创建两个节点,为了静态合批。 1.将花草模型分别拖入场景中,制作…...
在shell脚本内部获取该脚本所在目录的绝对路径
目录 需求描述 方法一:使用 dirname 和 readlink 命令 方法二:使用 BASH_SOURCE 变量 方法三:仅使用纯 Bash 实现 需求描述 工作中经常有这样情况,需要在脚本内部获取该脚本自己所在目录的绝对路径。 假如有一个脚本/a/b/c/…...
Qt 线程类
线程类 这些类与线程应用程序相关。 Concurrent Filter and Filter-Reduce 并行地从序列中选择值并组合它们 Concurrent Map and Map-Reduce 并行地从序列中转换值并组合它们 Concurrent Run 在单独线程中运行任务的简单方法 Concurrent Task 在独立线程中运行任务的可…...
Langchain中的表格解析:RAG 和表格的爱恨情仇
实现 RAG(Retrieval-Augmented Generation)是一个挑战,尤其是在有效解析和理解非结构化文档中的表格时。这在处理扫描文档或图像格式的文档时尤为困难。这些挑战至少包括以下三个方面: 1.表格的“叛逆期”:不准确的解析可能会破坏表格结构: 表格在文档里就像个叛逆的青少…...
神奇的闹钟(算法题)
神奇的闹钟 题目 原题 小蓝发现了一个神奇的闹钟,从纪元时间(19701970 年 11 月 11 日 00:00:0000:00:00)开始,每经过 xx 分钟,这个闹钟便会触发一次闹铃 (纪元时间也会…...
CAT1模块 EC800M HTTP 使用后续记录
记录一下 CAT1 模块EC800 HTTP 使用后续遇到的问题 by 矜辰所致目录 前言一、一些功能的完善1.1 新的交互指令添加1.2 连不上网络处理 二、问题出现三、分析及解决3.1 定位问题3.2 问题分析与解决3.2.1 查看变量在内存中的位置 3.3 数据类型说明3.3.1 常用格式化输出符号…...
Python 标准库与数据结构
Python的标准库提供了丰富的内置数据结构和函数,使用这些工具能为我们提供一套强有力的工具。 需要注意的是,相比C与Java,Python的一些特点: Python不需要显式声明变量类型Python没有模板(Template)的概念,因为Pytho…...
NIO入门
IO和NIO的区别: IO:通过流处理数据,仅支持阻塞IO。 核心组件:InputStream /OutputStream用于字节的读写,Reader / Writer:用于字符流的读写。读取过程中无法被中断,是阻塞式IO。 NIO:通过管道处…...
leetcode 用队列模拟栈
这个其实只需要一个队列就可以的,但是我这里用的是2个队列进行替换, 先转n-1个到空的队列, 然后在此基础上进行队列的互换,把剩下的那一个元素所在的队列进行poleft操作就可以了。 class MyStack:def __init__(self):self.q1_i…...
spring security 使用的过滤器还是拦截器
spring security 使用的过滤器还是拦截器 Spring Security 是一个强大的安全框架,用于保护 Java 应用程序。它主要使用过滤器(Filters)来实现安全功能,而不是拦截器(Interceptors)。不过,它也提…...
大疆上云api介绍
概述 目前对于 DJI 无人机接入第三方云平台,主要是基于 MSDK 开发定制 App,然后自己定义私有上云通信协议连接到云平台中。这样对于核心业务是开发云平台,无人机只是其中一个接入硬件设备的开发者来说,重新基于 MSDK 开发 App 工作量大、成本高,同时还需要花很多精力在无人…...
2025-03-25 Unity 网络基础4——TCP同步通信
文章目录 1 Socket1.1 Socket 类型1.2 构造 Socket1.3 常用属性1.4 常用方法 2 TCP 通信2.1 服务端配置2.2 客户端配置2.3 进行通信2.4 多设备通信 3 区分消息 1 Socket Socket 是 C# 提供的网络通信类(其它语言也有对应的 Socket 类),是…...
C++进阶(一)
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 前言 本篇博客是讲解函数的重载以及引用的知识点的。 文章目录 前言 1.函数重载 1.1何为函数重载 1.2函数重载的作用 1.3函数重载的实现 2.引用 2.1何为引用 2.2定义引用 2.3引用特性 2.4常引用 2…...
