你看到的「显示指定进程下的所有线程」是 ps 命令的一个进阶功能,用来把一个进程内部的执行单元(线程)展开查看。

一、先补基础:进程 vs 线程(运维视角)

  • 进程:系统分配资源(内存、文件句柄、端口)的最小单位,有独立的 PID,就是我们平时 ps 看到的一条条条目。
  • 线程:进程内部实际执行任务的最小调度单位,一个进程可以开 1 个或多个线程;所有线程共享进程的内存、文件等资源。

通俗类比:进程是一个项目组,有独立的办公室;线程是项目组里的员工,共用办公室资源,各自并行干不同的活。 常见多线程程序:Nginx、Java、Redis、MySQL,单进程开启大量线程并发处理请求。

默认 ps aux 只显示进程级的汇总信息,看不到内部的线程;加参数后就能展开看到每个线程的细节。


二、ps 查看指定进程线程的用法

命令格式

ps -T -p <进程PID>
  • -T:开启线程显示模式,把每个线程单独列成一行
  • -p <PID>:只过滤指定 PID 的进程,不显示其他无关进程

输出变化

相比普通 ps,会多一列 SPID(也叫 LWP,轻量级进程ID),也就是线程ID:

  • 同一进程下的所有线程,PID 列的值都相同
  • 每个线程有自己独立的 SPID
  • 状态、CPU、内存字段都是单个线程的数值

实操示例(你的WSL环境可直接运行)

查看 PID=6 的 plan9 进程的内部线程:

ps -T -p 6

就能看到这个文件共享进程内部开启了多少个线程,每个线程的状态、资源占用。


三、运维里为什么要看线程?(排障核心场景)

  1. 定位高CPU根因 某个进程整体CPU占比很高,但只能看到一个PID,不知道内部哪段逻辑在消耗CPU。展开线程后可以精准定位到具体是哪个线程占满CPU,再结合程序堆栈定位代码问题。
  2. 排查线程泄漏 程序理论上只该开固定数量的线程,结果运行越久线程数越多(比如调用完不回收),通过 ps -T 可以直观看到线程总数,验证是否泄漏。
  3. 死锁/卡顿排查 进程卡住不响应,看内部线程是不是全部卡在等待状态,有没有正在运行的工作线程。
  4. 配置校验 比如 Nginx 配置了 4 个 worker 线程,启动后用这个命令确认有没有正确开启对应数量的工作线程。

四、补充:实时查看线程CPU

如果想看实时刷新的线程占用,用 top 更方便:

top -H -p <PID>

和 ps -T 功能对应,也是展开单个进程的所有线程,实时刷新 CPU、内存状态。


易错点提醒

默认 ps aux 展示的是进程维度的汇总数据,很多新手会误以为「一个 PID 就对应一个执行流」;实际上生产环境的后端服务大多是多线程架构,一个进程内部可以并行处理几十上百个任务。

🔗 相关笔记