
— 特色专栏 —
大家好,我是民工哥!
服务器 CPU 突然飙到100%!莫慌,这样排查处理不背锅。

某个周末的下午,你正在悠闲的喝着咖啡,享受着假日的惬意之时。突然,手机收到一条紧急信息,公司业务服务器监控报警,显示CPU突然飚升至100%,已经持续近几分钟,还没来的及查看完整信息,老大的夺命Call 就已经打进来了,公司业务已经受到很大影响,如果不及时处理好,怕不是要在公司过周末了,还有可能当一回背锅侠。

类似这样的场景,我想多数人都会遇到过。
今天,我们就一起探讨一下,遇到类似问题,如何紧急排查,快速处理好不背锅。
当服务器CPU飙升至100%时,快速定位根因是恢复系统稳定性的关键。
教你三招,保证招招见效。
可以使用 top/htop 命令!
执行命令:
top -c # 显示进程列表及完整命令路径
# 或使用更友好的htop(需安装)htop
观察关键指标:
Shift + P按CPU使用率排序,快速找到占用最高的进程。java进程占95%)。初步判断:
kthreadd、rcu_sched):可能是内核问题或硬件故障。nginx、mysql):可能是代码逻辑错误或配置问题。示例输出:
PID USER COMMAND %CPU
1234 mysql /usr/sbin/mysqld 95.2
5678 root /usr/bin/python3 script.py 88.7
相关命令更多参数与实例学习可以参考以下文章:每天学一个 Linux 命令(48):top
操作步骤:
使用perf抓取系统调用:
perf top -s comm,dso # 实时显示函数调用耗时
观察overhead高的函数(如__schedule、ext4_file_write),定位内核或文件系统问题。
检查中断和软中断:
cat /proc/interrupts # 查看中断分布
mpstat -P ALL 1 # 查看各CPU核心的中断/软中断占比
若某核心si(软中断)或hi(硬中断)占比过高,可能是网络或磁盘I/O问题。
操作步骤:
使用strace跟踪系统调用
strace -p <PID> -c # 统计系统调用耗时
若read/write频繁且耗时长,可能是I/O瓶颈;若poll/select多,可能是阻塞操作。
针对Java应用使用jstack:
jstack <PID> > thread_dump.log # 生成线程堆栈
搜索BLOCKED或RUNNING状态线程,定位死锁或循环计算。
针对Python应用使用py-spy:
py-spy top --pid <PID> # 实时显示Python函数调用
观察耗时最长的函数(如numpy计算或数据库查询)。
操作步骤:
使用vmstat检查上下文切换
vmstat 1 # 每秒刷新一次
观察cs(上下文切换次数)和in(中断次数):
cs > 10000/秒,可能是多线程竞争或频繁创建线程。in高且%usr低,可能是硬件中断(如网卡)占用CPU。使用iostat检查磁盘I/O**:
iostat -x 1 # 显示设备I/O统计
%util(设备利用率)和await(I/O等待时间):%util接近100%且await高,可能是磁盘性能瓶颈。操作步骤:
使用free -h检查内存:
free -h # 显示内存使用情况
若buff/cache占用高但available低,可能是内存泄漏或缓存未释放。
使用sar检查交换分区:
sar -r 1 # 每秒显示内存和交换分区使用
若kbswpd(交换分区使用量)持续增加,可能是物理内存不足导致频繁交换。
top发现java进程占95% CPU。
jstack生成线程堆栈,发现多个线程卡在MySQL查询。
vmstat显示cs高达20000/秒,推测线程池配置不合理导致频繁创建线程。
优化线程池大小并优化SQL查询,CPU降至10%。
3分钟定位流程图!
1.top/htop → 找到高CPU进程
├─ 系统进程 → perf/mpstat → 内核/中断问题
└─ 应用进程 →
├─ Java → jstack → 线程阻塞/死锁
├─ Python → py-spy → 函数耗时
└─ 其他 → strace → 系统调用分析
2.vmstat/iostat → 排查I/O/内存竞争
3.结合日志/监控 → 验证根因并修复
通过以上三招,可快速区分问题类型(计算密集型、I/O密集型、资源竞争),并精准定位到代码层、系统层或硬件层,大幅缩短故障恢复时间。
其实,我们日常工作还是要以预防为主,处理为辅的管理方针。

