如何排查服务器 CPU 占用过高?

2025.5.29 杂七杂八 1775

如何排查服务器 CPU 占用过高? 杂七杂八-第1张

服务器CPU占用过高可能导致性能下降甚至服务中断。本文详细介绍通过系统监控工具(如top、htop)、进程分析、日志排查等方法定位高CPU占用原因,并提供Java应用、数据库查询优化等场景的解决方案,帮助运维人员快速恢复服务稳定性。

一、快速确认CPU负载状态

使用以下命令获取实时CPU使用情况:

 基础监控命令
top -c           动态进程列表(按CPU排序)
htop            增强版top(需安装)
mpstat -P ALL   查看每个核心的利用率
uptime          查看平均负载

关键指标解读:

  • Load Average:1分钟/5分钟/15分钟平均负载(建议不超过CPU核心数×0.7)
  • %us:用户空间占用CPU百分比(应用问题常见于此)
  • %sy:内核空间占用CPU百分比(系统调用频繁时升高)

二、定位高CPU占用进程

1. 使用top/htop交互命令

  • P键按CPU使用率排序
  • M键按内存使用排序
  • 记录异常进程的PID和命令路径

2. 深度分析进程状态

 查看进程详细信息
ps -ef | grep [PID]
pstree -p [PID]     查看进程树
lsof -p [PID]       查看打开的文件/网络连接

 Java应用专用命令
jstack [PID] > thread_dump.log   线程转储
jstat -gcutil [PID] 1000 5       GC监控

三、常见场景排查方案

场景1:Java应用CPU飙升

  1. 使用top -Hp [PID]找到高CPU线程ID
  2. 将线程ID转换为16进制:printf "%xn" [TID]
  3. 在jstack输出中搜索该16进制ID定位问题代码

场景2:数据库查询导致高负载

-- MySQL慢查询分析
SELECT  FROM performance_schema.events_statements_summary_by_digest 
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;

-- PostgreSQL活跃查询
SELECT pid, query_start, query FROM pg_stat_activity 
WHERE state = 'active';

场景3:系统级问题

  • 上下文切换过多vmstat 1查看cs列
  • 中断异常cat /proc/interrupts
  • 内核问题perf top分析内核调用

四、优化与预防措施

问题类型 解决方案
代码死循环 添加性能监控探针,设置超时机制
缓存穿透 实现布隆过滤器或空值缓存
锁竞争 改用读写锁或减少锁粒度
频繁GC 调整JVM参数,优化对象生命周期

长期监控建议:

 使用sar工具建立历史记录
sudo apt install sysstat    Debian/Ubuntu
sudo yum install sysstat    RHEL/CentOS

 启用数据收集(编辑/etc/default/sysstat)
ENABLED="true"

评论