服务器CPU使用率太高,先别急着升配:把us、sy、wa、si、st拆开,用top、pidstat、perf定位到进程和线程,再决定优化、调参还是扩容。多数情况下,CPU高只是症状,真正的病因在热点线程、锁竞争、慢SQL、容器限额或宿主机争抢。
服务器CPU使用率过高怎么排查:先分清真忙、假忙和等资源
CPU飙高像发烧,体温高只是信号,先看“谁在烧”,再看“是不是在等”,业内专家指出,CPU使用率必须和负载、延迟、steal一起看,单独一个总数容易误判。
先看使用率构成,不要只盯一个总数
在Linux里,top第一行的us、sy、wa、si、st各有含义,把它们拆开,排查方向会清楚很多:
- us偏高:用户态进程在忙,常见于业务计算、死循环、线程池打满、序列化/反序列化过多。
- sy偏高:内核态消耗大,常见于频繁系统调用、上下文切换、锁竞争、网络收发包过多。
- wa偏高:CPU在等IO,不一定是CPU本身不够,磁盘、网络存储、数据库慢查询都可能让CPU“空等”。
- si偏高:软中断处理多,常见于网卡收包、连接数暴涨、中断不均衡。
- st偏高:虚拟CPU等待宿主机物理CPU,据Linux内核文档(kernel.org),steal时间高往往说明云主机存在资源争抢,先查宿主机侧和实例规格,不要只改应用代码。
再看负载与核数,别被load average吓到
load average不是CPU使用率,据Linux man手册,它包含运行中的任务和不可中断睡眠任务,看负载要结合核数:
- 负载长期明显高于CPU核数,且业务延迟上升,说明任务排队。
- 负载不高但CPU使用率高,可能是单线程热点或短时突发。
- 负载高、CPU不高、
wa高,优先查磁盘IO和存储链路。
常用命令:
uptime看1、5、15分钟负载趋势。vmstat 1看r、b、si、so、us、sy、wa、st。sar -u 1 5和sar -q 1 5看历史与实时趋势。iostat -x 1看磁盘利用率和等待。
用命令落到进程和线程
定位到进程后,别停在进程名上,CPU高经常是某个线程在打转:
top按P排序,记下高CPU的PID。top -H -p <pid>看线程级CPU。pidstat -u -t -p <pid> 1观察线程波动。perf top -p <pid>看热点函数;必要时perf record -g -p <pid>后perf report。- Java应用用
jstack <pid>抓线程栈,配合jstat -gcutil <pid> 1000看GC。 - 数据库用
show processlist和慢查询日志确认是否慢SQL拖高CPU。
行业共识认为,先定位热点进程再谈扩容,能避免大部分无效升配。
云服务器CPU占用高怎么优化:应用、容器和系统三层下手
云服务器上CPU高,常见三类原因:应用自己忙、容器限额不合理、宿主机资源争抢,按层排查,比直接换机型更稳。
应用层先处理热点线程、锁和慢查询
- 线程池:核心线程数、队列长度、拒绝策略要匹配下游容量,线程池过大只会把CPU打满,不会提升吞吐。
- 锁竞争:用
jstack看BLOCKED、WAITING线程;高频锁改成无锁结构、分段锁或异步化。 - GC:频繁Full GC会推高
sy和us,调堆、调新生代、查大对象,别只加CPU。 - 慢SQL:缺索引、回表多、排序大都会让数据库CPU飙升,先看执行计划,再做索引和SQL改写。
- 缓存与异步:读多写少加缓存;非核心链路异步化,削峰填谷。
- 序列化:JSON大对象频繁转换会吃CPU,能裁剪字段就裁剪,能换高效协议就评估。
容器与虚拟化重点看cgroup限额和steal
据云服务商公开文档,cgroup的cpu.max限制容器可用CPU时间,容器里CPU高,先确认限额是否过小导致 throttling:
docker stats看容器CPU。kubectl top pod看Pod资源。- 查看
/sys/fs/cgroup/cpu.stat里的nr_throttled和throttled_time。 - 检查
cpu.max、requests/limits是否匹配业务峰值。 top里st持续偏高,查实例是否共享宿主机、是否超卖、是否需要换独享型或计算型实例。
容器限额过紧会让应用“看起来CPU高”,实际是在排队等CPU时间,限额过松又可能让一个Pod拖垮节点,按峰值和P99延迟定限额,比拍脑袋更可靠。
系统层看中断、软中断和连接队列
cat /proc/interrupts看网卡中断是否集中在一个核。cat /proc/softirqs看软中断分布。ss -s看连接数、TIME_WAIT、CLOSE_WAIT。netstat -s看重传、丢包、溢出。- 检查
somaxconn、文件句柄上限、Nginx的worker_processes和worker_connections。 - 必要时用
irqbalance、taskset、numactl做中断和进程绑核,但变更前要压测。
服务器CPU使用率太高升级配置还是先优化?价格与地域差异要算清
升配不是错,错在没算清账,先做容量基线,再决定加CPU、加内存、换存储还是换机型。
先做容量基线,再谈升配
- 看峰值、均值、P95/P99延迟,不只看某一秒的100%。
- 看高CPU持续时间:短时突发靠弹性伸缩或限流,长期高位才考虑升配。
- 看扩容窗口:业务高峰期前能否完成变更。
- 看成本:包年包月通常低于按量计费;抢占式实例便宜但不适合核心业务。
- 看地域:北京地区服务器CPU使用率过高怎么办,除了看单价,还要看机房资源池、跨可用区调度和带宽成本,一线城市资源紧俏时,单价和交付周期都可能更高。
CPU、内存、IO、网络别混着升
| 现象 | 优先动作 | 是否先升CPU |
|---|---|---|
us高、线程栈有热点函数 |
优化代码、线程池、缓存 | 不一定 |
sy高、上下文切换多 |
查锁、系统调用、收发包 | 不一定 |
wa高、磁盘等待长 |
换SSD、优化SQL、拆分IO | 不建议 |
st高、宿主机争抢 |
换独享型/计算型实例 | 可考虑 |
| 内存不足频繁GC | 加内存、调堆 | 先加内存 |
| 连接数暴涨、软中断高 | 调网络参数、加实例、负载均衡 | 结合场景 |
先优化再升配适用于热点集中、参数不合理、慢查询明确的场景。直接升配适用于业务确实增长、基线已到上限、短期无法改代码的场景,价格上,云服务器CPU升配费用与实例规格、计费方式、地域相关,别只对比月价,要把带宽、磁盘、冗余和运维成本一起算。
预防CPU再次飙高:监控、告警和压测要成闭环
监控指标要成组看
- CPU使用率、负载、
st、wa、上下文切换。 - 应用P99延迟、错误率、线程池队列、GC时间。
- 数据库慢查询数、连接数、锁等待。
- 容器throttling、Pod重启、节点资源水位。
告警不要只设一个CPU阈值,持续高位且延迟上升才更有意义;短时尖刺先看限流和弹性。
压测和容量规划
上线前做阶梯压测,记录吞吐、延迟和CPU拐点,容量规划按业务峰值留余量,定期复盘,近年来,越来越多团队把CPU告警和发布变更关联,避免“刚发版就飙高”。
变更与回滚
调线程池、改内核参数、换实例规格都要有回滚方案,先灰度,再全量,变更后观察us、sy、wa、st和P99延迟,确认不是把问题从一个指标挪到另一个指标。
服务器CPU使用率太高怎么办Q&A
问:服务器CPU使用率过高对业务有什么影响?
答:最直接的是延迟上升、吞吐下降、请求超时和错误率增加,CPU长期高位还会让线程排队、GC变频繁、连接堆积,严重时触发雪崩,先看业务延迟和错误率,再看CPU构成,别只盯百分比。
问:云服务器CPU占用高,先升配还是先查代码?
答:有明确热点线程、慢SQL、锁竞争或容器throttling时,先查代码和限额,业务基线确实增长、优化后仍长期高位,再评估升配,升配前先看st和wa,避免把IO等待或宿主机争抢误判成CPU不足。
问:CPU使用率100%但负载不高,是什么情况?
答:常见于单线程热点、短时突发、监控采样偏差或容器限额下的排队,用top -H和pidstat -t看线程级消耗,用perf看热点函数;若st高,查宿主机争抢;若wa高,查IO等待,CPU使用率是结果,线程和资源等待才是原因。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/%e6%9c%8d%e5%8a%a1%e5%99%a8cpu%e4%bd%bf%e7%94%a8%e7%8e%87%e8%bf%87%e9%ab%98%e6%80%8e%e4%b9%88%e5%8a%9e%ef%bc%8ccpu%e5%8d%a0%e7%94%a8%e9%ab%98%e5%a6%82%e4%bd%95%e6%8e%92%e6%9f%a5/


