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) 口径、线程视图与交互键位表,全部命令与回显真实可复现。

Linux命令Linux系统UbuntuUbuntu 22.04命令行进程管理2026/10/15

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等待 IO0.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进程 ID141 为演示 python3
USER生效用户root
PR内核优先级视图普通进程 = 20 + NI;119 号 NI=10 → PR=30;实时进程显示 rt
NInice 值(-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 与信号)交互专属,无批处理等效
rrenice 调整优先级交互专属,无批处理等效
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,无法实测),以下对比基于两者公开文档,仅供参考:

维度tophtop
发行版自带是(procps-ng)否,需额外安装
脚本化强(-b 批处理是巡检标准)弱(面向交互)
交互体验键位传统、界面朴素彩色、鼠标支持、树状视图更直观
资源占用极低低

运维脚本与自动化场景首选 top;人工现场排障两者皆可。

Q9:top 与 ps 的分工? 同属 procps-ng、字段口径一致,定位互补:

维度topps
数据形态周期刷新的实时窗口一次性快照
强项看趋势、交互排序、盯单进程变化精确取数、自定义列、管道与脚本
%CPU 口径采样窗口内瞬时值进程存活期平均值
典型用法top -b -n 1 巡检、-p 盯守ps -eo ... --sort=-%cpu 排行榜

Q10:批处理输出的命令行被 + 截断怎么办? 批处理默认 80 列宽度,加 -w 200(或更大)并配合 -c,即可完整输出命令行(3.8 与 3.9 节对照实测)。落盘归档时建议两者必配。

六、参考链接