ps -eLf 可直接查看线程累计 CPU 时间(cputime)和调度优先级(pri/NI),是轻量、可靠、适合脚本的排查方式;cputime 精确到秒,反映真实执行时长,优于 top 中百毫秒级的 TIME+。

用 ps -eLf 查线程累计 CPU 时间和优先级
直接看每个线程的总执行时长(cputime)和当前调度优先级,ps 是最轻量、最可靠的方式。它不依赖交互式界面,适合脚本或快速排查。
-
ps -eLf列出所有线程(-L表示线程),-e表示全部,-f输出完整字段 - 关键列:
TID(线程 ID)、%cpu(瞬时 CPU 占用)、cputime(累计执行时间,格式为MM:SS或HH:MM:SS)、ni(Nice 值)、pri(内核调度优先级,注意:部分内核版本显示为pri,部分显示为pri或PR,实际值同top中的PR列) - 按执行时长倒序:加
--sort=-cputime,例如ps -eLf --sort=-cputime | head -10 - 只看某个进程的线程:加
-p <pid></pid>,如ps -eLf -p 1234 --sort=-cputime
top -H -p <pid></pid> 实时观察线程 PR/NI 和运行状态
当需要动态跟踪某进程内各线程的实时优先级变化、CPU 占用波动或是否处于 R(运行)/S(睡眠)状态时,top -H -p 比 ps 更直观。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
-
-H启用线程视图,-p <pid></pid>锁定目标进程——避免被其他进程干扰视线 - 默认列中:
PR是内核看到的实时优先级(值越小越高;rt表示实时调度类),NI是 Nice 值(范围 -20~19) -
PR实际 = 从内核调度器计算出的值,普通线程通常为ni + 80(如NI=5→PR=85),但实时线程(SCHED_FIFO/SCHED_RR)会显示rt并使用独立的rtprio范围(1~99) - 按
P键可按 %CPU 排序,按T键可按累计 CPU 时间排序(注意:此“TIME+”列是百毫秒精度的累加值,非cputime的时分秒格式)
确认线程调度策略和实时优先级要用 ps -T -p <pid></pid> 或读 /proc/<pid>/task/<tid>/stat</tid></pid>
top 和基础 ps 不直接显示调度类(SCHED_OTHER/SCHED_FIFO)或实时优先级(rtprio),而这恰恰是判断线程是否真有高优先级保障的关键。
-
ps -T -p <pid></pid>会输出SPRI(调度优先级)和SCPU(调度类缩写,如TS=CFS,FF=SCHED_FIFO,RR=SCHED_RR) - 更底层的信息在
/proc/<pid>/task/<tid>/stat</tid></pid>第 39 字段是rtprio,第 40 字段是policy(数值:0=OTHER, 1=FIFO, 2=RR, 6=BATCH) - 也可用
cat /proc/<pid>/task/<tid>/sched</tid></pid>查详细调度参数,但需 root 权限,且输出较冗长 - 注意:
rtprio仅对实时线程有意义;普通线程该值为 0,不能仅靠NI或PR判断是否实时
别把 TIME+ 当成真实运行时长,cputime 才是累计执行秒数
很多人误以为 top 里 TIME+ 列代表线程总运行时间,其实它是“用户态 + 内核态 CPU 时间”的累加值,单位是百毫秒,且受采样频率影响,**不是 wall-clock 秒数**。真正反映“这个线程总共跑了多久”的,是 ps 的 cputime 字段(精确到秒,格式清晰)。
-
TIME+在top中可能因刷新延迟或四舍五入出现跳变,不适合做跨会话对比 -
cputime由内核维护,稳定可靠,适合日志记录或自动化分析 - 如果要算“每秒执行多少秒”,得用两次
cputime差值除以时间间隔——而不能用TIME+差值
ps -eLf --sort=-cputime 快速定位耗时大户,再用 ps -T -p <pid></pid> 看它是不是实时线程,最后进 top -H -p <pid></pid> 动态观察 PR/NI 波动和状态切换——三者配合,才能看清线程到底“跑得多”还是“跑得急”。

















