top 命令详解与参数实测(Ubuntu 22.04)
在 Ubuntu 22.04(procps-ng 3.3.17)上逐参数实测 top:-b 批处理快照逐行解读、-n/-d 连续采样、-p/-u/-i/-H/-c/-o/-O/-w/-1 全参数实测、load average 与 %Cpu(s) 口径、线程视图与交互键位表,全部命令与回显真实可复现。
top 命令详解与参数实测(Ubuntu 22.04)
目标:全面掌握 top 的每一个常用参数——
-b批处理快照逐行解读、-n/-d连续采样、-p/-u/-i/-H/-c/-o/-O/-w/-1全参数实测、load average 与 %Cpu(s) 口径、线程视图与交互键位表,全部命令与回显已在 Ubuntu 22.04(procps-ng 3.3.17)实测通过。
一、环境信息
本篇所有命令均在以下环境中逐条实测,回显逐字照抄:
- 操作系统:Ubuntu 22.04.5 LTS(代号 jammy)
- 内核:6.8.0-138-generic(x86_64)
- top 版本:procps-ng 3.3.17(Ubuntu 22.04 官方仓库自带)
- CPU / 内存:12 逻辑核(
/proc/cpuinfo与/proc/stat均为 12)/ 40 GB / Swap 2 GB - 实测账号:root;演示目录:
/root/demo/top - 本机为多账户共用环境,存在少量其他账户历史会话遗留的僵尸进程,回显如实保留
版本与环境实测回显:
$ top -v
procps-ng 3.3.17
Usage:
top -hv | -bcEeHiOSs1 -d secs -n max -u|U user -p pid(s) -o field -w [cols]
$ grep PRETTY_NAME /etc/os-release
PRETTY_NAME="Ubuntu 22.04.5 LTS"
$ uname -r; uname -m
6.8.0-138-generic
x86_64
$ nproc; free -m | head -2
12
total used free shared buff/cache available
Mem: 40066 8767 8797 57 22501 30643
二、命令概览
2.1 语法与测试数据
top 是实时进程监视器,交互模式全屏动态刷新;配合 -b 批处理模式则按指定次数输出快照,是自动化巡检的标准姿势。官方用法(取自 top -v 输出):
top -hv | -bcEeHiOSs1 -d secs -n max -u|U user -p pid(s) -o field -w [cols]
usage 行中每个参数的含义预览(均在本篇第三章逐个实测):
| 参数 | 含义 | 实测节 |
|---|---|---|
| -h / -v | 帮助 / 版本 | 2.2、2.3 |
| -b | 批处理模式(管道与文件输出必备) | 3.1 |
| -n max | 刷新次数上限 | 3.1、3.3 |
| -d secs | 刷新间隔秒数(可带小数) | 3.3 |
| -u / -U | 按 生效用户 / 真实用户 过滤 | 3.5 |
| -p pid(s) | 只监控指定 PID(可逗号分隔多个) | 3.4 |
| -o field | 指定排序字段 | 3.11 |
| -w [cols] | 输出宽度(默认 80,防止命令行截断) | 3.9 |
| -c | 显示完整命令行 | 3.8 |
| -H | 线程视图 | 3.7 |
| -i | 忽略空闲进程 | 3.6 |
| -1 | 逐核展开 CPU 汇总 | 3.10 |
| -S / -s | 累计时间模式 / 安全模式 | 见 man top(未列入本篇实测) |
为了让 %CPU、TIME+、线程数等字段有真实变化可观察,先准备演示进程:两个 sleep,外加一个"主线程 + 3 个忙等工作线程"的 python3 程序(演示目录 /root/demo/top,测试结束后已清理):
$ mkdir -p /root/demo/top && cd /root/demo/top && pwd
/root/demo/top
$ sleep 300 & T1=$!; echo T1=$T1
T1=139
$ sleep 301 & T2=$!; echo T2=$T2
T2=140
多线程演示程序 mt.py 内容如下(3 个工作线程在 GIL 下忙等,整进程稳定占满约 1 核,方便观察 %CPU 与 TIME+ 增长):
import threading, time
def worker():
while True:
pass
threads = [threading.Thread(target=worker, daemon=True) for _ in range(3)]
for t in threads:
t.start()
time.sleep(300)
$ python3 /root/demo/top/mt.py & TP=$!; echo TP=$TP
TP=141
$ sleep 2
2.2 --help 全量输出(逐行照抄)
top 的 -h 只提供版本与用法骨架,没有 ps 那样的分主题长帮助:
$ top -h 2>&1; echo rc=$?
procps-ng 3.3.17
Usage:
top -hv | -bcEeHiOSs1 -d secs -n max -u|U user -p pid(s) -o field -w [cols]
rc=0
💡 说明:top 的详细文档在两个地方——交互界面里按
h键查看内置帮助,或阅读 man top(其中 4. 交互命令一节是键位表的权威来源);top -h与top -v输出相同,均以 rc=0 退出。
2.3 版本信息
$ top -v
procps-ng 3.3.17
Usage:
top -hv | -bcEeHiOSs1 -d secs -n max -u|U user -p pid(s) -o field -w [cols]
procps-ng 3.3.17 与本系列《ps 命令详解与参数实测(Ubuntu 22.04)》为同一软件包、同一版本,两个工具的字段口径可直接互相对照。
三、参数逐项实测
3.1 -b -n 1:批处理快照与头部五行逐行解读
-b(batch)把全屏界面转为顺序输出,-n 1 表示只刷新 1 次。取输出头部:
$ top -b -n 1 | head -6
top - 10:34:44 up 4:18, 4 users, load average: 0.75, 1.12, 1.24
Tasks: 9 total, 1 running, 6 sleeping, 0 stopped, 2 zombie
%Cpu(s): 15.8 us, 6.0 sy, 0.0 ni, 76.5 id, 0.0 wa, 0.0 hi, 1.6 si, 0.0 st
MiB Mem : 40066.4 total, 8829.8 free, 8734.6 used, 22502.0 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30676.3 avail Mem
第 1 行(等价 uptime 输出):10:34:44 当前时刻;up 4:18 开机时长;4 users 登录会话数;load average: 0.75, 1.12, 1.24 为最近 1、5、15 分钟的平均负载。
💡 技术拓展:load average 三个数字怎么读——
要素 说明 口径 可运行任务(R 态)+ 不可中断睡眠任务(D 态)的指数加权移动平均 基准 与 CPU 核数对比:本机 12 核,load 持续高于 12 才算饱和 走势 看 1 分钟与 15 分钟的相对高低判断负载在升还是在降 注意:D 态任务计入 load 但不占 CPU,所以"load 高而 CPU 空闲"通常指向存储链路瓶颈,而非算力不足——这是 load 与 CPU% 最重要的差异。
第 2 行 Tasks:进程总数与五状态计数。本例 9 total, 1 running, 6 sleeping, 0 stopped, 2 zombie——2 个僵尸即系统遗留的收尸悬案,与 ps 篇 3.3 节的 Z 态实测互为印证。
第 3 行 %Cpu(s):全部核心合计后的 CPU 时间占比,八个字段:
| 字段 | 含义 | 本例 |
|---|---|---|
| us | 用户态 | 15.8(python3 忙等拉升) |
| sy | 内核态 | 6.0 |
| ni | 调整过 nice 的用户态 | 0.0 |
| id | 空闲 | 76.5 |
| wa | 等待 IO | 0.0 |
| hi | 硬中断 | 0.0 |
| si | 软中断 | 1.6 |
| st | 被虚拟化层偷走的时间 | 0.0 |
第 4、5 行内存与交换分区:total / free / used / buff/cache 四值与 avail Mem。
💡 说明:free 看起来只剩 8.8 GB,但
buff/cache的 22.5 GB 随时可回收,真正可用量看行尾avail Mem(30.7 GB)——判断内存压力以 avail Mem 为准,不要被 free 吓到。
3.2 进程区逐列解读(VIRT/RES/SHR/S/%CPU/%MEM/TIME+/COMMAND)
-b -n 1 输出的进程区默认按 %CPU 降序(本例忙等的 python3 稳居第一):
$ top -b -n 1 | head -16
top - 10:34:44 up 4:18, 4 users, load average: 0.75, 1.12, 1.24
Tasks: 9 total, 1 running, 6 sleeping, 0 stopped, 2 zombie
%Cpu(s): 17.1 us, 5.5 sy, 0.0 ni, 74.6 id, 0.0 wa, 0.0 hi, 2.8 si, 0.0 st
MiB Mem : 40066.4 total, 8838.5 free, 8725.8 used, 22502.1 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30685.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
141 root 20 0 238924 8976 5740 S 100.0 0.0 0:02.33 python3
1 root 20 0 2792 1524 1428 S 0.0 0.0 0:00.03 sleep
60 root 20 0 0 0 0 Z 0.0 0.0 0:00.00 sleep
119 root 30 10 0 0 0 Z 0.0 0.0 0:00.00 sleep
124 root 20 0 4364 3232 2960 S 0.0 0.0 0:00.03 bash
139 root 20 0 2792 1528 1436 S 0.0 0.0 0:00.00 sleep
140 root 20 0 2792 1664 1576 S 0.0 0.0 0:00.00 sleep
148 root 20 0 7192 3440 2944 R 0.0 0.0 0:00.00 top
149 root 20 0 2804 1352 1256 S 0.0 0.0 0:00.00 head
逐列含义与实测对照:
| 列 | 含义 | 实测对照 |
|---|---|---|
| PID | 进程 ID | 141 为演示 python3 |
| USER | 生效用户 | root |
| PR | 内核优先级视图 | 普通进程 = 20 + NI;119 号 NI=10 → PR=30;实时进程显示 rt |
| NI | nice 值(-20 最高,19 最低) | 119 号为 10(遗留的低优先级进程) |
| VIRT | 虚拟内存(KiB) | python3 238924 ≈ 233 MB,含映射未触碰的空间 |
| RES | 常驻物理内存(KiB) | python3 8976 ≈ 8.8 MB,内存压力看它 |
| SHR | 其中共享的部分(库、共享内存) | python3 5740 |
| S | 进程状态 | S 睡眠、R 运行、Z 僵尸(与 ps 的 STAT 主码一致) |
| %CPU | 单核 100% 口径的占用率 | python3 100.0(多线程可超 100,见 3.5 实测 106.7) |
| %MEM | 占物理内存百分比 | 8976 KB / 40 GB ≈ 0.0 |
| TIME+ | 累计 CPU 时间(精确到百分秒) | 0:02.33,持续增长可对照 3.3 节 |
| COMMAND | 命令名(配合 -c 展开为完整命令行) | 见 3.8 节 |
两个值得注意的实测细节:僵尸进程(60、119)的 VIRT/RES/SHR 全为 0——与 ps 篇观察一致,僵尸不占内存;top 进程自身(148)与管道下游 head(149)也会出现在自己的列表里。
3.3 -n 2 -d 1:连续采样与差异对比
-n 2 -d 1 表示每 1 秒刷新一次、共输出 2 次。完整双采样回显如下:
$ top -b -n 2 -d 1
top - 10:37:17 up 4:20, 4 users, load average: 0.66, 0.90, 1.13
Tasks: 7 total, 1 running, 3 sleeping, 0 stopped, 3 zombie
%Cpu(s): 10.9 us, 3.8 sy, 0.0 ni, 82.0 id, 0.5 wa, 0.0 hi, 2.7 si, 0.0 st
MiB Mem : 40066.4 total, 9104.3 free, 8446.3 used, 22515.8 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30964.6 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
205 root 20 0 238924 9092 5852 S 93.8 0.0 0:02.18 python3
1 root 20 0 2792 1524 1428 S 0.0 0.0 0:00.03 sleep
60 root 20 0 0 0 0 Z 0.0 0.0 0:00.00 sleep
119 root 30 10 0 0 0 Z 0.0 0.0 0:00.00 sleep
188 root 20 0 0 0 0 Z 0.0 0.0 0:00.00 bash
196 root 20 0 4364 3172 2904 S 0.0 0.0 0:00.02 bash
210 root 20 0 7192 3468 2976 R 0.0 0.0 0:00.00 top
top - 10:37:18 up 4:20, 4 users, load average: 0.77, 0.92, 1.14
Tasks: 7 total, 1 running, 3 sleeping, 0 stopped, 3 zombie
%Cpu(s): 11.4 us, 3.2 sy, 0.0 ni, 83.5 id, 0.1 wa, 0.0 hi, 1.8 si, 0.0 st
MiB Mem : 40066.4 total, 9104.3 free, 8446.3 used, 22515.8 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30964.6 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
205 root 20 0 238924 9092 5852 S 101.0 0.0 0:03.19 python3
1 root 20 0 2792 1524 1428 S 0.0 0.0 0:00.03 sleep
60 root 20 0 0 0 0 Z 0.0 0.0 0:00.00 sleep
119 root 30 10 0 0 0 Z 0.0 0.0 0:00.00 sleep
188 root 20 0 0 0 0 Z 0.0 0.0 0:00.00 bash
196 root 20 0 4364 3172 2904 S 0.0 0.0 0:00.02 bash
210 root 20 0 7192 3476 2976 R 0.0 0.0 0:00.00 top
对比两个采样周期的差异,正是 top"实时性"的价值所在:
- TIME+ 0:02.18 → 0:03.19:1 秒间隔恰好累计约 1.01 秒 CPU,印证该进程持续占满 1 核;
- %CPU 93.8 → 101.0:单次采样窗口内的瞬时值会围绕真实水平波动,瞬时超 100% 也属正常;
- load average 0.66 → 0.77(1 分钟值爬升)、%Cpu(s) 各字段同步微调:忙等进程对系统级指标的拖动即时可见;
- 睡眠进程(sleep、bash)的 TIME+ 纹丝不动——不耗 CPU 就不累计。
3.4 -p 多进程监控
-p 限定只监控指定 PID,可重复给出或逗号分隔。此时头部 Tasks 行也随监控集收窄(2 个进程):
$ top -b -n 2 -d 1 -p 139 -p 140 | head -20
top - 10:34:45 up 4:18, 4 users, load average: 0.75, 1.12, 1.24
Tasks: 2 total, 0 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 9.0 us, 0.6 sy, 0.0 ni, 89.9 id, 0.0 wa, 0.0 hi, 0.6 si, 0.0 st
MiB Mem : 40066.4 total, 8844.8 free, 8719.6 used, 22502.1 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30691.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
139 root 20 0 2792 1528 1436 S 0.0 0.0 0:00.00 sleep
140 root 20 0 2792 1664 1576 S 0.0 0.0 0:00.00 sleep
top - 10:34:46 up 4:18, 4 users, load average: 0.75, 1.12, 1.24
Tasks: 2 total, 0 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 9.7 us, 0.8 sy, 0.0 ni, 88.7 id, 0.0 wa, 0.0 hi, 0.8 si, 0.0 st
MiB Mem : 40066.4 total, 8844.8 free, 8719.6 used, 22502.1 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30691.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
139 root 20 0 2792 1528 1436 S 0.0 0.0 0:00.00 sleep
140 root 20 0 2792 1664 1576 S 0.0 0.0 0:00.00 sleep
监控对象的 PID 可先用 pgrep 或 ps 获得;%Cpu(s)、MiB Mem 等系统级指标仍为全机口径,不随 -p 收窄。
3.5 -u 用户过滤
-u 按生效用户过滤进程区。root 视角下,忙等 python3 的 %CPU 在此采样窗口达到 106.7——单进程超过 100% 是多线程在多核上的正常形态:
$ top -b -n 1 -u root | head -12
top - 10:34:47 up 4:18, 4 users, load average: 0.75, 1.12, 1.24
Tasks: 9 total, 1 running, 6 sleeping, 0 stopped, 2 zombie
%Cpu(s): 9.4 us, 0.0 sy, 0.0 ni, 89.4 id, 0.0 wa, 0.0 hi, 1.1 si, 0.0 st
MiB Mem : 40066.4 total, 8853.4 free, 8710.9 used, 22502.1 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30700.1 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
141 root 20 0 238924 8976 5740 S 106.7 0.0 0:05.00 python3
1 root 20 0 2792 1524 1428 S 0.0 0.0 0:00.03 sleep
60 root 20 0 0 0 0 Z 0.0 0.0 0:00.00 sleep
119 root 30 10 0 0 0 Z 0.0 0.0 0:00.00 sleep
124 root 20 0 4364 3232 2960 S 0.0 0.0 0:00.03 bash
一个与 -p 不对称的实测细节:-u 只过滤进程区,头部 Tasks 行仍统计全系统。用当下已无任何进程的 tester 账户验证——进程区为空,Tasks 行却是全系统口径的 12 total:
$ top -b -n 1 -u tester | head -8
top - 10:39:11 up 4:22, 4 users, load average: 0.54, 0.76, 1.05
Tasks: 12 total, 1 running, 8 sleeping, 0 stopped, 3 zombie
%Cpu(s): 9.5 us, 1.1 sy, 0.0 ni, 88.8 id, 0.0 wa, 0.0 hi, 0.6 si, 0.0 st
MiB Mem : 40066.4 total, 9041.6 free, 8503.8 used, 22521.1 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30907.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3.6 -i 忽略空闲进程
-i 隐藏"当下没有消耗 CPU"的进程(睡眠态、以及 0% 占用的进程一律不显示,top 自身也会被隐藏)。行数对比直观:全量 16 行 → 只剩 8 行,进程区仅剩忙等的 python3:
$ top -b -n 1 | wc -l
16
$ top -b -n 1 -i | wc -l
8
$ top -b -n 1 -i | head -10
top - 10:34:47 up 4:18, 4 users, load average: 0.75, 1.12, 1.24
Tasks: 9 total, 1 running, 6 sleeping, 0 stopped, 2 zombie
%Cpu(s): 8.8 us, 0.5 sy, 0.0 ni, 87.9 id, 0.5 wa, 0.0 hi, 2.2 si, 0.0 st
MiB Mem : 40066.4 total, 8853.4 free, 8710.9 used, 22502.1 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30700.1 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
141 root 20 0 238924 8976 5740 S 106.7 0.0 0:05.49 python3
排障场景下 -i 相当于自动"只看吃 CPU 的家伙";但它也会隐藏睡眠中的服务进程,巡检清单类用途慎用。
3.7 -H 线程视图
-H 把每个线程作为独立一行展示:头部 Tasks 行变为 Threads: 计数,PID 列显示的是线程 ID(TID)。对演示进程 141(主线程 + 3 个工作线程):
$ top -b -n 1 -H -p 141 | head -14
top - 10:34:47 up 4:18, 4 users, load average: 0.75, 1.12, 1.24
Threads: 4 total, 1 running, 3 sleeping, 0 stopped, 0 zombie
%Cpu(s): 9.4 us, 0.6 sy, 0.0 ni, 89.4 id, 0.0 wa, 0.0 hi, 0.6 si, 0.0 st
MiB Mem : 40066.4 total, 8853.5 free, 8710.8 used, 22502.1 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30700.1 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
144 root 20 0 238924 8976 5740 S 53.3 0.0 0:01.66 python3
145 root 20 0 238924 8976 5740 R 33.3 0.0 0:02.07 python3
143 root 20 0 238924 8976 5740 S 13.3 0.0 0:01.88 python3
141 root 20 0 238924 8976 5740 S 0.0 0.0 0:00.01 python3
解读:4 行 TID(144、145、143、141)同属进程 141,VIRT/RES/SHR 三列完全相同(线程共享进程地址空间);各线程 %CPU 之和 ≈ 进程总 %CPU(53.3 + 33.3 + 13.3 + 0 ≈ 100,GIL 之下 3 个忙等线程分抢同一核);TIME+ 按线程分别累计。与 ps 篇 3.7 节 ps -Lo pid,lwp,nlwp,... 的 LWP 一一对应,可交叉验证线程级热点。
3.8 -c 显示完整命令行
默认 COMMAND 列只显示命令名,同名进程(如多个 java、多个 python3)无法区分。-c 展开为完整命令行;批处理模式默认宽度 80 列,超长部分以 + 结尾截断:
$ top -b -n 1 -c | head -12
top - 10:34:47 up 4:18, 4 users, load average: 0.75, 1.12, 1.24
Tasks: 9 total, 1 running, 6 sleeping, 0 stopped, 2 zombie
%Cpu(s): 9.3 us, 0.5 sy, 0.0 ni, 87.4 id, 0.0 wa, 0.0 hi, 2.7 si, 0.0 st
MiB Mem : 40066.4 total, 8853.5 free, 8710.8 used, 22502.1 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30700.1 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
141 root 20 0 238924 8976 5740 S 100.0 0.0 0:05.80 python3+
1 root 20 0 2792 1524 1428 S 0.0 0.0 0:00.03 sleep i+
60 root 20 0 0 0 0 Z 0.0 0.0 0:00.00 [sleep]+
119 root 30 10 0 0 0 Z 0.0 0.0 0:00.00 [sleep]+
124 root 20 0 4364 3232 2960 S 0.0 0.0 0:00.03 bash /r+
3.9 -w 指定输出宽度(防截断)
-w 200 把输出宽度放宽到 200 列,配合 -c 即可看到不截断的完整命令行:
$ top -b -n 1 -c -w 200 | head -12
top - 10:34:47 up 4:18, 4 users, load average: 0.75, 1.12, 1.24
Tasks: 9 total, 1 running, 6 sleeping, 0 stopped, 2 zombie
%Cpu(s): 9.3 us, 0.5 sy, 0.0 ni, 88.0 id, 0.0 wa, 0.0 hi, 2.2 si, 0.0 st
MiB Mem : 40066.4 total, 8853.5 free, 8710.8 used, 22502.1 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30700.1 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
141 root 20 0 238924 8976 5740 S 100.0 0.0 0:05.95 python3 /root/demo/top/mt.py
1 root 20 0 2792 1524 1428 S 0.0 0.0 0:00.03 sleep infinity
60 root 20 0 0 0 0 Z 0.0 0.0 0:00.00 [sleep] <defunct>
119 root 30 10 0 0 0 Z 0.0 0.0 0:00.00 [sleep] <defunct>
124 root 20 0 4364 3232 2960 S 0.0 0.0 0:00.03 bash /root/top-test.sh
与 3.8 节对照:python3+ → python3 /root/demo/top/mt.py,bash /r+ → bash /root/top-test.sh。落盘归档批处理输出时,-c -w 几乎是必配组合。
3.10 -1 逐核展开 CPU 汇总
-1 把合计的 %Cpu(s) 一行拆成每个逻辑核一行(交互界面按 1 键等效)。实测(head -20 截取,本机核编号为 0,2,4,6,8,10——该瞬间 /proc/stat 在线的 6 个核,偶数编号是宿主核拓扑的正常呈现;随后核实测 /proc/cpuinfo 与 /proc/stat 均为 12,说明在线核数会随宿主调度变化,以采样瞬间为准):
$ top -b -n 1 -1 | head -20
top - 10:34:48 up 4:18, 4 users, load average: 0.69, 1.10, 1.23
Tasks: 9 total, 1 running, 6 sleeping, 0 stopped, 2 zombie
%Cpu0 : 5.9 us, 0.0 sy, 0.0 ni, 82.4 id, 0.0 wa, 0.0 hi, 11.8 si, 0.0 st
%Cpu2 : 6.7 us, 0.0 sy, 0.0 ni, 93.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu4 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu6 : 26.7 us, 0.0 sy, 0.0 ni, 73.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu8 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu10 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 40066.4 total, 8825.9 free, 8738.4 used, 22502.1 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30672.6 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
141 root 20 0 238924 8976 5740 S 100.0 0.0 0:06.44 python3
1 root 20 0 2792 1524 1428 S 0.0 0.0 0:00.03 sleep
60 root 20 0 0 0 0 Z 0.0 0.0 0:00.00 sleep
119 root 30 10 0 0 0 Z 0.0 0.0 0:00.00 sleep
124 root 20 0 4364 3232 2960 S 0.0 0.0 0:00.03 bash
139 root 20 0 2792 1528 1436 S 0.0 0.0 0:00.00 sleep
140 root 20 0 2792 1664 1576 S 0.0 0.0 0:00.00 sleep
175 root 20 0 7192 3380 2880 R 0.0 0.0 0:00.00 top
逐核视角的价值:%Cpu6 的 26.7 us 是忙等 python3 被调度到的核,其余核近乎全闲——"单核打满、多核闲置"正是单线程/受 GIL 限制应用的典型画像。
3.11 -o 指定排序字段与 -O 列出全部可排字段
-o 指定排序字段。按内存排(%MEM 降序):
$ top -b -n 1 -o %MEM | head -10
top - 10:34:48 up 4:18, 4 users, load average: 0.69, 1.10, 1.23
Tasks: 9 total, 1 running, 6 sleeping, 0 stopped, 2 zombie
%Cpu(s): 13.3 us, 0.6 sy, 0.0 ni, 84.5 id, 0.0 wa, 0.0 hi, 1.7 si, 0.0 st
MiB Mem : 40066.4 total, 8853.5 free, 8710.8 used, 22502.1 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30700.1 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
141 root 20 0 238924 8976 5740 S 100.0 0.0 0:06.11 python3
170 root 20 0 7192 3440 2936 R 0.0 0.0 0:00.00 top
124 root 20 0 4364 3232 2960 S 0.0 0.0 0:00.03 bash
按 PID 排——注意默认为降序(173、172、141 从大到小):
$ top -b -n 1 -o PID | head -10
top - 10:34:48 up 4:18, 4 users, load average: 0.69, 1.10, 1.23
Tasks: 9 total, 1 running, 6 sleeping, 0 stopped, 2 zombie
%Cpu(s): 14.8 us, 2.2 sy, 0.0 ni, 80.9 id, 0.0 wa, 0.0 hi, 2.2 si, 0.0 st
MiB Mem : 40066.4 total, 8849.3 free, 8715.0 used, 22502.1 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30696.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
173 root 20 0 2804 1572 1472 S 0.0 0.0 0:00.00 head
172 root 20 0 7192 3424 2924 R 0.0 0.0 0:00.00 top
141 root 20 0 238924 8976 5740 S 106.7 0.0 0:06.28 python3
-O(大写)列出全部可作排序键的字段名后退出,共 50 余个,以下为其中与本文相关的常用部分(完整清单以 man top 为准):
$ top -b -n 1 -O
PID
PPID
UID
USER
RUID
RUSER
SUID
SUSER
GID
GROUP
PGRP
TTY
TPGID
SID
PR
NI
nTH
P
%CPU
TIME
TIME+
%MEM
VIRT
SWAP
RES
CODE
DATA
SHR
nMaj
nMin
nDRT
S
COMMAND
WCHAN
💡 说明:其中 nTH(线程数)、nMaj/nMin(缺页计数)、WCHAN(内核等待点)、CODE/DATA(内存细分)都是进阶排障的好字段;交互界面里的
M(内存排序)、P(CPU 排序)键即在这批字段间切换,等效于批处理下的默认排序与-o %MEM。
3.12 报错行为与边界
-p 指向不存在的 PID:不报错,头部照常输出而进程区为空(Tasks: 0 total),rc=0:
$ top -b -n 1 -p 999999 | head -10; echo rc=$?
top - 10:34:48 up 4:18, 4 users, load average: 0.69, 1.10, 1.23
Tasks: 0 total, 0 running, 0 sleeping, 0 stopped, 0 zombie
%Cpu(s): 14.9 us, 1.7 sy, 0.0 ni, 81.8 id, 0.0 wa, 0.0 hi, 1.7 si, 0.0 st
MiB Mem : 40066.4 total, 8839.6 free, 8724.7 used, 22502.1 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30686.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
rc=0
-o 指定不存在的字段:直接报错退出,rc=1:
$ top -b -n 1 -o BOGUS; echo rc=$?
top: unrecognized field name 'BOGUS'
rc=1
实测结束后的清理(杀掉演示进程并回收,避免遗留僵尸):
$ kill 139 140 141 2>/dev/null; wait 139 140 141 2>/dev/null; echo cleaned
cleaned
四、实战示例
以下组合命令均在同一环境实测通过(独立演示会话,PID 与第三章不同属正常)。
4.1 top 快照 + ps 精确取数,交叉定位 CPU 大户
top 负责全局态势,ps 负责精确数值(ps 的 %CPU 是启动以来的平均值,top 是瞬时值,两者相互印证):
$ top -b -n 1 | head -9
top - 10:39:09 up 4:22, 4 users, load average: 0.54, 0.76, 1.05
Tasks: 12 total, 1 running, 8 sleeping, 0 stopped, 3 zombie
%Cpu(s): 10.0 us, 1.1 sy, 0.0 ni, 87.8 id, 0.0 wa, 0.0 hi, 1.1 si, 0.0 st
MiB Mem : 40066.4 total, 9101.5 free, 8443.9 used, 22521.0 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30967.1 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
254 root 20 0 238924 9092 5856 S 106.7 0.0 0:02.18 python3
1 root 20 0 2792 1524 1428 S 0.0 0.0 0:00.03 sleep
$ ps -eo pid,comm,%cpu --sort=-%cpu | head -4
PID COMMAND %CPU
254 python3 109
248 bash 1.0
1 sleep 0.0
4.2 盯守单个可疑进程(-p + -c + -d 2 + -n 2)
先启动演示进程(PID 254),再用全参数组合盯守:完整命令行 + 2 秒间隔 + 2 个周期:
$ python3 /root/demo/top/mt.py & TP3=$!; echo TP3=$TP3; sleep 2
TP3=254
$ top -b -n 2 -d 2 -c -p $TP3 | head -16
top - 10:39:09 up 4:22, 4 users, load average: 0.54, 0.76, 1.05
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 10.5 us, 1.1 sy, 0.0 ni, 86.7 id, 0.0 wa, 0.0 hi, 1.7 si, 0.0 st
MiB Mem : 40066.4 total, 9094.8 free, 8450.6 used, 22521.0 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30960.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
254 root 20 0 238924 9092 5856 S 100.0 0.0 0:02.34 python3+
top - 10:39:11 up 4:22, 4 users, load average: 0.54, 0.76, 1.05
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 10.7 us, 2.2 sy, 0.0 ni, 85.5 id, 0.0 wa, 0.0 hi, 1.5 si, 0.0 st
MiB Mem : 40066.4 total, 9094.8 free, 8450.6 used, 22521.0 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30960.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
(第二个采样周期的进程区行因 head -16 截取未展示;单进程盯守场景下 Tasks 行收窄为 1 total,与 3.4 节一致。)此处 -c 显示的命令行仍被 80 列截断为 python3+,加上 -w 200 即可完整展开(见 3.9 节)。
4.3 组合参数巡检一行流(-c -o %MEM -w 120)
按内存排序 + 完整命令行 + 放宽到 120 列,一条命令覆盖"谁吃内存、跑的什么":
$ top -b -n 2 -d 1 -c -o %MEM -w 120 | head -22
top - 10:39:11 up 4:22, 4 users, load average: 0.54, 0.76, 1.05
Tasks: 12 total, 1 running, 8 sleeping, 0 stopped, 3 zombie
%Cpu(s): 9.9 us, 1.1 sy, 0.0 ni, 87.4 id, 0.0 wa, 0.0 hi, 1.6 si, 0.0 st
MiB Mem : 40066.4 total, 9046.2 free, 8499.1 used, 22521.1 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30911.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
254 root 20 0 238924 9092 5856 S 100.0 0.0 0:04.69 python3 /root/demo/top/mt.py
267 root 20 0 7192 3436 2928 R 0.0 0.0 0:00.00 top -b -n 2 -d 1 -c -o %MEM -w 120
248 root 20 0 4364 3336 3072 S 0.0 0.0 0:00.02 bash /root/top-y.sh
233 root 20 0 2792 1596 1504 S 0.0 0.0 0:00.00 sleep 300
225 root 20 0 2792 1568 1476 S 0.0 0.0 0:00.00 sleep 300
243 root 20 0 2792 1528 1436 S 0.0 0.0 0:00.00 sleep 300
1 root 20 0 2792 1524 1428 S 0.0 0.0 0:00.03 sleep infinity
220 root 20 0 2792 1524 1436 S 0.0 0.0 0:00.00 sleep 300
268 root 20 0 2804 1352 1256 S 0.0 0.0 0:00.00 head -22
60 root 20 0 0 0 0 Z 0.0 0.0 0:00.00 [sleep] <defunct>
119 root 30 10 0 0 0 Z 0.0 0.0 0:00.00 [sleep] <defunct>
188 root 20 0 0 0 0 Z 0.0 0.0 0:00.00 [bash] <defunct>
注意本例回显里出现了几个 sleep 300——那是其他并行会话的演示进程;-c -w 120 让每条命令行原形毕露,这正是完整命令行视图在多用户机器上的价值。清理演示进程:
$ kill 254; wait 254 2>/dev/null; echo cleaned
cleaned
4.4 线程级热点定位(-H + -p)
进程整体 %CPU 高企时,用 -H -p 下钻到线程找元凶(哪个 TID 在烧 CPU、TIME+ 最长),TID 可直接用于 gdb/trace 类工具(完整解读见 3.7 节):
$ top -b -n 1 -H -p 141 | head -14
top - 10:34:47 up 4:18, 4 users, load average: 0.75, 1.12, 1.24
Threads: 4 total, 1 running, 3 sleeping, 0 stopped, 0 zombie
%Cpu(s): 9.4 us, 0.6 sy, 0.0 ni, 89.4 id, 0.0 wa, 0.0 hi, 0.6 si, 0.0 st
MiB Mem : 40066.4 total, 8853.5 free, 8710.8 used, 22502.1 buff/cache
MiB Swap: 2048.0 total, 2042.5 free, 5.5 used. 30700.1 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
144 root 20 0 238924 8976 5740 S 53.3 0.0 0:01.66 python3
145 root 20 0 238924 8976 5740 R 33.3 0.0 0:02.07 python3
143 root 20 0 238924 8976 5740 S 13.3 0.0 0:01.88 python3
141 root 20 0 238924 8976 5740 S 0.0 0.0 0:00.01 python3
五、注意事项与常见问题
Q1:load average 很高但 CPU 很闲,是哪里出了问题?
load 把 D 态(不可中断 IO 等待)任务也计入。load 高 + %Cpu(s) 的 id 高 + wa 偏低时,优先排查存储链路(磁盘故障、网络存储卡顿),而不是扩 CPU;本机 12 核,load 持续超过 12 才代表算力过载(口径详解见 3.1 节拓展表)。
Q2:单个进程的 %CPU 怎么会超过 100%?
top 的进程区 %CPU 以单核 100% 为基准,多线程进程可超过 100%(实测 106.7%);而头部 %Cpu(s) 行是全部核心合计的百分比(8 核全闲时 id ≈ 100)。两处口径不同,不能混比。
Q3:VIRT 高达几个 GB 但 RES 很小,要处理吗? 不必。VIRT 是虚拟地址空间(含映射未触碰的内存),python3 实测 VIRT 233 MB 而 RES 仅 8.8 MB(3.2 节);内存告警看 RES 与头部 avail Mem。
Q4:进程明明在跑,TIME+ 却不涨? TIME+ 只累计 CPU 时间。睡眠等待网络/锁/定时器的进程 TIME+ 停滞是正常的(3.3 节的 sleep 进程即为实例);若一个业务进程长期 TIME+ 不涨且业务卡死,应排查其等待的资源而不是 CPU。
Q5:top 里看到僵尸进程(S 列为 Z)怎么处理?
与 ps 篇结论一致:僵尸已死亡,kill 无效,需让其父进程完成收尸或重启父进程。top 交互界面的 i 键可以临时隐藏它们(等效批处理的 -i)。
Q6:交互键位有哪些?批处理下如何等效?
本篇自动化实测走批处理模式,交互键无法脚本化捕捉,以下键位表采自 man top 与 top -h,其中标 ★ 的一行已有批处理等效实测:
| 键 | 作用 | 批处理等效 |
|---|---|---|
| P ★ | 按 %CPU 排序(默认) | 默认顺序,显式为 -o %CPU |
| M ★ | 按内存(%MEM)排序 | -o %MEM(3.11 节) |
| T | 按 TIME+ 排序 | -o TIME+ |
| 1 ★ | 逐核展开 CPU 汇总 | -1(3.10 节) |
| c ★ | 完整命令行切换 | -c(3.8 节) |
| H ★ | 线程视图切换 | -H(3.7 节) |
| i ★ | 空闲进程显示切换 | -i(3.6 节) |
| u | 按用户过滤 | -u 用户(3.5 节) |
| k | 杀进程(输入 PID 与信号) | 交互专属,无批处理等效 |
| r | renice 调整优先级 | 交互专属,无批处理等效 |
| s | 修改刷新间隔 | -d |
| R | 排序方向反转 | -o 字段 后交互反转 |
| z | 彩色显示 | 交互专属 |
| W | 保存当前配置到 ~/.toprc | 交互专属 |
| h | 内置帮助 / q 退出 | 交互专属 |
Q7:为什么 -p 会把 Tasks 行收窄,-u 不会?
实测对照:-p 139 -p 140 时 Tasks 行为 2 total(3.4 节),而 -u tester(该用户无进程)时 Tasks 行仍为全系统的 12 total(3.5 节)。top 对 -p 的统计范围跟随监控集,对 -u 只过滤进程区——读取 Tasks 行数据做监控告警时务必注意这一差异。
Q8:top 和 htop 怎么选?
本机未安装 htop(command -v htop 返回 rc=1,无法实测),以下对比基于两者公开文档,仅供参考:
| 维度 | top | htop |
|---|---|---|
| 发行版自带 | 是(procps-ng) | 否,需额外安装 |
| 脚本化 | 强(-b 批处理是巡检标准) | 弱(面向交互) |
| 交互体验 | 键位传统、界面朴素 | 彩色、鼠标支持、树状视图更直观 |
| 资源占用 | 极低 | 低 |
运维脚本与自动化场景首选 top;人工现场排障两者皆可。
Q9:top 与 ps 的分工? 同属 procps-ng、字段口径一致,定位互补:
| 维度 | top | ps |
|---|---|---|
| 数据形态 | 周期刷新的实时窗口 | 一次性快照 |
| 强项 | 看趋势、交互排序、盯单进程变化 | 精确取数、自定义列、管道与脚本 |
| %CPU 口径 | 采样窗口内瞬时值 | 进程存活期平均值 |
| 典型用法 | top -b -n 1 巡检、-p 盯守 | ps -eo ... --sort=-%cpu 排行榜 |
Q10:批处理输出的命令行被 + 截断怎么办?
批处理默认 80 列宽度,加 -w 200(或更大)并配合 -c,即可完整输出命令行(3.8 与 3.9 节对照实测)。落盘归档时建议两者必配。
六、参考链接
- top(1) 手册(man7.org,交互键位与字段权威来源):https://man7.org/linux/man-pages/man1/top.1.html
- Ubuntu 22.04 (jammy) top 在线手册页:https://manpages.ubuntu.com/manpages/jammy/en/man1/top.1.html
- procps-ng 源码仓库:https://gitlab.com/procps-ng/procps
- uptime/load average 背景:https://man7.org/linux/man-pages/man1/uptime.1.html
- 同系列实操篇:《ps 命令详解与参数实测(Ubuntu 22.04)》