服务器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飙升
- 使用
top -Hp [PID]
找到高CPU线程ID - 将线程ID转换为16进制:
printf "%xn" [TID]
- 在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"
评论