上次处理一台Nginx服务CPU占用不均衡的问题,我到现在印象都很深。那台机器整体CPU利用率不到15%,接口延迟却偶发飙升,如果只看top一眼扫过去,会觉得“CPU完全没问题,得去查应用层”。后来我敲了一句mpstat -P ALL 1,结果立刻浮出水面:CPU0的%soft长时间在40%以上,而CPU1到CPU7基本都是个位数空闲状态。这台机器不是CPU不够,而是“CPU没有均匀用起来”。
这也是Linux性能排查里很典型的一幕:多核环境下,只看全局平均值往往会被骗,真正需要关注的是“每个可用CPU各自的状态”。mpstat就是专门做这件事的工具,它来自sysstat工具包,名字是multiprocessor statistics的缩写,能逐个逻辑CPU输出用户态占比、内核态占比、硬件中断、软中断、IO等待等指标,不需要root权限也能直接运行。这篇文章我不打算写成man page翻译,而是把mpstat从数据来源、输出指标、常用参数,到真实排障场景、容易踩的坑,完整串一遍,争取你看完能直接拿去用。
1. 为什么多核调优总绕不开mpstat:整体平均会骗人
1.1 一次让我记住mpstat的线上经历
先复盘一下开头那个Nginx案例。当时服务部署配置、连接数、超时参数都翻了一遍,问题依旧,甚至有同事开始怀疑是云厂商的网络问题。我之所以会想到用mpstat,是因为之前处理过类似的现象:总CPU不高,但某一个核被打满时,同核上的软中断、业务线程会出现互相抢占,导致延迟毛刺
