CPU 与调度60 条

pidstat -t 线程级统计

sysstat 的 pidstat 可按线程输出 CPU 与上下文切换数据,适合定位多线程服务中的热点线程与切换大户。

什么是 pidstat -t

pidstat 属于 sysstat 套件,按进程输出 CPU、内存、IO 与上下文切换数据;加上 -t 后会把统计粒度下钻到线程,显示出每个线程(TID)的占用与切换情况,线程名相同也能靠 TID 区分。它是多线程服务热点定位的常用入口:先用 -t 找出占用最高的 TID 与切换大户,再用 perf、jstack、pprof 等工具追到代码。

基本信息

软件包sysstat(含 pidstat、iostat、mpstat、sar)
线程视图pidstat -t -p <pid> <间隔> <次数>
上下文切换pidstat -w -t -p <pid> <间隔>
内存视图pidstat -r -p <pid> <间隔>
单位-u 默认 CPU 百分比,-H 使用 HH:MM:SS 时间戳
采样必须带间隔与次数,单次快照没有代表性

典型使用场景

  • 多线程服务 CPU 高:定位是哪个线程在吃 CPU
  • 上下文切换异常:按线程找出切换大户
  • 线程级内存增长:观察单线程 RSS 变化趋势
  • 与 mpstat 配合:先确认是哪个核忙,再找出对应线程
  • 做压测基线:记录调优前后同一服务的线程级数据

常用命令

常用命令
pidstat -t -p 12345 1 5                 # 每线程 CPU 占用
pidstat -w -t -p 12345 1 5              # 每线程上下文切换
pidstat -r -t -p 12345 1 5              # 每线程内存使用
pidstat -u -p ALL 1 3                   # 全系统按进程看 CPU
pidstat -d -p 12345 1 5                 # 进程级 IO 统计
pidstat -C nginx -t 1 3                 # 按进程名过滤并带线程视图

输出逐列读法

列含义异常信号
TID线程 ID与进程级 PID 行区分开
%usr / %system用户态与内核态占比内核态偏高常见于系统调用密集
%CPU线程占用接近 100 说明单线程打满一核
cswch/s自愿上下文切换高说明频繁等待(锁、IO)
nvcswch/s非自愿切换高说明 CPU 竞争激烈
线程名可能重名(如多个 worker),必须结合 TID 列区分;把 TID 与 perf、jstack、pprof 的输出对应起来,才能落到具体代码位置。
sysstat 的采集依赖 /var/log/sysstat 与定时任务,若被禁用会影响 sar 的历史数据;排障前先确认采集服务正常运行。
定位到热点 TID 之后,下一步通常是把它与 perf、Java 的 jstack 或 Go 的 pprof 输出对应起来;只有落到具体调用栈,调优才算有据可依。
对比调优前后的线程级数据时,采样窗口长度与业务负载阶段要尽量一致,否则指标差异可能全部来自流量波动,而不是参数本身。

易错点

  • 务必带间隔与次数采样,单次快照没有代表性,瞬时值容易误导排查方向
  • 线程名可能重名,结合 TID 列区分,否则会把不同线程的数据看成同一个
  • 只看 CPU 不看上下文切换,锁竞争类的性能问题会在切换指标上先暴露
  • 把 pidstat 的读数当成精确归因:它给出的是统计窗口内的平均值,尖峰需要用更细粒度工具复核

数据来源与参考

  • sysstat 官方文档 pidstat(1)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