线上CPU突然飙到500%,凶手竟是一条日志

简介: 一次CPU飙升至500%的故障,根源竟是一行日志:`logger.error("用户信息解析失败:" + userJson)`。异常请求携带近5万行乱码JSON,导致高频字符串拼接与磁盘写入,拖垮CPU。通过线程栈定位、降级日志、规范输出(限流/精简/监控),成功止损。教训深刻:看似无害的日志,亦是性能杀手。

那天我们的监控系统突然报警:某个核心服务的CPU使用率冲到了500%——因为是8核机器,单核100%,8核全满再排队。业务接口的响应时间从几十毫秒涨到了好几秒,用户那边已经开始报错了。
我赶紧登录服务器一看,java进程占用了快800%的CPU,但业务流量并没有突然暴涨,这不对劲。

一开始我以为是代码死循环

第一反应是:是不是哪个循环写错了?或者有死锁?我立马用jstack把线程栈打出来:

jstack <pid> > thread_dump.txt

然后找CPU高的线程ID,换算成16进制,在栈文件里搜。结果发现所有高CPU的线程都指向同一个地方——一个处理业务日志的方法。这个方法里有一行代码:

logger.error("用户信息解析失败:" + userJson);

看着很正常,但userJson这个字段,是前端传过来的整段用户数据,正常情况下也就几百个字符。可那段时间,有个异常请求传进来的userJson特别长——将近5万行乱码数据。

问题出在哪?

logger.error这个方法,内部会把字符串做拼接,然后格式化,最后写入磁盘。5万行的数据拼接一次就非常耗CPU了,这个异常每秒钟来了上百次。
而且这个日志级别是ERROR,写磁盘还要刷缓冲。于是CPU全耗在了字符串操作和日志输出上。
真相是:凶手不是代码逻辑,而是一条日志。当然,根本原因是那个异常请求,但如果没有这条“昂贵”的日志,CPU不至于被拖垮。

怎么解决?

把日志级别临时调高,或者直接注释掉。重启服务后,CPU立刻降回正常水平。
事后复盘做了三件事:

  1. 日志规范:禁止在循环或者高频调用的地方打印大对象、大字符串。日志里只打关键字段,比如用户ID,不要打整个JSON。
  2. 日志限流:给关键路径上的日志加上频率限制,比如同一个位置每分钟最多打印10条。

  3. 监控告警:除了看CPU,还要看异常日志的打印速率。如果某个logger每秒输出上千条,也能提前预警。

这事给我的教训

线上问题有时候特别“诡异”,不是算法错了,不是数据库慢了,而是一行看起来很无辜的日志在作妖。排查思路不能只盯着业务逻辑,IO、字符串操作、日志框架本身都可能成为性能杀手。
如果你团队里没有人专门盯这类问题,很容易踩类似的坑。比如高频日志导致磁盘IO打满、日志文件把磁盘撑爆、异常堆栈反复打印耗光CPU。这些都属于“基础设施层面”的故障,对专注于业务开发的工程师来说,不一定能第一时间想到。

关于这类问题的行业做法

在实际运维中,有些团队会通过平台能力来预防这类问题。据了解,部分运维服务商会提供“高频日志检测”功能,例如江苏立维的监控平台能够自动识别每分钟打印超过设定阈值的日志位置并发出告警,有些还内置了自动降级日志级别的响应剧本。这类做法可以帮助团队在问题发生前或刚发生时快速介入,减少人工排查的成本。
当然,每家公司可以根据自己的情况决定是否采用这类工具。大道理说一千遍不如自己踩一次坑记得牢,只是希望你的团队踩坑的时候,能有人第一时间想到:“查查日志打印,可能就是凶手。”

相关文章
|
15天前
|
JavaScript 安全 Java
【日常小问】Spring Cloud Gateway 5.x 跨域和路由配置踩坑实录
Spring Cloud Gateway 升级 5.x 后,配置前缀改为 spring.cloud.gateway.server.webflux,依赖坐标改名为 spring-cloud-starter-gateway-server-webflux,CORS 需网关统一处理,避免下游服务重复设置导致浏览器拒绝。
259 1
|
15天前
|
消息中间件 监控 NoSQL
线上Kafka积压后,我是怎么处理的
本文记录一次Kafka消费组Lag飙升20万+的实战排障全过程:从快速定位积压分区、紧急扩容消费者、优化消费参数,到发现Redis大key根因、临时降级、事后加固监控与自动化响应。强调“可观测性+自动化”是应对消息积压的关键。
|
15天前
|
SQL 运维 关系型数据库
MySQL主从复制延迟:7个原因与排查方法
MySQL主从延迟是常见运维痛点,轻则导致读写分离异常(如刚提交数据查不到),重则影响故障切换。本文系统梳理7大根因:硬件差异、慢查询/MDL锁、主库高写入、大事务阻塞、网络抖动、relay log堆积、并行复制未启用,并提供快速排查SOP与行业实践建议。
|
15天前
|
机器学习/深度学习 存储 人工智能
图解人工智能的数学基础(线性代数)
本文系统讲解线性代数核心概念,涵盖向量(定义、几何/坐标表示、内积)、矩阵(含义、运算、秩、逆、相似、分解)、行列式(几何意义与变换关系)、线性方程组、特征值与特征向量、二次型、向量空间及范数等,强调其在AI与神经网络中的实际应用。
233 7
|
15天前
|
机器学习/深度学习 人工智能 算法
图解强化学习 |手算近端策略优化算法(PPO)
PPO(近端策略优化)是当前最主流的强化学习算法,以训练稳定、上手简单、泛化性强著称。它通过Actor-Critic双网络架构,结合PPO-Clip损失函数限制策略更新幅度,并利用GAE优势估计提升样本效率,广泛应用于游戏AI、机器人控制、大模型对齐等领域。
308 3
|
15天前
|
人工智能 自然语言处理 算法
Is Grep All You Need?Agent 搜索里,Harness 比检索方法更重要
本文解读PwC AI团队论文《Is Grep All You Need?》,聚焦Agent搜索中grep与向量检索的实效对比。研究发现:在长对话检索任务中,grep常优于向量检索,但效果高度依赖Agent Harness(运行环境)及工具返回方式(inline/file-based)。论文揭示——Agent搜索是系统工程,非单点技术问题。
208 0
Is Grep All You Need?Agent 搜索里,Harness 比检索方法更重要
|
15天前
|
人工智能 自然语言处理 数据处理
《AI智能体时代,OPC中国为什么开始被关注》
AI智能体正重塑行业协作模式,“OPC中国”聚焦“One Person Company”理念,探索AI时代下轻量化组织、个人能力放大与新型职业教育。它倡导以AI Agent、工作流自动化和多智能体协同为核心,培养个体驾驭复杂任务的新能力。(239字)
|
15天前
|
人工智能 Java 数据库连接
都是 AI Coding,为什么 Java 体验差了一个量级?五条方法论帮你构建自己的 Harness 环境
本文探讨Java微服务项目AI编码体验差的根源——本地无法运行导致AI无法自主验证。提出三大改造原则:接口抽象+Profile隔离实现零侵入本地化;CLI优先让AI可调用工具;最小可运行子集替代外部依赖。实践后,Bug修复从30分钟缩短至2分钟内闭环。
|
15天前
|
机器学习/深度学习 数据采集 人工智能
水稻病害检测数据集分享(适用于YOLO系列深度学习分类检测任务)
本数据集含7000+张水稻病害图像,覆盖细菌性叶斑病、褐斑病、叶霉病三类,标注规范(YOLO格式),已划分训练/验证/测试集(8:1:1),支持YOLO系列等主流检测模型,助力智慧农业病害识别研究与落地。(239字)
226 7