监控与预防CPU高占用问题需要构建多层次、主动式、自动化的防御体系,涵盖实时监控、预警机制、容量规划、代码规范和安全防护等方面。
工具:top、htop、pidstat、Prometheus + Node Exporter
关键指标:
%CPU)RSS/VMS,避免内存泄漏引发交换)示例:
pidstat -t -p <PID> 1 # 监控指定进程的线程级CPU占用
工具:vmstat、mpstat、iostat、sar(Sysstat工具包)
关键指标:
%usr、%sys、%idle)cs,>10,000/秒可能有问题)r,>CPU核心数×2需警惕)%hi硬中断、%si软中断)示例:
mpstat -P ALL 1 # 查看各CPU核心的使用率
vmstat 1 5 # 每秒1次,共5次,观察上下文切换
工具:perf、bcc-tools(eBPF工具集)
关键指标:
perf stat -e cache-misses,context-switches)bcc-tools中的runqlat)perf stat -e mem_load_retired.l1_miss)示例:
perf stat -e cache-misses,context-switches sleep 10
# 统计10秒内的缓存未命中与上下文切换
工具:dmesg、sensors、smartctl(磁盘健康)
关键指标:
sensors显示Core 0温度>85℃需预警)dmesg | grep -i "memory error")smartctl -a /dev/sda | grep "Reallocated_Sector_Ct")示例:
watch -n 1 "sensors | grep 'Core 0'" # 实时监控CPU温度
建立阈值与动态基线!
规则:
%usr+%sys>90%持续3分钟 → 触发告警工具:
Prometheus + Alertmanager(配置告警规则)Zabbix(设置触发器)示例(Prometheus规则):
groups:
-name:cpu-alerts
rules:
-alert:HighProcessCPU
expr:max(rate(process_cpu_seconds_total[1m]))by(instance,name)>0.8
for:5m
labels:
severity:critical
annotations:
summary:"Process {{ $labels.name }} on {{ $labels.instance }} has high CPU usage"
方法:
工具:
Elastic Stack(ML模块)Grafana(动态阈值面板)示例:Grafana中设置“异常检测”算法,自动识别偏离基线的CPU spike。
规则:
%util>90% → 可能是I/O等待导致假高。retransmits>100/秒 → 可能是网络阻塞。工具:
ELK Stack(日志+指标关联分析)Splunk(事务搜索)示例:
index=metrics cpu.usage>90 AND index=network retransmits>100 | stats count
方法:
sar -q)。工具:
Grafana(时间序列分析)Python + Pandas(自定义脚本)示例:
import pandas as pd
df = pd.read_csv('cpu_usage.csv', parse_dates=['timestamp'])
df.set_index('timestamp').resample('D').max().plot() # 按天绘制峰值
云环境:
物理机:
示例(Kubernetes HPA):
apiVersion: autoscaling/v2
kind:HorizontalPodAutoscaler
metadata:
name:nginx-hpa
spec:
scaleTargetRef:
apiVersion:apps/v1
kind:Deployment
name:nginx
minReplicas:2
maxReplicas:10
metrics:
-type:Resource
resource:
name:cpu
target:
type:Utilization
averageUtilization:70# CPU使用率>70%时扩容
方法:
locust或jmeter模拟高并发场景。工具:
k6(轻量级负载测试)Gatling(HTTP负载测试)示例(k6脚本):
import http from 'k6/http';
export let options = { vus: 100, duration: '1m' };
export default function() {
http.get('https://example.com/api');
}
规则:
String拼接)。fs.promises)。ThreadPoolExecutor)。工具:
JProfiler(Java性能分析)Py-Spy(Python性能分析)示例(Java线程池优化):
ExecutorService executor = new ThreadPoolExecutor(
4, // 核心线程数=CPU核心数
8, // 最大线程数
60, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100) // 队列容量限制
);
规则:
ALTER TABLE users ADD INDEX (name))。SELECT *,只查询必要字段。工具:
pt-query-digest(MySQL慢查询分析)pgBadger(PostgreSQL日志分析)示例(MySQL索引优化):
EXPLAIN SELECT * FROM orders WHERE user_id = 100; -- 检查是否使用索引
规则:
/etc/sysctl.conf中的net.core.somaxconn)。cgroups或ulimit)。systemctl disable unused-service)。工具:
tuned(Red Hat的性能调优工具)sysbench(基准测试)示例(限制进程内存):
echo "java -Xmx512m -Xms512m -jar app.jar" > /etc/systemd/system/app.service
systemctl daemon-reload
工具:
Fail2ban(阻止暴力破解)OSSEC(主机入侵检测)规则:
/tmp目录下的可执行文件。root远程登录(PermitRootLogin no)。示例(Fail2ban配置):
[sshd]
enabled = true
port = ssh
filter = sshd
action = iptables-multiport[name=SSH, port="ssh", protocol=tcp]
maxretry = 3
规则:
xmrig、kworkerds)。工具:
ClamAV(病毒扫描)Snort(网络入侵检测)示例(阻止挖矿域名):
echo "0.0.0.0 pool.miningpool.com" >> /etc/hosts
工具:
Cloudflare(CDN防护)AWS Shield(云上DDoS防护)规则:
limit_req_zone)。net.ipv4.tcp_syncookies=1)。示例(Nginx限流):
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location / {
limit_req zone=one burst=5;
}
}
工具:
Ansible(批量执行检查脚本)Jenkins(定时运行监控任务)示例(Ansible):
- name:CheckCPUusage
hosts:all
tasks:
-command:top-bn1|head-10
register:cpu_output
-debug:var=cpu_output.stdout
工具:
ELK Stack(日志+指标关联)Loki + Promtail(轻量级日志聚合)示例(Loki查询):
{job="nginx"} |= "error" | rate([5m]) > 0.1 # 错误率>10%/5分钟
方法:
工具:
GitLab CI(集成性能测试)Jenkins Pipeline(自动化测试)示例(GitLab CI任务):
performance_test:
stage:test
script:
-locust-fload_test.py--users=100--spawn-rate=10--run-time=1m
-pythonanalyze_results.py# 分析CPU使用率是否超阈值
维度 | 关键措施 |
|---|---|
实时监控 | 进程级/系统级指标采集,使用Prometheus、eBPF等工具。 |
预警机制 | 静态阈值+动态基线+关联分析,结合Alertmanager、Grafana。 |
容量规划 | 历史数据回溯、弹性扩容、负载测试,使用Kubernetes HPA、AWS Auto Scaling。 |
代码优化 | 算法优化、异步I/O、线程池限制,使用JProfiler、Py-Spy。 |
安全防护 | 入侵检测、挖矿程序防护、DDoS防护,使用Fail2ban、Cloudflare。 |
自动化 | 巡检自动化、日志分析、性能回归测试,使用Ansible、ELK Stack。 |
通过上述措施,可实现从监控→预警→扩容→优化→防护的全流程闭环管理,显著降低CPU高占用问题的发生频率和影响范围。
用上这三招与最后这一招最佳实践,保证你万无一失,甩掉背锅侠的名号。
👍 既然都看到这里了,如果觉得不错,随手点个赞、在看、转发三连吧,如果想第一时间收到推送,也可以给我个星标⭐~