什么是 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 输出对应起来;只有落到具体调用栈,调优才算有据可依。
对比调优前后的线程级数据时,采样窗口长度与业务负载阶段要尽量一致,否则指标差异可能全部来自流量波动,而不是参数本身。