> For the complete documentation index, see [llms.txt](https://man.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://man.bsdcn.org/man1/top.1.md).

# top(1)

`top` — 显示并更新顶层 CPU 进程的信息

## 名称

`top`

## 概要

`top [-abCHIijnPqSTtuvwz] [-d count] [-J jail] [-m cpu | io] [-o field] [-p pid] [-s time] [-U username] [number]`

## 描述

`top` 显示系统中排名靠前的进程，并周期性更新此信息。如果标准输出是智能终端（见下文），默认显示终端屏幕上能容纳的尽可能多的进程。否则，显示较多进程（约 20 个）。使用原始 CPU 百分比对进程排序。如果指定了 `number`，则显示前 `number` 个进程，而非默认数量。

`top` 区分支持高级功能与不支持高级功能的终端。这种区分会影响某些选项默认值的选择。本文档余下部分中，“智能”终端指支持光标寻址、清屏以及清除到行尾的终端。反之，“哑”终端指不支持这些功能的终端。如果 `top` 的输出被重定向到文件，其行为如同在哑终端上运行。

选项如下：

**`-a`** 显示从 argv\[] 向量派生的命令名，而非真实可执行文件名。当你想要监视将状态信息放入其中的应用程序时，此选项很有用。如果真实名称与 argv\[0] 不同，将以括号显示。命令行中的不可打印字符以 C 风格反斜杠序列或三位八进制序列编码。

**`-b`** 使用“batch”（批处理）模式。此模式下，来自终端的所有输入都被忽略。中断字符（如 `^C` 和 `^\`）仍然有效。此为哑终端或输出非终端时的默认模式。

**`-C`** 切换 CPU 显示模式。默认情况下，top 在 WCPU 列中显示加权 CPU 百分比（与 [ps(1)](/man1/ps.1.md) 显示为 CPU 的值相同）。每次传递 `-C` 标志时，在“raw cpu”（原始 CPU）模式与“weighted cpu”（加权 CPU）模式之间切换，分别显示“CPU”列或“WCPU”列。

**`-d`** `count` 仅显示 `count` 次后退出。一次显示被视为屏幕的一次更新。哑终端的默认值为 1。注意，当 `count` = 1 时，无法获取 CPU 在每种状态下所花费时间的百分比信息。

**`-H`** 对多线程进程，单独显示每个线程。默认情况下，每个进程显示一行摘要。

**`-I`** 不显示空闲进程。默认情况下，top 同时显示活动进程和空闲进程。

**`-i`** 使用“interactive”（交互）模式。此模式下，任何输入都会立即被读取处理。关于各键执行何种功能，参见“交互模式”一节的说明。命令处理完成后，屏幕会立即更新，即使命令未被理解也是如此。当标准输出为智能终端时，此模式为默认模式。

**`-J`** `jail` 仅显示属于 `jail` 的进程。可以是 jail 的 `jid` 或 `name`。使用 0 限定为主机进程。使用此选项隐含 `-j`。

**`-j`** 显示 [jail(8)](/man8/jail.8.md) ID。

**`-m`** `mode` 以指定 `mode` 显示统计信息。可用模式为 `cpu` 和 `io`。默认为 `cpu`。

**`-n`** 使用“non-interactive”（非交互）模式。等同于“batch”模式。

**`-o`** `field` 按指定字段对进程显示区域排序。字段名为输出中显示的列名，但使用小写：“cpu”、“size”、“res”、“time”、“pri”、“threads”、“total”、“read”、“write”、“fault”、“vcsw”、“ivcsw”、“jid”、“swap”或“pid”。

**`-P`** 显示每个 CPU 的 CPU 使用统计。

**`-p`** `pid` 仅显示进程 `pid`。

**`-q`** 将 `top` 的 nice 值重设为 -20，使其运行更快。当系统非常迟缓时，可用于提高发现问题的可能性。此选项仅能由 root 使用。

**`-S`** 在显示中显示系统进程。通常，pager 和 swapper 等系统进程不予显示。此选项使其可见。

**`-s`** `time` 将屏幕更新间隔设为 `time` 秒，可以为小数。默认更新间隔为 2 秒。

**`-T`** 切换显示线程 ID（tid）而非进程 ID（pid）。

**`-t`** 不显示 `top` 进程自身。

**`-U`** `username` 仅显示属于 `username` 的进程。此选项目前仅接受用户名，不理解 uid 数字。

**`-u`** 不将 uid 数字映射为用户名。通常，`top` 会读取 **/etc/passwd** 文件中所需的部分，将其遇到的所有用户 ID 数字映射为登录名。此选项禁用上述行为，同时可能减少执行时间。显示 uid 数字而非用户名。

**`-v`** 将版本号信息写入 stderr 后立即退出。

**`-w`** 显示每个进程的大致 swap 使用量。

**`-z`** 不显示系统空闲进程。

`count` 和 `number` 字段均可指定为“infinite”（无限），表示可以尽可能延伸。通过使用关键字“infinity”、“maximum”或“all”的任意适当前缀实现。布尔标志为开关型。第二次指定这些选项中的任何一个都会否定第一次的设置。

## 交互模式

当 `top` 运行于“交互模式”时，它从终端读取命令并据此执行。此模式下，终端被置于“CBREAK”模式，使得字符在键入后立即处理。通常，按键发生在 `top` 两次显示之间，即在等待 `time` 秒流逝时。此时，命令将被处理，显示随后立即更新（反映命令可能指定的任何更改）。即使命令不正确也会如此。如果在 `top` 更新显示期间按键，它会完成更新后再处理命令。某些命令需要额外信息，会相应提示用户。输入此类信息时，用户的 erase 和 kill 键（由 stty(1) 命令设置）会被识别，换行符终止输入。

按键绑定如下：

**`space`** 更新显示。

**`/`** 按命令名过滤。提示输入 `string` 或 `+` 以显示所有进程。

**`a`** 切换进程标题的显示。

**`C`** 切换显示原始或加权 CPU 百分比。

**`d`** 更改退出前剩余显示次数。提示输入新数值。

**`e`** 显示上一条命令生成的系统错误列表（如果有）。

**`H`** 切换线程的显示。

**`h`** 或 **`?`** 显示命令摘要（帮助屏幕）和版本信息。

**`i`** 或 **`I`** 切换空闲进程的显示。

**`J`** 按特定 jail 过滤进程。提示输入 jail 名或 `+` 以显示属于所有 jail 和主机的全部进程。同时启用 JID 显示。

**`j`** 切换 [jail(8)](/man8/jail.8.md) ID 的显示。

**`k`** 向进程列表发送信号（默认为 SIGKILL）。此操作类似于 [kill(1)](/man1/kill.1.md) 命令。

**`m`** 在“cpu”和“io”模式之间切换显示。

**`n`** 或 **`#`** 更改显示的进程数量。提示输入新数值。

**`o`** 更改显示的排序顺序。排序键名包括“cpu”、“res”、“size”和“time”。默认为 cpu。

**`P`** 切换每个 CPU 统计的显示。

**`p`** 按精确进程 ID 过滤。提示输入 `PID` 或 `+` 以显示所有进程。

**`q`** 退出 `top`。

**`r`** 更改进程列表的优先级（即“nice”值）。此操作类似于 [renice(8)](/man8/renice.8.md)。

**`S`** 切换系统进程的显示。

**`s`** 更改两次显示之间的延迟秒数。提示输入新数值。

**`T`** 在线程 ID 和进程 ID 之间切换显示。

**`t`** 切换 `top` 进程的显示。

**`u`** 按精确进程所有者用户名过滤。提示输入 `username` 或 `-`/`+` 以显示所有用户。通过在用户名前加 `+` 和 `-` 可分别向集合添加或从中移除用户名。

**`w`** 切换 swap 使用量的显示。

**`z`** 切换系统空闲进程的显示。

## 显示内容

显示顶部几行展示系统状态的概要信息，包括分配给进程的最后一个进程 ID（在大多数系统上）、三个负载平均值、当前时间、现有进程数量、每种状态（睡眠、运行、启动、僵尸和停止）的进程数量，以及每种处理器状态（用户、nice、系统和空闲）所花费时间的百分比。还包括物理和虚拟内存分配信息。

屏幕其余部分显示各进程的信息。此显示类似于 [ps(1)](/man1/ps.1.md)，但不完全相同。PID 为进程 ID；JID（显示时）为对应进程的 [jail(8)](/man8/jail.8.md) ID；USERNAME 为进程所有者的名称（如果指定了 `-u`，UID 列将替代 USERNAME）；THR 为线程计数，显示进程拥有的线程数；PRI 为进程的当前优先级；NICE 为 [nice(1)](/man1/nice.1.md) 值；SIZE 为进程的总大小（文本、数据和栈）；RES 为当前驻留内存量；SWAP 为启用时的大致 swap 量（SIZE、RES 和 SWAP 以千字节为单位）；STATE 为当前状态（“START”、“RUN”（在 SMP 系统上显示为“CPUn”）、“SLEEP”、“STOP”、“ZOMB”、“WAIT”、“LOCK”之一，或进程所等待的事件）；C 为进程正在其上执行的处理器编号（仅在 SMP 系统上可见）；TIME 为进程已使用的系统和用户 CPU 秒数；WCPU（显示时）为加权 CPU 百分比（与 [ps(1)](/man1/ps.1.md) 显示为 CPU 的值相同）；CPU 为原始百分比，是用于排序确定进程顺序的字段；COMMAND 为进程当前运行的命令名（如果进程被换出，此列标记为“”）。

如果进程处于“SLEEP”或“LOCK”状态，状态列将报告进程所等待的事件或锁的名称。锁名以星号 **`*`** 为前缀，而睡眠事件则不加前缀。

## 内存说明

```sh
Mem: 61M Active, 86M Inact, 368K Laundry, 22G Wired, 102G Free
ARC: 15G Total, 9303M MFU, 6155M MRU, 1464K Anon, 98M Header, 35M Other
     15G Compressed, 27G Uncompressed, 1.75:1 Ratio, 174M Overhead
Swap: 4096M Total, 532M Free, 13% Inuse, 80K In, 104K Out
```

### 物理内存统计

**Active** 活动字节数

**Inact** 非活动干净字节数

**Laundry** 排队等待清洗的脏字节数

**Wired** 固定字节数，包括 IO 级缓存的文件数据页

**Buf** 用于 IO 级磁盘缓存的字节数

**Free** 空闲字节数

### ZFS ARC 统计

这些统计仅在 ARC 使用时显示。

**Total** 用于 ZFS ARC 的固定字节数

**MRU** 持有最近使用数据的 ARC 字节数

**MFU** 持有最频繁使用数据的 ARC 字节数

**Anon** 持有传输中数据的 ARC 字节数

**Header** 持有头部的 ARC 字节数

**Other** 杂项 ARC 字节

**Compressed** ARC 缓存使用的内存字节数

**Uncompressed** 压缩前存储在 ARC 缓存中的数据字节数

**Ratio** ARC 中缓存数据的压缩比

### 交换空间统计

**Total** 总可用 swap 使用量

**Free** 总空闲 swap 使用量

**Inuse** swap 使用量

**In** 从 swap 设备换入的字节数（上一间隔）

**Out** 换出到 swap 设备的字节数（上一间隔）

## 环境变量

**`TOP`** `top` 的默认参数集。

**`LC_CTYPE`** 指定 `-a` 标志时显示 `argv` 向量所使用的区域设置。

## 参见

[kill(1)](/man1/kill.1.md), [ps(1)](/man1/ps.1.md), stty(1), getrusage(2), humanize\_number(3), [mem(4)](/man4/mem.4.md), [renice(8)](/man8/renice.8.md)

## 历史

`top` 首次出现于 FreeBSD 2.2.2。

## 作者

William LeFebvre, EECS Department, Northwestern University

## 缺陷

被换出进程的命令名应能追踪，但这会使程序运行更慢。

与 [ps(1)](/man1/ps.1.md) 一样，`top` 在为更新收集信息时情况可能发生变化。它给出的画面只是对现实的近似。
