Linux服务器CPU占用率100%?排查与优化全攻略
cgset -r cpu.cfs_quota_us=50000 app_group# 限制50%CPU。# 当CPU>95%时自动抓取分析(保存到/var/log/cpu_emergency)cpulimit -p <PID> -l 50# 将进程CPU限制在50%renice -n 19 -p <PID># 设置为最低优先级。ls -al /proc/<PID>/exe# 查看进程真实路径。to
一、紧急响应:5秒定位问题进程
# 1. 快速查看CPU占用TOP进程(按CPU降序) top -c -o %CPU # 传统top工具 htop # 更直观的替代方案(需安装) # 2. 精简版命令(适用于自动化监控) ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -n 10
输出关键列解读:
-
%CPU
:进程CPU占用百分比 -
COMMAND
:进程名(注意异常路径如/tmp/.xxx
可能是恶意程序)
二、深度诊断:4类常见原因与排查方法
1. 用户空间进程占用高(90%场景)
排查工具:
# 查看进程的详细线程占用 pidstat -p <PID> 1 5 # 监控特定进程 perf top -p <PID> # 分析热点函数(需root) # 检查是否挖矿病毒(常见特征) ls -al /proc/<PID>/exe # 查看进程真实路径 netstat -tulnp | grep <PID> # 检查异常连接
典型案例:
-
Java应用崩溃:
jstack <PID> > thread_dump.log
分析线程死锁 -
PHP-FPM进程暴增:调整
pm.max_children
并检查慢查询日志
2. 内核态占用高(sy%异常)
诊断命令:
vmstat 1 10 # 查看系统上下文切换(cs列) dmesg | grep "CPU" # 检查CPU相关内核报错 perf record -a -g # 记录内核调用栈(生成flame graph)
常见原因:
-
网络中断集中:
cat /proc/interrupts
查看IRQ分布 -
文件系统频繁sync:优化
/etc/fstab
挂载参数(如noatime
)
3. I/O等待导致CPU假高(wa%>30%)
iostat -x 1 10 # 查看await/%util指标 iotop -o # 显示实时I/O进程
优化方案:
-
数据库:调整
innodb_io_capacity
-
日志服务:改用异步写入或限制日志级别
4. 硬件/内核问题
-
CPU过热:
sensors
查看温度(超过90°C需警惕) -
内核BUG:
cat /var/log/kern.log | grep "CPU"
三、优化方案:对症下药
问题类型 | 短期解决 | 长期优化 |
---|---|---|
异常进程 | kill -9 <PID> |
配置进程监控(如supervisor) |
线程阻塞 | 重启服务 | 代码优化(避免死锁/无限循环) |
配置不合理 | 调整进程数(如nginx worker) | 压力测试+弹性伸缩 |
内核瓶颈 | 重启服务器 | 升级内核或切换发行版 |
具体操作示例:
# 限制进程CPU使用(临时方案) cpulimit -p <PID> -l 50 # 将进程CPU限制在50% # 调整进程优先级 renice -n 19 -p <PID> # 设置为最低优先级
四、防御性运维:预防CPU爆满
-
监控告警:
# 添加Zabbix监控项(触发告警阈值) system.cpu.util[,user,avg1]>90
-
资源限制:
# 使用cgroups限制组资源 cgcreate -g cpu:/app_group cgset -r cpu.cfs_quota_us=50000 app_group # 限制50%CPU
-
自动化脚本:
# 当CPU>95%时自动抓取分析(保存到/var/log/cpu_emergency) #!/bin/bash if [ $(top -bn1 | grep "Cpu(s)" | awk '{print 100 - $8}') -gt 95 ]; then ps -eo pid,ppid,cmd,%cpu > /var/log/cpu_emergency/$(date +%s).log fi
五、经典案例库
案例1:MySQL CPU 100%
-
现象:
mysqld
进程持续高占用 -
排查:
sql
SHOW PROCESSLIST; -- 查看运行中的查询 SELECT * FROM sys.schema_table_lock_waits; -- 检查锁竞争
-
解决:优化慢查询(添加索引)或kill阻塞进程
案例2:Docker容器占用高
-
命令:
docker stats # 查看容器资源占用 docker exec -it <容器ID> top
-
方案:限制容器CPU份额:
docker run --cpus=0.5
总结:CPU 100%问题解决流程
1️⃣ 快速定位:top → pidstat → perf
三层分析
2️⃣ 分类处理:区分用户态/内核态/I/O等待
3️⃣ 根治优化:代码/配置/架构级改进
4️⃣ 建立防御:监控+资源限制+自动化响应
附:推荐工具包
火焰图生成:
perf
+FlameGraph
压力测试:
stress-ng
容器诊断:
cadvisor
更多推荐
所有评论(0)