欢迎来到深圳市壹通道科技有限公司!

Linux 服务器专业运维——为应用保驾护航

信息图片
发布人 张* ✓ 已验真企业
企业名称 东莞市瑞恩网络科技有限公司 ✓ 已认证
联系电话 151****0966
浏览次数 9
发布时间 2026-06-02 10:46
信息类型 供应

背景:

  • 线上业务反馈某台核心应用服务器在凌晨 2:00-3:00 出现间歇性响应超时,CPU 使用率峰值达到 95% 以上,持续时间约 5-8 分钟,连续三晚均有发生。本文记录整个排查过程和最终定位思路。
  • 排查步骤:

  • 1. 确认现象

  • 登录目标服务器,先用 top 和 htop 查看当前资源使用情况,确认问题时段确实存在 CPU 飙升。由于问题是间歇性的,需要保留历史数据:
  • 2. 定位可疑进程

    通过 ps aux --sort=-%cpu | head -20 抓取 CPU 占用 TOP 进程,发现在问题时段有一个 Java 进程(应用服务)CPU 飙高。进一步用 top -H -p <pid> 查看该进程内线程的 CPU 分布,定位到具体线程 ID。

  • 3. 分析 JVM 线程栈

  • 用 jstack 导出线程快照,对照高 CPU 线程的十六进制 ID 找到对应线程栈:
  • 分析发现该线程一直在执行 Full GC,说明堆内存不足或存在内存泄漏。
  • 4. 查看 JVM 内存与 GC 日志

  • 确认老年代持续增长,在问题时段触发频繁 Full GC,导致 STW(Stop The World)停顿,进而造成接口超时。

  • 5. 分析堆转储

  • 用 MAT(Memory Analyzer Tool)分析 heap.bin,发现一个定时任务在凌晨批量加载大量数据到内存中做计算,数据量超出预期,触发了内存瓶颈。

  • 6. 根因与修复

  • 根因是定时任务分页查询失效,本应每次取 1000 条,实际由于 SQL 条件拼接错误导致全表扫描加载了 200W+ 条数据到内存。
  • 修复措施:
  1. 修正 SQL 分页逻辑,确保按主键范围分批拉取
  2. 增加 JVM 堆内存告警阈值(-Xmx 从 2G 调整为 4G)
  3. 添加定时任务执行时长监控告警
  4. 在代码层增加数据量上限保护,超过阈值直接中断并告警
  • 总结:

  • 排查 CPU 飙升问题,核心思路是"先看现象、定位进程、深入线程、分析内存"。善用 Linux 内置工具链(sar / pidstat / top / jstack / jstat)可以完成大部分排查,不必上来就引入重型 APM 工具。