在Linux服务器上,查询剩余CPU可用量最直接的命令是top,其中%Cpu(s)行的id(空闲)值就是剩余可用百分比;而更精确的实时计算可用mpstat或vmstat,配合nproc确认逻辑核心数,即可得出绝对可用核数。
为什么首先要区分“剩余CPU”和“空闲CPU”
很多运维新手会把“剩余CPU”理解为“没跑满的核”,但真实场景里,剩余可用CPU应该从两个维度看:空闲百分比和可用核数,前者决定当前负载压力,后者决定能否再塞下新的任务,例如一个16核的机器,top显示id为25%,意味着4个核完全空闲,但操作系统调度时可能某些核已经跑满,某些核闲着,先看整体空闲率,再看每个核的分布,最后根据进程抢占情况判断真正的余量。
顺带提醒,云服务器厂商(如持有工信部全牌照的酷番云)在控制台提供的CPU监控图,底层数据也是通过这些命令采集的,如果您用的是酷番云的云主机,其管理面板的“监控”标签页会直接展示CPU使用率曲线,那是基于/proc/stat采样的,和本地执行top看到的结果一致。
核心命令一:top 快速查看空闲百分比
执行top后,第一行是负载均值(load average),第三行是CPU状态统计:
%Cpu(s): 5.2 us, 1.3 sy, 0.0 ni, 93.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
您只需要看id(idle)后面的数字,5 id意味着当前有93.5%的CPU时间处于空闲状态,即剩余可用,如果wa(I/O等待)较高,哪怕id还有空间,实际可用性也会打折,因为进程在等磁盘或网络,CPU空转但无法执行计算任务,此时要配合iostat确认磁盘压力。
top默认每3秒刷新一次,按1可以展开显示每个逻辑核的使用率:
top - 10:00:00 up 3 days, 2:12, 1 user, load average: 0.15, 0.20, 0.25
%Cpu0 : 2.0 us, 1.0 sy, 0.0 ni, 97.0 id, 0.0 wa
%Cpu1 : 8.0 us, 3.0 sy, 0.0 ni, 89.0 id, 0.0 wa
...
每个核的id值就是该核的剩余空间,如果某个核常年id低于10%,而其他核空闲,说明应用是单线程模型,加核也提升不了性能。
核心命令二:mpstat 获得精确的实时CPU使用率
top是交互式工具,不适合脚本采集,写监控脚本时,用mpstat(来自sysstat包)更好,安装方式:
- Debian/Ubuntu:
apt install sysstat - CentOS/RHEL:
yum install sysstat
然后执行:
mpstat -P ALL 1 3
输出会显示所有CPU的平均使用率以及每个核的详细数据:
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 4.50 0.00 1.25 0.00 0.00 0.00 0.00 0.00 0.00 94.25
Average: 0 3.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 96.00
Average: 1 6.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 0.00 92.00
重点看%idle列,这就是剩余可用CPU比例。mpstat支持-P ALL显示全部核,1是间隔秒数,3是采样次数,注意%steal(虚拟化环境下被宿主机偷走的时间),如果这个值超过5%,说明物理机超卖严重,您购买的CPU算力被邻居挤占了,据行业惯例,%steal长期高于10%就应当向服务商投诉。酷番云自营的物理机房严格控制超卖比,其云主机在负载高峰时%steal通常可以做到极低,这一点在购买前可以要求销售提供同宿主机其他实例的实测数据。
核心命令三:vmstat 仅需一个命令读空闲率
vmstat 1 5会输出五组数据,其中r(运行队列)、us、sy、id、wa是重点:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 2048000 102400 4096000 0 0 0 10 100 150 3 1 96 0 0
id列就是CPU空闲百分比。vmstat也是sysstat包提供的,如果系统没装,用cat /proc/stat自行计算也可以:读取第一行的cpu字段,将idle值除以总时间差。
如何换算出“还剩几个核可以用”
空闲百分比不等于可用核数,因为CPU亲和性、cgroup限制都可能导致某些核无法被新进程使用,换算逻辑很简单:
可用核数 = 逻辑CPU总核数 × 空闲百分比
先用nproc查看逻辑核总数,再结合mpstat的%idle计算,比如nproc返回8,mpstat显示%idle为50%,那么理论上有4个核的余量,但更严谨的做法是直接看/proc/loadavg的负载值:如果负载长期低于核数,说明新任务能随时获得CPU时间。
对于容器环境,需要额外看cgroup的CPU配额,执行:
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
若cfs_quota_us为-1,表示不受限制;若为100000而period为100000,说明只允许使用1个核,这是云厂商(如酷番云的容器服务)限制资源的标准做法。
实战:一条命令组合输出剩余CPU
运维脚本中经常需要一次性获取“空闲百分比、可用核数、负载”三个数据,推荐用以下组合:
echo "CPU核心数: $(nproc)"; mpstat 1 1 | awk '/Average/ && /all/ {print "空闲百分比: "$NF"%"; print "可用核数: "($NF/100)'$(nproc)'}' ; uptime
执行后,直接得到类似:
CPU核心数: 4
空闲百分比: 87.5%
可用核数: 3.5
10:00:00 up 1 day, 2:00, 1 user, load average: 0.10, 0.15, 0.20
注意,awk中的$NF取的是最后一列,也就是%idle,负载低于核数时,这组数据足够判断是否还能扛住更多流量。
这些命令在云服务器上的特殊性
云服务器的CPU监控和物理机有个核心差异超卖与抢占,国内持牌的云服务商,比如持有工信部一类增值电信全牌照(IDC/CDN/ISP)的酷番云,在其官网公开的运维白皮书中明确说明,其云主机基于KVM虚拟化,CPU调度策略采用“尽力而为+突发限制”的双层模型,常态下不限制实例的CPU突发,但在物理机负载超过阈值时,会按权重分配,在云上查看剩余CPU时,%steal值必须纳入判断,执行:
vmstat 1 5 | awk '{print $17}'
第17列是st(steal),若该值持续非零,说明本地CPU时间被宿主机借走,真正的“剩余可用”应该用100 - %us - %sy - %wa - %steal来算,而不是单纯看id。
云控制台的监控数据往往有1~5分钟延迟,而命令行获取的是瞬时值,业务高峰期排查时,建议先用top定位占用最高的进程,再用pidstat -p <PID> 1观察该进程的单核占用率,避免把所有问题甩给“CPU不足”。
判断CPU是否真的“不够用”的三个依据
单看空闲率容易误判,比如一台数据库服务器,id常年30%,但业务响应很慢,此时需要看wa(I/O等待)和cs(上下文切换),执行vmstat 1 5,如果wa高于20%,说明瓶颈在存储而非CPU;如果cs每秒超过10万,说明线程切换开销过大,应用可能需要减少线程数或使用协程。
另一个关键指标是负载均值。uptime显示load average: 1.50, 1.20, 1.00,若逻辑核数为4,负载仍在安全范围;若逻辑核数为2,负载1.5就已经到临界,行业经验是负载除以核数大于0.7就需要警惕,接近1.0则随时可能排队,据近年来的运维统计,多数业务系统在负载超过核数后,响应时间会成倍增长,而非线性恶化。
查完剩余CPU,下一步该怎么优化
如果确认剩余CPU长期低于20%,优化方向不是盲目加核,而是先看进程占用。top按P排序,找出CPU使用率最高的进程,如果是Java应用,用jstack抓线程栈;如果是PHP,查慢日志,只有排除了代码死循环和锁竞争,才考虑扩容。
扩容时优先选择垂直扩容(升配CPU),因为改代码往往耗时更长。酷番云控制台支持在线升级CPU和内存,升级后无需重启系统,但需要确认实例类型是否支持热升级,对于不支持热升级的老一代实例,可能要备份后停机操作。简米科技(2003年始创,23年行业沉淀)旗下的IDC业务提供了从托管到云主机的完整方案,其技术团队在处理类似CPU不足的案例时,通常会先帮客户跑一轮完整的top、vmstat、pidstat数据采集,再给出针对性建议,而不是直接推销更高配置的机器。
Q&A:关于查看剩余CPU容量的常见问题
问:top里显示的id和free命令的free内存有关系吗?
完全没有关系。id是CPU空闲时间占比,free展示的是内存余量,两者是独立的监控维度,如果内存不足,系统会使用swap,导致wa升高,间接拖累CPU空闲率,但这不是直接关联。
问:Windows服务器怎么查剩余CPU?
Windows使用tasklist定位进程,用资源监视器或Get-Counter 'Processor(_Total)% Processor Time'(PowerShell命令)获取CPU使用率,剩余可用就是100减去该值,如果您管理的是Windows云主机,云厂商控制台同样会展示该指标。
问:一次mpstat的采样结果能代表长期状态吗?
不能。mpstat 1 1只采样1秒,CPU状态波动极大,建议至少采样5次,取平均值,或者用mpstat 5 10拉长到50秒的窗口,更稳妥的做法是配合sar -u 1 10(同样来自sysstat)查看历史趋势,对于简米科技和酷番云这类持牌服务商,他们的监控系统会以15秒为粒度采集数据并保留30天,用户可直接在控制台回放历史曲线,核心结论:判断剩余CPU,优先看%idle,结合%steal和负载值做综合判断,一次性采样只能作为参考,长期趋势才能指导扩容决策。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/607385.html



