Linux系统满载时如何快速定位高消耗进程

2025.7.14 杂七杂八 1224
33BLOG智能摘要
系统负载异常时,应首先使用top命令查看整体资源使用情况,重点关注CPU和内存占用较高的进程。可以通过`ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -n 10` 和 `--sort=-%mem`按CPU和内存排序进行详细分析。对于多线程应用(如Java和Go),应使用`top -H -p [PID]`或`ps -eLf | grep [进程名]`来检查具体线程的状态,以定位性能瓶颈。在操作过程中,避免直接使用`kill -9`强制终止进程,而是优先尝试`kill -15`来保障进程的优雅退出。当MySQL占用高CPU时,先查看其进程列表,而不是立即重启服务,对特定进程使用`strace -p [PID]`前需评估性能影响。为预防类似问题,建议配置监控告警系统,并利用cgroup限制关键服务资源。定期进行压力测试也有助于提前发现系统瓶颈。这些方法能更高效、稳定地解决服务器负载问题。
— 此摘要由33BLOG基于AI分析文章内容生成,仅供参考。

当服务器卡成狗:Linux 系统满载时的快速排障指南

Linux系统满载时如何快速定位高消耗进程

大家好,我是33blog的运维老司机。上周五凌晨2点,我正睡得香甜,突然被一阵急促的报警短信惊醒——公司生产服务器CPU负载直接飙到了800%!这种场景相信各位运维同仁都不陌生,今天我就来分享几个压箱底的排查技巧。

第一反应:别慌,先看整体情况

遇到系统满载时,新手容易手忙脚乱直接杀进程。我的经验是先用top命令看全局:

top -c

-c参数可以显示完整命令,特别有用。这时候重点看:

  • CPU占用前五的进程(%CPU列)
  • 内存占用大户(RES列)
  • 运行时间异常的进程(TIME+列)

进阶排查:这些命令更好用

如果top看不太明白,我常用这套组合拳:

# 按CPU排序
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -n 10

# 按内存排序  
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -n 10

有一次排查Java应用内存泄漏,就是靠这个发现有个Tomcat进程吃了16G内存,而正常情况下应该不超过4G。

深挖元凶:线程级分析

遇到多线程应用(比如Java)时,普通命令可能看不出问题。这时候要祭出大杀器:

# 查看指定进程的线程
top -H -p [PID]

# 或者用这个更直观
ps -eLf | grep [进程名]

记得去年有个Go服务CPU爆满,就是用top -H发现有个goroutine卡死在死循环里。

实战中的血泪教训

说几个我踩过的坑:

  1. 不要直接kill -9!先尝试kill -15给进程优雅退出的机会
  2. MySQL吃满CPU时,先看show processlist而不是直接重启
  3. strace -p [PID]追踪系统调用前,记得评估性能影响

预防胜于治疗

最后分享我的防护措施:

  • 配置监控告警(推荐Prometheus+Alertmanager)
  • 关键服务设置cgroup限制
  • 定期做压力测试,知道系统瓶颈在哪

希望这些经验对你有帮助。下次服务器再抽风时,记得深呼吸,然后优雅地敲出这些命令~ 大家有什么排查妙招,欢迎在评论区交流!

评论

  • 运维的老哥太真实了,凌晨两点被叫起来处理问题简直就是家常便饭😭

  • 这文章写得太实用了!top -c这个参数之前真不知道,学到了学到了

  • 建议新手一定要记下来这些命令,关键时刻真的救急

  • 血泪教训那几条太对了,之前直接kill -9搞出过大事

  • top -H这个查线程的用法太实用了,Java程序出问题再也不怕了

  • 看大佬的文章就想起第一次处理CPU爆满时的窘境,手忙脚乱的