TOP(1) General Commands Manual TOP(1)

名称

top - 显示 Linux 进程

概述

top [选项 ...]

描述

top 程序用于查看系统的动态的、实时的运行状态。它可以显示 系统 概览信息以及当前由 Linux 内核管理的 进程线程 列表。系统概览信息的类型和显示的进程信息的类型、顺序和大小都是用户可配置的,并且该配置可以在重新启动程序后保持不变。

本程序为进程操作提供了有限的交互界面,并为个人配置提供了功能更广泛的界面  --  涵盖了其操作的各个方面。虽然本文档中使用的名字是 top,但是您可以随意给本程序起一个新的名称。这个新名称(可能是别名)将显示在 top 的显示区域,并将在读取和写入配置文件时使用。

综述

文档

剩余部分的目录

    综述
       操作
       Linux 内存类型
    1. 命令行选项
    2. 概览显示
       a. 上线时间和平均负载
       b. 任务和 CPU 状态
       c. 内存使用量
    3. 字段 / 列显示
       a. 字段描述
       b. 管理字段
    4. 交互式命令
       a. 全局命令
       b. 概览区命令
       c. 任务区命令
          1. 外观
          2. 内容
          3. 大小
          4. 排序
       d. 底部窗口命令
       e. 颜色映射
    5. 备用显示功能
       a. 窗口综述
       b. 窗口命令
       c. 滚动窗口
       d. 在窗口中查找
       e. 在窗口中筛选
    6. 文件
       a. 个人配置文件
       b. 添加检视条目
       c. 系统配置文件
       d. 系统限制文件
    7. 环境变量
    8. 傻瓜技巧集锦
       a. 内核魔术
       b. 跳动窗口
       c. 大鸟窗口
       d. 峰回路转
    9. 错误, 10. 参见

操作

操作 top 时,最重要的两个键是帮助 (h 或 ?) 键和退出 ("q") 键。或者,完成工作后您可以简单地使用传统的中断键 (^C)。

第一次启动时,您将在 top 主屏幕上看到这些传统元素:1) 概览区;2) 字段/列标题行;3) 任务区。各个部分都将在接下来的章节中进行探讨。概览区和列标题行之间还有一个输入/消息行,该行无需进一步解释。

top 的主屏幕 通常 非常适应 X-Windows 下终端尺寸的变化。其他 top 屏幕可能不太适应,特别是那些带有静态文本的屏幕。然而,这最终取决于您具体使用的窗口管理器和终端模拟器。有时它们对终端大小和当前内容的结论可能与 top 的结论不同,后者始终基于操作系统调用返回的结果。

在任何调整大小操作之后,如果 top 屏幕损坏、显示不完整或混乱,只需键入标点符号或光标移动键等无害的内容,通常就能恢复。在极端情况下,以下序列几乎肯定能恢复:

       键/命令  目标 
       ^Z       挂起 top
       fg       恢复 top
       <左>     强制 重新绘制 屏幕(如有需要)

但如果显示仍然有问题,您还可以尝试加一个步骤。将此命令插入到 top 挂起之后、恢复之前。

       键/命令  目标 
       reset    恢复您的 终端设置

附注:top 的显示宽度的限制是 512 个位置。显示所有字段需要大约 250 个字符。剩余屏幕宽度通常分配给当前可见的所有可变宽度列。可变宽度列,例如 "命令 (COMMAND)" 列,在主题 3a. 字段描述 中进行了说明。实际输出宽度也可能受到 -w 选项的影响,这在主题 1. 命令行选项 中进行了讨论。

最后,top 的一些屏幕或功能需要使用光标移动键,例如标准方向键加上 Home、End、PgUp 和 PgDn 键。如果您的终端或模拟器不提供这些键,则可以使用以下组合键作为替代方案:

       键       等价的键 
       左       alt + h 
       下       alt + j 
       上       alt + k 
       右       alt + l 
       Home     alt + ctrl + h 
       PgDn     alt + ctrl + j 
       PgUp     alt + ctrl + k 
       End      alt + ctrl + l 

方向键在程序提示输入一行内容,并按 <Enter> 键结束时,具有特殊的含义。这些键或其别名可用于检索以前的输入行,然后可以对其进行编辑和重新输入。还有四个键可以用于行输入。

       键       特殊含义 
       上       调出 更旧的 字符串进行重新编辑
       下       调出 更新的 字符串或者 清除 整行
       Insert   在 插入覆盖 模式间切换
       Delete   删除 光标处的字符,其他字符左移
       Home     跳到输入行的 开头
       End      跳到输入行的 末尾

就我们的目的而言,内存分为三种类型,其中一种是可选的。第一种是物理内存,一种有限的资源,代码和数据被执行或引用时必须位于其中。接下来是可选的交换文件,可以在对物理内存的需求过高时保存已修改的(脏的)内存,并在稍后取回。最后我们有虚拟内存,一种近乎无限的资源,服务于以下目标:

   1. 抽象,不受物理内存地址的束缚和大小的限制
   2. 隔离,每个进程都在独立的地址空间
   3. 共享,单一的映射可满足多个需求
   4. 灵活,可以为文件分配虚拟地址

无论内存属于哪种类型,所有内存都以页(通常为 4096 字节)的形式进行管理,但在 top 中默认以 KiB (kibibyte) 为单位表示。主题 "2c. 内存使用量" 中讨论的内存指的是整个系统的物理内存和交换文件。主题 "3. 字段 / 列显示" 中讨论的内存包含所有三种内存类型,但是是针对单独的进程。

对于每个这样的进程,每个内存页都属于下表中的一个象限。物理内存和虚拟内存可以包括四个中的任何一个,而交换文件只包括 #1 到 #3。象限 #4 中的内存在修改后,是它自己的专用交换文件。

                                 私有 | 共享
                          1           |          2
     匿名       . 栈                  |
                . malloc()            |
                . brk()/sbrk()        | . POSIX shm*
                . mmap(私有, 匿名)    | . mmap(共享, 匿名)
               -----------------------+----------------------
                . mmap(私有, fd)      | . mmap(共享, fd)
   基于文件     . 程序/共享库         |
                          3           |          4

以下内容可能有助于解释进程级别的各种内存值,它们可以显示为可调节单位的字段,并在主题 "3a. 字段描述" 中进行了讨论。

   %MEM - 就是 "驻留" 除以总物理内存
   代码 - (CODE) 象限 3 的 "程序" 部分
   数据 - (DATA) "虚拟" 的象限 1 的全部,加上
          象限 3 中的显式的基于文件的 mmap 页
   驻留 -  (RES) 所有占据物理内存的东西,从
          Linux-4.5 开始,是以下三个字段的和:
          RSan - 象限 1 的页面,包括所有曾经属于象限 3 但被修改的页面
          RSfd - 象限 3 和象限 4 的页面
          RSsh - 象限 2 的页面
   RSlk - "驻留" 的子集,是其中不可换出的部分(任何象限)
   共享 -  (SHR) "驻留" 的子集(不包括 1,包括 24 的全部,
          和 3 的一部分)
   交换 - (SWAP) 可能是除 4 之外的任何象限
   已用 - (USED) 就是 "驻留" 和 "交换" 的和
   虚拟 - (VIRT) 所有正在使用的和/或被保留的内存(所有象限)

附注:虽然程序映像和共享库被认为是进程的 私有 内存,但内核会将它们计入 共享 (SHR)。

长选项的必选 参数 对于短选项也是必选的。

虽然不是必需的,但两种形式的选项都可以使用等号,并且允许在 "=" 之前和/或之后使用空格。

使用编译时的默认值运行 top,忽略除 /etc/toprc 之外的所有配置文件。指定此选项时,它必须是命令行里唯一的选项。
以批处理模式启动 top,这在需要将 top 的输出发送到其他程序或发送到文件时很有用。在此模式下,top 不会接受输入,并将持续运行,直到达到您使用 "-n" 命令行选项设置的迭代限制,或被杀死。
启动 top 并将上次记住的 "c" 状态反转。因此,如果 top 上次显示命令行,则这次显示程序名称,反之亦然。参见交互式命令 "c" 以获取更多信息。
指定屏幕更新之间的延迟,并覆盖个人配置文件或启动时的默认值中的相应值。之后可以使用交互式命令 "d" 或 "s" 进行更改。

秒数允许使用小数,但不允许使用负数。然而,在所有情况下,如果 top 在安全模式下运行,则禁止此类更改,root 除外(除非使用了 "s" 命令行选项)。有关安全模式的其他信息,参见主题 6d. 系统限制文件。

指示 top 将概览区的内存单位强制设定为:
   k - kibibytes
   m - mebibytes
   g - gibibytes
   t - tebibytes
   p - pebibytes
   e - exbibytes

之后可以使用切换命令 "E" 更改。

指示 top 将任务区的内存单位强制设定为:
   k - kibibytes
   m - mebibytes
   g - gibibytes
   t - tebibytes
   p - pebibytes

之后可以使用切换命令 "e" 更改。

指示 top 显示各个线程。如果没有这个命令行选项,则会显示每个进程中所有线程的总和。之后可以使用交互式命令 "H" 更改。
显示用法帮助文本,然后退出。
启动 top 并将上次记住的 "i" 状态反转。当此开关为 关闭 时,自上次更新以来未使用任何 CPU 的任务将不会显示。有关此开关的其他信息参见主题 4c. 任务区命令,大小。
指定 top 在退出前执行的最大迭代次数,即生成的帧的个数。
此选项可以用作下面的 -o 选项的某种形式的帮助。它将使 top 在单独的行中分别打印每个可用的字段名称,然后退出。这些名称可以通过 NLS (National Language Support) 进行翻译。
指定对任务进行排序的字段的名称,与配置文件中存在的内容无关。您可以在字段名称前面添加 "+" 或 "-" 以覆盖排序方向。前导 "+" 将强制从高到低排序,而 "-" 将确保从低到高排序。

该选项的存在主要是为了支持自动化/脚本化的批处理模式操作。

-p1 -p2 -p3 ...)仅监视具有指定进程 ID 的进程。然而,当与线程模式 ("H") 同时使用时,也将显示每个被监视的 PID 的线程组(参见 TGID)中的所有进程。

此选项最多可以给出 20 次,或者您可以提供最多包含 20 个 pid 的以逗号分隔的列表。允许混合使用两种方法。

如果 pid 值为 0,视为当 top 程序开始运行后,top 程序本身的进程 ID。

这只是一个命令行选项而已,如果您希望返回正常操作,没有必要退出并重新启动 top  --  只需执行以下命令中的任何一个:"="、"u" 或 "U"。

命令行选项 "p"、"u" 和 "U" 互斥。

启动 top 并将上次记住的 "S" 状态反转。当累积时间模式 开启 时,每个进程列出的 CPU 时间都包括它自身和它的已死亡的子进程所使用的时间。参见交互式命令 "S" 以了解有关此模式的更多信息。
启动 top 并强制使用安全模式,即使是 root。此模式可以通过系统配置文件进行更好的控制(参见主题 6. 文件)。
仅显示用户 ID 或用户名与给定的 ID 或名称匹配的进程。此选项匹配 任意类型 的用户(即 真实有效保存文件系统 用户)。

在用户 ID 或名称前面添加感叹号 ("!") 会指示 top 仅显示用户与所指定的用户不匹配的进程。

命令行选项 "p"、"U" 和 "u" 互斥。

仅显示用户 ID 或用户名与给定的 ID 或名称匹配的进程。此选项仅匹配 有效 用户 ID。

在用户 ID 或名称前面添加感叹号 ("!") 会指示 top 仅显示用户与所指定的用户不匹配的进程。

命令行选项 "p"、"U" 和 "u" 互斥。

显示版本信息,然后退出。
在批处理模式下,当不带参数使用时,如果已设置 COLUMNS= 和 LINES= 环境变量,top 将用它们的值格式化输出。否则,宽度将固定为最大 512 列。带参数使用时,可以减少或增加输出宽度(最大 512),但行数视为无限制。

在正常显示模式下,当不带参数使用时 top 将 尝试 使用 COLUMNS= 和 LINES= 环境变量(如果已设置)来格式化输出。带参数使用时,输出宽度只能减少,而不能增加。不管是使用环境变量还是使用 -w 的参数,当 在批处理模式下时,永远不会超出实际的终端尺寸。

附注:如果不使用这个命令行选项,输出宽度将始终基于调用 top 的终端,无论是否在批处理模式下。

-1, --single-cpu-toggle
启动 top 并将上次记住的概览区中的 Cpu 状态显示反转。要么所有 CPU 信息将显示在单行中,要么每个 CPU 将单独显示,具体取决于 NUMA 节点切换命令 ("2") 的状态。

参见交互式命令 "1" 和 "2" 以了解更多信息。

以下三个区域中的每一个区域均通过一个或多个交互式命令控制。参见主题 4b. 概览区命令 了解有关这些功能的更多信息。

该部分由一行组成,其中包含:

    程序窗口 名称,取决于显示模式
    当前时间和自上次启动以来经过的时间
    用户总数
    最近 1、5 和 15 分钟的系统平均负载

该部分至少由两行组成。在 SMP 环境中,额外的行可以用来显示各个 CPU 的状态百分比。

第 1 行显示 任务线程 的总数,具体取决于线程模式切换开关的状态。该总数根据任务状态被进一步细分为:

    显示的名称      进程状态 ("S")
    ------------    --------------------
    运行中          R
    睡眠            S + 所有剩下的
    不可中断睡眠    D
    已停止          T + t
    僵尸            Z

第 2 行显示自上次刷新以来的 CPU 状态百分比。

默认情况下,显示以下各个类型的百分比。根据您的内核版本,可能不会显示 字段。

    :(us) 运行未调整 nice 值的用户进程的时间
    :(sy) 运行内核进程的时间
    ni:运行调整了 nice 值的用户进程的时间
    :(id) 在内核空闲处理函数中花费的时间
    :(wa) 等待 I/O 完成的时间
    :(hi) 处理硬件中断所花费的时间
    :(si) 处理软件中断所花费的时间
    :(st) 虚拟机管理程序从此 vm 中偷取的时间

除了第一个任务/线程行之外,还有其他 CPU 显示模式,可通过 4 路的切换命令 "t" 获得。它们显示由以下元素组成的简短概览:

               a    b     c    d
    %Cpu(s):  75.0/25.0  100[ ... ]

其中:a) 是 "用户"(用户 + ni)百分比;b) 是 "系统"(系统 + 硬中断 + 软中断 + 客户)百分比;c) 是总百分比;d) 是这些数字的两种可视化图表之一。这些图表还会单独显示 "用户" 和 "系统" 部分。

如果使用了切换命令 "4" 使得每行显示超过两个 cpu,显示将进一步被精简,a) 和 b) 元素会被删除。然而,如果颜色功能启用,这些信息仍然会反映在图表中,如果颜色功能关闭,则用竖线和方块作区分。

参见主题 4b. 概览区命令 了解关于切换命令 "t" 和 "4" 的更多信息。

该部分由两行组成,可以根据由交互式命令 "E" 强制选择的单位,以 kibibyte (KiB) 到 exbibyte (EiB) 为单位表示值。括号里的是 /proc/meminfo 源字段。

第 1 行显示物理内存,分为:

    总共           ( MemTotal )
    空闲           ( MemFree )
    已用           ( MemTotal - MemAvailable )
    缓冲/缓存      ( Buffers + Cached + SReclaimable )

第 2 行主要显示虚拟内存,分为:

    总共           ( SwapTotal )
    空闲           ( SwapFree )
    已用           ( SwapTotal - SwapFree )
    可用           ( MemAvailable,这个是物理内存 )

第 2 行的 可用 指的是在不需要交换的情况下,可用于启动新应用程序的物理内存。与 空闲 字段不同,它尝试计入很容易回收的页面缓存和内存 slab。它在内核 3.14 上可用,在内核 2.6.27+ 上为模拟得到,否则与 空闲 相同。

在其他内存显示模式中,显示两行简短的概览,其中包含以下元素:

               a    b          c
    GiB 内存: 18.7/15.738   [ ... ]
    GiB 交换:  0.0/7.999    [ ... ]

其中:a) 是已用的百分比;b) 是可用的总量;c) 是这些数字的两种可视化图表之一。

在物理内存的情况下,百分比表示 总共 减去上面提到的估计的 可用。"内存" 图本身被分为 已用 内存的非缓存部分和未计入 可用 内存的所有剩余内存。参见主题 4b. 概览区命令 和 "m" 命令以获取有关这一特殊的 4 路切换命令的更多信息。

下表可能有助于理解所显示的带有单位的值:

    KiB = kibibyte = 1024 字节
    MiB = mebibyte = 1024 KiB = 1,048,576 字节
    GiB = gibibyte = 1024 MiB = 1,073,741,824 字节
    TiB = tebibyte = 1024 GiB = 1,099,511,627,776 字节
    PiB = pebibyte = 1024 TiB = 1,125,899,906,842,624 字节
    EiB = exbibyte = 1024 PiB = 1,152,921,504,606,846,976 字节

下面列出了 top 可用的进程字段(列)。这些字段严格按照 ASCII 字母顺序列出。您可以使用交互式命令 "f"(字段管理)自定义是否显示它们,以及它们的位置。

任何字段都可以被选为排序字段,并且您可以控制它们是从高到低还是从低到高排序。有关排序功能的更多信息,参见主题 4c. 任务区命令,排序。

与物理内存或虚拟内存相关的字段提到了 "(KiB)",这是不带后缀时的默认单位。但是,显示的单位可以是从 KiB 到 PiB。该单位受到交互式命令 "e" 的影响,或者可以通过编译时的选项设定启动时的默认值。

%CPU  --  CPU 使用量
自上次屏幕更新以来,任务在已用 CPU 时间中所占的比例,以占总 CPU 时间的百分比表示。

在真正的 SMP 环境中,如果进程是多线程的并且 top 在线程模式下运行,则数字可能会大于 100%。您可以使用交互式命令 "H" 开关线程模式。

同样对于多处理器环境,如果 Irix 模式 关闭,top 将在 Solaris 模式下运行,此时任务的 CPU 使用量将除以 CPU 总数。您可以使用交互式命令 "I" 切换 Irix/Solaris 模式。

附注:在森林视图模式 ("V") 下运行且隐藏子进程 ("v") 时,此字段还将包括那些被隐藏的子进程的 CPU 时间。参见主题 4c. 任务区命令 以了解有关切换命令 "V" 和 "v" 的更多信息。

%CUC  --  CPU 利用率
此字段和下面的 %CUU 相同,除了它的百分比也包括了被收割的子进程。
%CUU  --  CPU 利用率
任务的总 CPU 使用量除以它已运行的时间,以百分比表示。

如果一个进程当前的 CPU 使用率较高,则此字段可以帮助确定此情况是否正常。相反,如果进程当前的 CPU 使用率较低,%CUU 可能提示它的生命周期中历史上的 CPU 需求较高。

%MEM  --  内存使用量(驻留)
任务当前的驻留内存占可用物理内存的比例。

参见 "综述,Linux 内存类型" 以了解更多细节。

与进程关联的自动组标识符。此标识符与 CFS 调度器配合使用,可提高交互式桌面性能。

当 /proc/sys/kernel/sched_autogroup_enabled 被设置时,每个新会话都会创建一个新的自动组(参见 SID)。该会话中所有后续 fork 出的进程都会继承此自动组的成员属性。然后,内核会尝试在这些组之间均衡分配 CPU 周期。因此,具有许多 CPU 密集型进程(例如 make -j)的自动组不会占据仅具有一两个进程的自动组的 CPU 时间。

显示 -1 时,表示此信息不可用。

自动组 nice 值,影响该组中所有进程的调度。负的 nice 值意味着更高的优先级,而正的 nice 值意味着更低的优先级。
进程所属的控制组的名称,或者如果不适用于该进程,则为 "-"。

只在 cgroup v1 中可用,它通常是 CGROUPS 那节中所描述的控制组完整列表中显示的最后一个条目。和那个字段一样,该字段的宽度也是可变的。

进程所属的控制组的名称(或列表),或者如果不适用于该进程,则为 "-"。

控制组用于在安装之后定义的进程组之间分配资源(CPU、内存、网络带宽等)。它可以对这些资源的分配、拒绝、优先级设置、管理和监控进行细粒度控制。

许多不同的 cgroup 层次结构可以同时存在于一个系统上,并且每个层次结构都属于一个或多个子系统。一个子系统代表一种资源。

附注:CGROUPS 字段与大多数列不同,不是固定宽度的。显示时,所有剩余的屏幕宽度(最多为 512 字符)将分配给它和其他所有可变宽度列。即使如此,这种可变宽度字段仍然可能会被截断。参见主题 5c. 滚动窗口 以获取关于查看被截断的数据的更多信息。

类 (CLS)  --  调度类
任务当前的调度策略,可以是以下各值中的一个:
- = 未报告
TS = SCHED_OTHER
FF = SCHED_FIFO
RR = SCHED_RR
B = SCHED_BATCH
ISO = SCHED_ISO
IDL = SCHED_IDLE
DLN = SCHED_DEADLINE
? = 未知的值
代码 (CODE)  --  代码大小 (KiB)
当前用于可执行代码的物理内存数量,也叫做文本驻留集 (Text Resident Set) 大小,或 TRS。

参见 "综述,Linux 内存类型" 以了解更多细节。

命令 (COMMAND)  --  命令 名称 或命令
显示用于启动任务的命令行或相关程序的名称。您可以使用 "c" 在命令 和命令 名称 之间切换,"c" 既是命令行选项也是交互式命令。

当您选择显示命令行时,没有命令行的进程(如内核线程)将仅显示程序名称,以方括号包围,如下例所示:
[kthreadd]

该字段也可能受到森林视图显示模式的影响。参见交互式命令 "V" 以了解有关该模式的更多信息。

附注:"命令" 字段与大多数列不同,不是固定宽度的。显示时,所有剩余的屏幕宽度(最多为 512 字符)将分配给它和其他所有可变宽度列。即使如此,这种可变宽度字段仍然可能会被截断。当显示命令行时(交互式命令 "c"),这一问题对于该字段而言尤为突出。参见主题 5c. 滚动窗口 以获取关于查看被截断的数据的更多信息。

数据 (DATA)  --  数据 + 栈大小 (KiB)
进程 保留 的私有内存数量。也叫做数据驻留集 (Data Resident Set) 或 DRS。这种内存可能尚未映射到物理内存(驻留),但将始终包含在虚拟内存(虚拟)中。

参见 "综述,Linux 内存类型" 以了解更多细节。

正在运行任务的 docker 容器的 ID(哈希值的缩略形式)。如果进程未在容器内运行,则会显示短横线 ("-")。
已运行 (ELAPSED)  --  已经经过的运行时间
自进程启动以来经过的时间长度。因此,最近启动的任务显示的时间最小。

该值将表示为 "HH,MM"(小时,分钟),但如果时间数值太大而无法适应列宽,则可能会进行额外的单位缩放。届时,它将缩放为 "DD+HH"(天+小时),甚至更大的单位。

环境 (ENVIRON)  --  环境变量
显示对应的进程能看到的所有环境变量(如果有的话)。这些变量将按原始顺序显示,而不是您习惯的使用不带参数的 "set" 命令看到的已排序好的顺序。

附注:"环境" 字段与大多数列不同,不是固定宽度的。显示时,所有剩余的屏幕宽度(最多为 512 字符)将分配给它和其他所有可变宽度列。即使如此,这种可变宽度字段仍然可能会被截断。这一问题对于该字段而言尤为突出。参见主题 5c. 滚动窗口 以获取关于查看被截断的数据的更多信息。

可执行文件 (EXE)  --  可执行文件路径
显示到可执行文件的完整路径(如果可用),包括程序名。

附注:"可执行文件" 字段与大多数列不同,不是固定宽度的。显示时,所有剩余的屏幕宽度(最多为 512 字符)将分配给它和其他所有可变宽度列。

标志 (Flags)  --  任务标志
此列显示任务的当前调度标志,以十六进制表示法表示,不显示零。这些标志的官方文档在 <linux/sched.h> 中。
有效 组 ID。
组 (GROUP)  --  组名
有效 组名称。
登录 时使用的用户 ID。显示 -1 时,表示此信息不可用。
正在运行任务的 lxc 容器的名称。如果进程未在容器内运行,则会显示短横线 ("-")。
任务的 nice 值。负的 nice 值意味着更高的优先级,而正的 nice 值意味着更低的优先级。该字段为 0 时,则表示在决定是否调度此任务时不会调整优先级。

附注:该值影响的调度优先级只是相对于同一自动组中其他进程而言的。参见 "AGID" 和 "AGNI" 字段以获取有关自动组的更多信息。

一个数字,表示与最后使用的处理器 ("P") 关联的 NUMA 节点。显示 -1 时,表示 NUMA 信息不可用。

参见交互式命令 "2" 和 "3" 以了解更多影响概览区的、与 NUMA 相关的功能。

该值范围是 -1000 到 +1000,会被加到当前的 OOMs (Out of Memory Score) 中,然后决定内存耗尽时要终止哪个任务。
该值范围是 0 到 +1000,曾经用于决定内存耗尽时要终止哪个任务。0 表示 "从不杀死",而 1000 表示 "总是杀死"。
一个数字,表示最后使用的处理器。在真正的 SMP 环境中,这一数字可能会频繁更改,因为内核刻意使用弱亲和性 (affinity)。此外,运行 top 本身可能会破坏这种弱亲和性,并导致更多进程更频繁地更换 CPU(因为对 CPU 时间产生了额外需求)。
每个进程都是唯一一个进程组的成员,该进程组用于分发信号,以及被终端用于仲裁其输入和输出的请求。当一个进程被创建 (fork) 时,它就成为其父进程所在的进程组的成员。按照惯例,该值等于进程组第一个成员的进程 ID(参见 PID),这个进程叫做进程组头领。
任务的唯一的进程 ID,会定期重复使用,但不会从零重新开始。用内核术语来说,它是一个由 task_struct 定义的可调度实体。

该值还可以被用于:进程组 ID(参见 PGRP);会话头领的会话 ID(参见 SID);线程组头领的线程组 ID(参见 TGID);以及进程组头领的 TTY 进程组 ID(参见 TPGID)。

任务的父进程的进程 ID (pid)。
优 (PR)  --  优先级
任务的调度优先级。如果此字段为 "rt",则表示任务正在实时调度优先级下运行。

在 Linux 下,实时优先级有一定的误导性,因为传统上操作系统本身是不可抢占的。虽然 2.6 内核可以编译成大部分情况下可抢占,但是并非总是如此。

此任务所占有的 "RSS",其中每个页面都除以共享该页面的进程数。它也是 "PSan"、"PSfd"和 "PSsh" 字段的总和。

例如,如果一个进程单独占有 1000 个驻留页,并且与另一个进程共享 1000 个驻留页,则其 "PSS" 将为 1500(乘以页大小)。

访问 smaps 值的开销比访问其他内存统计信息高 10 倍,并且访问其他用户的数据需要 root 权限。

PSan  --  比例匿名内存,smaps (KiB)
PSfd  --  比例文件内存,smaps (KiB)
PSsh  --  比例共享内存,smaps (KiB)

与上面的 "PSS"(总的比例驻留内存)字段一样,这些字段表示该任务所占有的各个类型的内存,每个页面都除以共享该页面的进程数。

访问 smaps 值的开销比访问其他内存统计信息高 10 倍,并且访问其他用户的数据需要 root 权限。

驻留 (RES)  --  驻留内存大小 (KiB)
虚拟地址空间("虚拟 (VIRT)")的子集,代表任务当前使用的非交换物理内存。它也是 "RSan"、"RSfd" 和 "RSsh" 字段的总和。

它可以包括私有匿名页面、映射到文件(包括程序映像和共享库)的私有页面以及共享匿名页面。所有这些内存都由在 "交换 (SWAP)" 字段中表示的交换文件在背后提供支持。

最后,该字段还可能包括共享的基于文件的页面,这些页面被修改后是作为专用的交换文件,因此永远不会影响 "交换 (SWAP)"。

参见 "综述,Linux 内存类型" 以了解更多细节。

这是另一个可以查看进程非交换物理内存的字段,而且更加准确。它是从 "smaps_rollup" 文件中获得的,通常比 "驻留 (RES)" 显示的稍大。

访问 smaps 值的开销比访问其他内存统计信息高 10 倍,并且访问其他用户的数据需要 root 权限。

驻留内存("驻留 (RES)")的子集,表示未映射到文件的虚拟页。
驻留内存("驻留 (RES)")的子集,表示支撑程序映像和共享库的、隐式的共享页。它也包括显式的文件映射(包括私有的和共享的)。
驻留内存("驻留 (RES)")的子集,是其中不可换出的部分。
驻留内存("驻留 (RES)")的子集,表示显式共享的、匿名的 shm*/mmap 页面。
真实 用户 ID。
真实用户 (RUSER)  --  真实用户名
真实 用户名称。
任务的状态,可以是以下几种之一:
D = 不可中断睡眠
I = 空闲
R = 运行中
S = 睡眠中
T = 被任务控制信号停止
t = 在追踪时被调试器停止
Z = 僵尸

显示为 "运行中" 的任务的更加准确的说法应该是 "准备运行(就绪)"  --  简单地说,它们的 task_struct 位于 Linux 的运行队列中。即使不是真正的 SMP 机器,您也可能会看到多个处于此状态的任务,具体取决于 e 的延迟间隔和 nice 值。

共享 (SHR)  --  共享内存大小 (KiB)
驻留内存("驻留 (RES)")的子集,是其中可被其他进程使用的部分。它包括共享的匿名页面和共享的基于文件的页面。它还包括映射到程序映像文件和共享库文件的私有页面。

参见 "综述,Linux 内存类型" 以了解更多细节。

会话是进程组(参见 PGRP)的集合,通常由登录 shell 建立。新 fork 出来的进程会加入它的创建者的会话。按照惯例,该值等于会话的第一个成员的进程 ID(参见 PID),该成员称为会话头领,通常是登录 shell。
启动于 (STARTED)  --  启动时间
从系统启动到进程启动所经过的时间长度。因此,最近启动的任务将显示最大的时间。

该值将表示为 "MM:SS"(分钟:秒)。但是如果时间太大,无法适应列宽,则会被缩放为 "HH,MM"(小时,分钟),甚至更大的单位。

保存 用户 ID。
增补 GID (SUPGIDS)  --  增补组 ID
登录时确立的,或者从任务的父进程继承的所有增补组的 ID。用以逗号分隔的列表表示。

附注:"增补 GID" 字段与大多数列不同,不是固定宽度的。显示时,所有剩余的屏幕宽度(最多为 512 字符)将分配给它和其他所有可变宽度列。

增补组 (SUPGRPS)  --  增补组名称
登录时确立的,或者从任务的父进程继承的所有增补组的名称。用以逗号分隔的列表表示。

附注:"增补组" 字段与大多数列不同,不是固定宽度的。显示时,所有剩余的屏幕宽度(最多为 512 字符)将分配给它和其他所有可变宽度列。

保存用户 (SUSER)  --  保存用户名
保存 用户名称。
交换 (SWAP)  --  已交换大小 (KiB)
当物理内存过度分配以后,任务的地址空间中之前驻留在内存里,现在被写到交换文件中的部分的大小。

参见 "综述,Linux 内存类型" 以了解更多细节。

任务所处的线程组的 ID。它是线程组头领的 PID。用内核术语来说,它代表所有共享同一个 mm_struct 的任务。
时间 (TIME)  --  CPU 时间
任务启动后使用的总 CPU 时间。当累积模式 开启 时,每个进程显示的 CPU 时间都包括它和它的已死亡的子进程所使用的时间。使用 "S" 可以切换累积模式,它既是命令行选项,也是交互式命令。参见交互式命令 "S" 以获得关于此模式的更多信息。
时间+ (TIME+)  --  CPU 时间,0.01 秒
和 "时间 (TIME)" 相同,但是精度更高,精确到 0.01 秒。
连接到的 tty 的前台进程的进程组 ID,如果进程未连接到终端,则为 -1。按照惯例,该值等于进程组头领(参见 PGRP)的进程 ID(参见 PID)。
控制进程的终端的名称。它通常是启动该进程的设备(串口、pty 等),并且该进程使用它进行输入输出。但是,任务不是必须和一个终端关联,这种情况下,将显示 "?"。
任务的所有者的 有效 用户 ID。
已用 (USED)  --  使用中的内存 (KiB)
这个字段表示任务使用的非交换物理内存("驻留 (RES)"),加上它的地址空间中已被换出的部分("交换 (SWAP)")。

参见 "综述,Linux 内存类型" 以了解更多细节。

用户 (USER)  --  用户名
任务的所有者的 有效 用户名称。
物理内存中的非交换部分 ("RSS") 中的未与任何其他进程共享的部分。它由 "smaps_rollup" 文件中的数据推导得出。

访问 smaps 值的开销比访问其他内存统计信息高 10 倍,并且访问其他用户的数据需要 root 权限。

虚拟 (VIRT)  --  虚拟内存大小 (KiB)
任务使用的虚拟内存的总量。它包括所有的代码、数据和共享库,加上已被换出的页面,还有已被映射但未使用的页面。

参见 "综述,Linux 内存类型" 以了解更多细节。

这一字段将显示进程睡眠时处于的内核函数名称。正在运行的任务这一列会显示短横线 ("-")。
进程导致的从存储层获取的字节数。

显示其他用户的 "io" 数据需要 root 权限。

进程的 I/O 读操作(系统调用)的数量。这类调用不一定会导致实际的物理磁盘 I/O。
进程导致的发送到存储层的字节数。
进程的 I/O 写操作(系统调用)的数量。这类调用不一定会导致实际的物理磁盘 I/O。
脏页 (nDRT)  --  脏页计数
自其上次被写入辅助存储器以来已被修改的页面数量。脏页必须先写入辅助存储器,然后才能将相应的物理内存位置用于其他虚拟页。

该字段在 Linux 2.6 中已被弃用,并且始终为零。

与进程关联的已打开的文件的总数。
主要 (nMaj)  --  主要缺页计数
任务发生的 主要 缺页的数量。当进程尝试读取或写入当前不位于其地址空间中的虚拟页时,就会发生缺页。主要缺页指的是需要访问辅助存储器才能使该页可用的缺页。
次要 (nMin)  --  次要缺页计数
任务发生的 次要 缺页的数量。当进程尝试读取或写入当前不位于其地址空间中的虚拟页时,就会发生缺页。次要缺页指的是不需要访问辅助存储器就能使该页可用的缺页。
线 (nTH)  --  线程数
与进程关联的线程数量。
用于隐藏进程所属控制组的身份的命名空间的 Inode。
用于隔离进程间通信 (IPC) 资源(例如 System V IPC 对象和 POSIX 消息队列)的命名空间的 Inode。
用于隔离文件系统挂载点,进而提供文件系统层次结构的不同视图的命名空间的 Inode。
用于隔离网络设备、IP 地址、IP 路由、端口号等资源的命名空间的 Inode。
用于隔离进程 ID 号,使其不需要保持唯一性的命名空间的 Inode。这使得每个这样的命名空间都可以有自己的 "init/systemd" (PID #1),来管理各种初始化任务,以及收割失去了父进程的子进程。
允许进程以类似于 UTS 命名空间的方式看见不同的系统时间的命名空间的 Inode。
用于隔离用户和组 ID 号的命名空间的 Inode。这使得进程可以在某个用户命名空间之外拥有普通的非特权用户 ID,而在该命名空间内拥有用户 ID 0,从而具有完全的 root 权限。
用于隔离主机名和 NIS 域名的命名空间的 Inode。UTS 其实就是 "Unix 分时系统 (Unix Time-sharing System)"。
自上次更新以来发生的 主要 缺页的数量(参见 "主要 (nMaj)")。
自上次更新以来发生的 次要 缺页的数量(参见 "次要 (nMin)")。

按下交互式命令 "f"(字段管理)后,您将看到一个屏幕,其中显示:1) "当前" 窗口名称;2) 指定的排序字段;3) 所有字段,按当前顺序排列,并附有说明。标有星号的条目是当前显示的字段,如果屏幕宽度允许的话。

  • 正如屏幕上的说明所示,您可以使用 方向键在字段之间移动。PgUp、PgDn、Home 和 End 键可用于快速到达第一个或最后一个可用字段。
  • 方向键选择要重新放置的字段, 方向键或 <Enter> 键提交该字段的放置位置。
  • "d" 键或 <空格> 键可切换字段的显示状态,从而也会切换星号的显示与否。
  • "s" 键指定一个字段作为排序字段。参见主题 4c. 任务区命令,排序 以获得关于选择排序字段的更多信息。
  • "a" 和 "w" 键可以循环浏览所有可用窗口,"q" 或 <Esc> 键可退出字段管理。

字段管理屏幕还可用于更改全屏模式或备用显示模式中的 "当前" 窗口/字段组。当按下 "q" 或 <Esc> 时,在您返回 top 的同时,当前正在编辑的目标窗口将成为当前窗口。参见主题 5. 备用显示功能 和交互式命令 "g" 以深入了解 "当前" 窗口和字段组。

附注:如果通过字段管理屏幕进行了任何字段更改,则任何已被 水平 滚动的窗口都将被重置。但是,任何经过 垂直 滚动的位置不会被影响。参见主题 5c. 滚动窗口 以获得有关垂直和水平滚动的更多信息。

下面列出的是命令的简要索引,已经分成了不同的类别。有些命令出现了多次  --  它们的含义或范围可能会根据发出它们时的上下文而有所不同。

  4a. 全局命令 
        <Enter/空格>, ?, =, 0,
        A, B, d, E, e, g, H, h, I, k, q, r, s, W, X, Y, Z,
        ^E, ^R
  4b. 概览区命令 
        C, l, t, m, 1, 2, 3, 4, 5, !, ^
  4c. 任务区命令 
        外观: b, J, j, x, y, z
        内容: c, F, f, O, o, S, U, u, V, v
        大小: #, i, n
        排序: <, >, f, R
  4d. 底部窗口命令 
        ^A, ^G, ^K, ^L, ^N, ^P, ^U, Tab, Shift+Tab
  4e. 颜色映射 
        <回车>, a, B, b, H, M, q, S, T, w, z, @, 0 - 7
  5b. 窗口命令 
        -, _, =, +, A, a, G, g, w
  5c. 滚动窗口 
        C, 上, 下, 左, 右, PgUp, PgDn, Home, End
  5d. 在窗口中查找 
        L, &
  5e. 在窗口中筛选 
        O, o, ^O, =, +

全局交互式命令在全屏模式和备用显示模式中都 总是 可用。但是,在安全模式下运行时,其中一些交互式命令 不可用

如果您想提前知道您的 top 是否处于安全模式,只需使用帮助命令,再查看第二行的系统概况即可。

  <Enter> 或 <空格>  :刷新显示
这些命令唤醒 top,在收到任何输入后,将重新绘制整个显示区域。它们还会强制针对任何热插拔导致的 CPU 或物理内存更改进行更新。

如果您设置了较大的延迟间隔但希望查看当前状态,请使用这两个键中的任何一个。

   ? | h  :帮助
有两个可用的帮助层级。第一层将提供所有基本交互式命令的简要提示。如果 top 处于 安全模式,该屏幕的内容也将有所省略。

在主帮助屏幕上输入 "h" 或 "?" 将显示特殊键的帮助。参见主题 4d. 底部窗口命令 以获取更多信息。

在主帮助屏幕上输入 "H" 将显示适用于备用显示模式的交互式命令的帮助。参见主题 5. 备用显示功能 以获取更多信息。

   =  :解除显示限制
消除对显示内容的限制。此命令将撤销任何生效的 "i"(空闲任务)、"n"(最大任务数)、"v"(隐藏子进程)和 "F"(保持焦点)命令。它还可以让您退出 PID 监控、用户筛选、其他筛选、查找,以及合并 CPU 模式。

此外,如果窗口已被滚动,此命令会将其重置。

   0  :不显示零值 切换开关
此命令决定是否显示任务窗口中的许多字段的零值。UID、GID、NI、优 (PR) 或 P 等字段不受此切换开关的影响。
   A  :备用显示模式 切换开关
此命令将在全屏模式和备用显示模式之间进行切换。参见主题 5. 备用显示功能 和交互式命令 "g" 以深入了解 "当前" 窗口和字段组。
   B  :禁用/启用粗体 切换开关
此命令将影响 terminfo 功能 "粗体" 的使用,且对 "当前" 窗口的概览区和任务区 有效。虽然它主要用于哑终端,但是任何时候都可以使用。

附注:当此切换开关 开启 且 top 处于单色模式时,整个显示区域 都会是普通文本。因此,除非 "x" 和/或 "y" 切换开关使用了反色来进行强调,否则不会有任何视觉上的区别能让您确认它们处于开启状态。

*  d | s  :更改延迟时间
程序将提示您输入显示区域的更新延迟(以秒为单位)。

可以使用小数秒数,但不允许使用负数。输入 0 会导致(几乎)连续不断的更新,显示效果将会不理想,因为系统和 tty 驱动程序会试图满足 top 的需求。延迟值与系统负载成反比,因此请小心设置。

如果您在任何时候想知道当前的延迟时间,只需使用帮助命令,再查看第二行的系统概况即可。

   E  :强制设置概览内存单位 (概览区)
您可以使用此命令循环切换概览区内存的单位,从 KiB(kibibytes 或 1,024 字节)到 EiB(exbibytes 或 1,152,921,504,606,846,976 字节)。

如果您在显示的数字和后面的标签之间看到一个 "+",则意味着 top 被迫截断该数字的某些部分。通过增大单位,可以避免这种截断。

   e  :强制设置任务内存单位 (任务区)
您可以使用此命令循环切换任务区内存的单位,从 KiB(kibibytes 或 1,024 字节)到 PiB(pebibytes 或 1,125,899,906,842,624 字节)。

虽然 top 将尝试使用所选的单位,但为了适应当前值,可能仍然需要使用更大的单位。如果您希望在内存列中看到单位更加一致的结果,增大单位通常可以实现该目标。然而,单位太大可能会导致显示的数值全为零,且这种零值不能用交互式命令 "0" 禁止显示。

   g  :选择另一个窗口/字段组
程序将提示您输入 1 到 4 之间的数字,指定要设为 "当前" 窗口的字段组。您很快就会熟悉这 4 个窗口,特别是在尝试使用备用显示模式后。
   H  :线程模式 切换开关
当此切换开关 开启 时,所有可见任务窗口中的所有进程将单独显示各个线程。否则,top 将显示每个进程中所有线程的和。
   I  :Irix/Solaris模式 切换开关
当在 Solaris 模式下运行时("I" 切换开关 关闭),任务的 CPU 使用量将除以 CPU 的总数。执行此命令后,将告知您该切换开关的新的状态。
*  k  :杀死一个任务
程序将提示您输入 PID,然后提示您输入要发送的信号。

不输入 PID 或输入负数将被视为输入了提示符中显示的默认值(显示的第一个任务)。PID 为零表示 top 程序自身。

正如提示符中所描述的,默认信号是 SIGTERM。但是,您可以通过输入信号编号或名称发送任何信号。

如果您希望取消杀死进程的操作,请根据您所处的进度执行以下操作之一:

    1) 在 pid 提示符处,输入无效的数字
    2) 在信号提示符处,输入 0(或任何无效的信号)
    3) 在任何提示符处,按下 <Esc>
   q  :退出
*  r  :重新设置任务nice值
程序将提示您输入 PID,然后提示您输入要设置的 nice 值。

不输入 PID 或输入负数将被视为输入了提示符中显示的默认值(显示的第一个任务)。PID 为零表示 top 程序自身。

正的 nice 值将导致进程失去优先级。相反,负的 nice 值将使内核更青睐该进程。一般来说,普通用户只能增加 nice 值,而不能降低 nice 值。

如果您希望取消重新设置 nice 值的操作,请根据您所处的进度执行以下操作之一:

    1) 在 pid 提示符处,输入无效的数字
    2) 在 nice 提示符处,不输入任何内容,并按 <Enter>
    3) 在任何提示符处,按下 <Esc>
   W  :写入配置文件
这将保存您的所有选项和切换开关,以及当前的显示模式和延迟时间。如果您在退出 top 之前执行此命令,之后您将能够以完全相同的状态重新启动。
   X  :加宽固定宽度字段
有些字段是固定宽度且不可缩放的。因此,它们可能会被截断,此时字段的最后一个字符显示为 "+"。

可以使用此交互式命令修改以下字段的宽度:

    字段     默认     字段     默认     字段      默认 
    GID       5       Docker    8       WCHAN      10
    LOGID     5       组        8       nsCGROUP   10
    RUID      5       LXC       8       nsIPC      10
    SUID      5       真实用户  8       nsMNT      10
    UID       5       保存用户  8       nsNET      10
                      TTY       8       nsPID      10
                      用户      8       nsTIME     10
                                        nsUSER     10
                                        nsUTS      10

程序将提示您输入要给上述默认宽度增加的数值。输入零会强制恢复这些默认值。

如果您输入一个负数,top 将根据需要自动增加列宽,直到不再有数据被截断。

附注:无论是显式增加还是自动增加,top 都不会减少这些字段的宽度。要使字段变窄,您必须指定一个更小的数值或恢复默认值。

   Y  :检视其他输出
执行交互式命令 "Y" 后,程序将提示您输入目标 PID。键入一个值或接受默认值后,将显示一个单独的屏幕。该屏幕可用于查看各种文件,或者通过管道传来的命令输出,与此同时,正常的 top 迭代显示会被暂停。

只有当支持性条目被手动添加到 top 配置文件的末尾以后,这个交互式命令才会被完全实现。有关创建这些条目的详细信息,参见主题 6b. 添加检视条目。

有关检视功能的大多数按键都在屏幕顶端的帮助文本中有所说明。但是,在您选择了特定文件或命令后,还有其他一些按键可以使用。这些按键对于任何使用过 "less" 分页器的人来说,都会感到很熟悉,这里总结一下以供参考。

    按键     功能 
    =        切换显示状态栏、文件名或管道命令行
    /        查找,等价于 "L"
    n        查找下一个,等价于 "&"
    <空格>   向下滚动,等价于 <PgDn>
    b        向上滚动,等价于 <PgUp>
    g        第一行,等价于 <Home>
    G        最后一行,等价于 <End>
   Z  :更改颜色映射
按下此按键将显示一个单独的屏幕,您可以在其中更改 "当前" 窗口或所有窗口的颜色映射。要了解有关此交互式命令的详细信息,参见主题 4e. 颜色映射。
  ^E  :缩放CPU时间字段(Ctrl 键 + "e")
"时间" 字段的显示精度通常是其宽度允许的最高精度。此切换开关会降低精度,直到重新回到最高精度。此切换开关还可以展示这些字段 可能 会自动进行的缩放,是否出现自动缩放通常取决于系统运行的时间长短。

例如,如果显示的是 "分钟:秒.百分秒",按下 ^E 时,时间会依次变为:"分钟:秒"、"小时,分钟"、"天+小时",最后是 "周+天"。

不是所有时间字段在进行这种缩放时都支持完整的缩放范围。

^R  :重新设置自动组nice值 (Ctrl 键 + "r")
程序将提示您输入 PID,然后提示您输入要给其自动组 AGNI 设置的值。

不输入 PID 将被视为输入了提示符中显示的默认值(显示的第一个任务)。

正的 AGNI 值将导致该自动组中的进程失去优先级。相反,负值会使内核更青睐它们。普通用户不允许设置负的 AGNI 值。

如果您希望取消重新设置 nice 值的操作,请按 <Esc>。

*
带有星号 ("*") 的命令在安全模式下不可用,也不会显示在第 1 层的帮助屏幕上。

概览区交互式命令在全屏模式和备用显示模式中都 总是可用。它们会影响显示区域的头几行,并将决定消息和提示符的位置。

这些命令总是仅影响 "当前" 窗口/字段组。参见主题 5. 备用显示功能 和交互式命令 "g" 以深入了解 "当前" 窗口和字段组。

   C  :显示滚动坐标 切换开关
切换显示一条信息性消息,只要消息行未被其他消息占用,就会显示该消息。有关更多信息参见主题 5c. 滚动窗口。
   l  :平均负载/上线时间 切换开关
处于全屏模式时,这一行也包含程序名称(可能是别名)。处于备用显示模式时,这一行也包含 "当前" 窗口名称。
   t  :任务/CPU状态 切换开关
该命令影响概览区中的 2 行到很多行,具体取决于切换命令 "1"、"2" 或 "3" 的状态,以及 top 是否在真正的 SMP 环境下运行。

概览区的这一部分也受到交互式命令 "H" 切换开关的影响,比如 "总共" 标签中显示的是 "任务" 还是 "线程"。

此命令是一个 4 路的切换开关,循环激活以下模式:

    1. 各类别的详细百分比
    2. 简略的用户/系统和总计百分比 + 竖线图表
    3. 简略的用户/系统和总计百分比 + 方块图表
    4. 关闭任务和 CPU 状态显示

使用两种有图表的模式中的任意一种时,如果同时显示单个 CPU 或 NUMA 节点的情况,则显示的内容会变得更有意义。参见下方的命令 "1"、"2" 和 "3" 以获取更多信息。

   m  :内存/交换使用量 切换开关
该命令影响概览区中的关于物理和虚拟内存的两行。

此命令是一个 4 路的切换开关,循环激活以下模式:

    1. 各内存类型的详细百分比
    2. 简略的已用百分比/可用总量 + 竖线图表
    3. 简略的已用百分比/可用总量 + 方块图表
    4. 关闭内存显示
   1  :单行/分开显示CPU状态 切换开关
此命令影响 "t" 命令的 CPU 状态部分的显示方式。尽管此切换开关主要用于并行度很高的 SMP 机器,但它并不仅限于在 SMP 环境中使用。

当您在概览区中看到 "%Cpu(s):" 时,意味着 "1" 切换开关 开启,并且所有 CPU 信息都汇总在一行中。否则,每个 CPU 会分开显示为:"%Cpu0、%Cpu1、...",最多可占据全部的可用屏幕高度。

   2  :NUMA节点/CPU概览 切换开关
此命令切换(仅)显示 "1" 命令的 cpu 概览,或是显示概览和每个 NUMA 节点的 cpu 使用量统计信息。仅在系统具有必要的 NUMA 支持时才可用。
   3  :展开NUMA节点
程序将提示您输入表示 NUMA 节点的数字。此后,将显示该节点的概览以及该节点中每个 cpu 的统计信息,直到按下切换命令 "1"、"2" 或 "4"。此交互式命令仅在系统具有必要的 NUMA 支持时才可用。
   4  :并列显示多个元素 切换开关
这个切换命令会 关闭 切换开关 "1",并在每一行中显示多个 CPU 和内存结果。每按一次 "4" 键,增加一个 CPU,直到重新恢复为每行显示一个 CPU 和内存结果。

每行最多可以显示 8 个 CPU。但是,在达到这一最大值之前可能就会发生数据截断。通过切换命令 "t" 显示详细统计信息时肯定会出现这种情况,因为此类数据无法像图表一样缩放。

如果希望快速退出并列模式而不想一直循环到 8,只需使用切换命令 "1"。

   5  :显示P核和E核 切换开关
此切换命令仅在多核平台具有两种不同类型的核心时才生效,即多线程(P 核)和单线程(E 核)。

平常每个 CPU 显示为 "%Cpu0、%Cpu1、...",而使用此切换开关后,可根据核心类型识别和/或筛选这些 CPU,将它们分为 P 核(performance,性能) 和 E 核(efficient,高效)。

第 1 次敲击 "5" 时,每个 CPU 显示为 "%CpP" 或 "%CpE",代表两种核心类型。第 2 次敲击时,仅显示 P 核 (%CpP)。第 3 次,仅显示 E 核 (%CpE)。第 4 次敲击此切换命令时,CPU 显示将恢复成正常的 "%Cpu" 格式。

   !  :合并CPU模式 切换开关
此切换命令适用于并行度很高的 SMP 环境,此类环境中,即使使用 "4" 切换命令,也无法显示所有处理器。每按一次 "!",合并的 CPU 数量就会加倍,从而减少显示的 CPU 行总数。

例如,第一次按 "!" 时,将合并每两个 CPU,显示为 "0-1、2-3、..." 而不是平常的 "%Cpu0、%Cpu1、%Cpu2、%Cpu3, ..."。第二次按 "!" 切换命令时,将合并每四个 CPU,显示为 "0-3、4-7、..."。第三次按 "!" 时,将合并每八个 CPU,显示为 "0-7、8-15、...",以此类推。

这一过程将持续下去,直到再次显示单个 CPU。使用 "=" 命令退出 合并 CPU 模式。

   ^  :显示核心 vs CPU 切换开关
现代的平台通常具有同时多线程(SMT)技术的某种实现,允许多个线程在单个物理核心上同时执行。每个核心支持两个线程是最常见的配置。然而,某些企业级和专用架构支持更高的线程数量。

此切换命令用于显示单个物理 CPU 核心的利用率,而不是报告的单个 CPU,即线程的利用率。

附注:对于任何窗口,如果 关闭 了整个概览区的显示 ,您将只能看见一行 消息行。这样,您将得到最多的任务行,但(暂时)无法看到程序名称(处于全屏模式时)或 "当前" 窗口名称(处于备用显示模式时)。

在全屏模式中,任务区的交互式命令 总是 可用。

在备用显示模式中,如果 "当前" 窗口的任务显示被 关闭,那么任务区的交互式命令 总是不可用(参见主题 5. 备用显示功能)。

任务窗口的 外观

   J  :对齐数字列 切换开关
对于数字数据,在右对齐(默认)和左对齐之间切换。如果数字数据完全填满了列,则此切换命令可能仅影响列标题。
   j  :对齐字符列 切换开关
对于字符数据,在左对齐(默认)和右对齐之间切换。如果字符数据完全填满了列,则此切换命令可能仅影响列标题。
以下命令还受到全局切换开关 "B"(启用粗体)的状态的影响。
   b  :加粗/反色 切换开关
此命令将影响 "x" 和 "y" 切换开关的显示方式。当通过 "t" 或 "m" 切换开关选择了使用竖线图展示 CPU 状态或内存使用情况时,此命令可能也会影响概览区。
   x  :列高亮 切换开关
开关当前排序字段的高亮显示。如果您忘记了正在对哪个字段进行排序,此命令可以进行一种快速的视觉上的提醒,但前提是排序字段当前显示在屏幕上。排序字段可能由于以下原因 可见:
1)没有足够的 屏幕宽度
2) 被交互式命令 "f" 关闭
   y  :行高亮 切换开关
开关 "运行中" 的任务的高亮显示。要进一步了解此任务状态,参见主题 3a. 字段描述,"S" 字段(进程状态)。

此功能可以提供关于系统健康状况的重要信息。唯一的系统开销是要多处理一些 tty 转义序列。

   z  :彩色/单色 切换开关
切换 "当前" 窗口的颜色设置,在上次使用的配色方案和旧式的白底黑字或黑底白字之间切换。此命令将影响概览区 任务区,但不影响 "x"、"y" 或 "b" 切换开关的状态。

任务窗口的 内容

   c  :命令行/程序名称 切换开关
无论命令 (COMMAND) 列当前是否可见,此命令都有效。之后,假如该字段开始显示,您将可以看到您执行此命令引起的变化。
   F  :保持父进程焦点 切换开关
当处于森林视图模式时,此切换开关决定是否保持焦点在某一目标任务(也许是有 fork 出来的子进程的任务)上。如果森林视图模式处于 关闭 状态,则此键无效。

此切换开关应用于 "当前" 窗口中的第一个(最上方的)进程。一旦生效,该任务及其 fork 出来的子进程将始终显示为第一个(最上方的)进程。所有其他进程都将停止显示。

附注:"i"(空闲任务)、"n"(最大任务数)、"v"(隐藏子进程)以及用户/其他筛选等按键仍然可以使用,并且可能会影响显示的内容。

   f  :字段管理
该键显示一个单独的屏幕,您可以在其中更改要显示的字段及其顺序,还可以指定排序字段。有关此交互式命令的更多信息,参见主题 3b. 管理字段。
   O | o  :其他筛选
程序将提示您输入筛选标准,然后确定哪些任务将显示在 "当前" 窗口中。您的标准可以区分大小写,也可以忽略大小写。然后您决定 top 应该包含还是排除匹配的任务。

参见主题 5e. 在窗口中筛选 以了解关于这些功能和其他相关交互式命令的内容。

   S  :累积时间模式 切换开关
当累积模式 开启 时,每个进程显示的 CPU 时间都包括它和它的已死亡的子进程的 CPU 时间。

当累积模式 关闭 时, fork 出很多单独任务的程序将显得资源消耗较低。对于像 "init" 或 shell 这样的程序,这是合适的,但对于其他程序,比如编译器,可能不合适。尝试使用两个具有相同排序字段但具有不同 "S" 命令状态的任务窗口,看看您更喜欢哪种表示方式。

执行此命令后,将告知您此切换开关的新的状态。如果您想提前知道累积模式是否生效,只需使用帮助命令,再查看第二行的窗口概况即可。

   U | u  :仅显示特定用户
程序将提示您输入要显示的用户的 uid名称。-u 选项匹配 有效 用户,而 -U 选项匹配 任意 类型的用户(真实、有效、保存或文件系统用户)。

之后,在此任务窗口中,将仅显示匹配的用户,或者有可能不显示任何进程。在用户 ID 或名称前面加上感叹号 ("!") 会使得 top 仅显示与所提供的用户不匹配的进程。

不同的任务窗口可用于筛选不同的用户。之后,如果您希望再次在 "当前" 窗口中显示所有用户,请重新执行此命令,但只需在提示符下按 <Enter> 即可。

   V  :森林视图模式 切换开关
在此模式下,将根据进程的父进程重新排序进程,并且命令 (COMMAND) 列的布局类似于一棵树。在森林视图模式下,仍然可以切换显示程序名称和命令行(参见交互式命令 "c")或切换显示进程和线程(参见交互式命令 "H")。

附注:按下影响排序顺序的任何按键都将使 "当前" 窗口退出森林视图模式。参见主题 4c. 任务区命令,排序 以获取有关这些按键的信息。

   v  :隐藏/显示子进程 切换开关
在森林视图模式下,此切换开关用于折叠或展开父进程的子进程。

此切换开关应用于 "当前" 窗口中的第一个(最上方的)进程。参见主题 5c. 滚动窗口 以获取有关垂直滚动的更多信息。

如果目标进程没有 fork 出任何子进程,则此按键无效。当不处于森林视图模式时,此按键也没有效果。

任务窗口的 大小

   i  :空闲进程 切换开关
显示所有任务或仅显示活动的任务。当此切换开关 关闭 时,自上次更新以来未使用任何 CPU 的任务将不会显示。但是,受制于 %CPU 和 时间+ (TIME+) 字段的粒度,某些 似乎没有 使用过 CPU 的进程可能仍会显示出来。

如果此命令被应用于备用显示模式中的最后一个任务显示,那么它不会影响窗口的大小,因为所有先前的任务显示都已被绘制。

   n | #  :设置最大任务数
程序将提示您输入要显示的任务数。将使用您输入的数字和可用屏幕行数中的较小者。

当在备用显示模式中使用时,该命令可以让您精确控制当前可见的每个任务显示的大小,最后一个除外。它不会影响最后一个窗口的大小,因为所有先前的任务显示都已被绘制。

附注:处于备用显示模式时,如果您希望增加最后一个可见的任务显示的大小,只需减小其上方的任务显示的大小即可。

任务窗口的 排序

出于兼容性考虑,此 top 支持大多数以前的 top 的排序按键。由于该功能主要是为以前的 top 用户服务的,这些命令不会出现在任何帮助屏幕上。
      命令      被排序的字段                  是否支持 
      A         开始时间(不显示)           
      M         %MEM                          是
      N         PID                           是
      P         %CPU                          是
      T         时间+                         是

在使用以下任何排序功能之前,top 建议您使用 "x" 交互式命令暂时开启列高亮显示。这将有助于确保实际使用的排序字段符合您的意图。

以下交互式命令 在当前排序字段 可见 时有效。 排序字段可能由于以下原因 可见:
1)没有足够的 屏幕宽度
2) 被交互式命令 "f" 关闭

   <  :排序字段左移
将排序列向左移动,除非当前排序字段是显示的第一个字段。
   >  :排序字段右移
将排序列向右移动,除非当前排序字段是显示的最后一个字段。

以下交互式命令 总是 有效,无论当前排序字段是否可见。

   f  :字段管理
该按键将显示一个单独的屏幕,此屏幕允许您更改用作排序列的字段,也提供其他功能。当运行 top 并将列高亮显示 关闭 时,这是一种查看当前排序字段的便捷方法。
   R  :反向/正常排序字段 切换开关
您可以使用此交互式命令在从高到低和从低到高排序之间切换。

这些按键将在屏幕底部打开一个单独的窗口,同时正常的 top 监控仍将继续进行。再次按下 相同的 "Ctrl" 命令或者使用 "=" 命令移除这个窗口。

以下操作应用于当前显示的第一个任务。上/下方向键可以选择目标进程。使用更稳定的显示方式也很重要,如森林视图、按 PID 排序或使用更长的延迟间隔。

   ^A  :显示进程能力  (Ctrl 键 + "a")
   ^G  :显示控制组    (Ctrl 键 + "g")
   ^K  :显示命令行    (Ctrl 键 + "k")
   ^N  :显示环境      (Ctrl 键 + "n")
   ^P  :显示命名空间  (Ctrl 键 + "p")
   ^U  :显示增补组    (Ctrl 键 + "u")

此命令不执行特定的任务,而是调取 top 最近输出的最多 10 条消息供查阅。

   ^L  :显示消息日志 (Ctrl 键 + "l")

Tab 键(向前)或 Shift+Tab 组合键(向后)可用于高亮显示底部窗口中显示的各个元素。

这些功能中值得注意的是 Ctrl+N(环境)命令。它的输出可能很长,并且在自动换行以后不容易阅读。可以通过在 rc 文件中添加 "检视" 条目获得更具可读性的版本,如下所示。

    pipe ^I 环境 ^I cat /proc/%d/environ | tr '\0' '\n'

参见 4a. 全局命令 中的交互式命令 "Y" 和主题 6b. 添加检视条目 以了解更多信息。

当您执行交互式命令 "Z" 时,您将看到一个单独的屏幕。您可以使用该屏幕更改 "当前" 窗口或所有四个窗口的颜色设置,然后再返回到 top 的显示。

可使用以下交互式命令。

    5 个大写字母用来选择 目标
    8 个数字用来选择 颜色
    可用的普通切换开关
        B         :禁用/启用粗体
        b         :"加粗"/反色正在运行的任务
        z         :彩色/单色
    可用的其他命令
        a/w       :应用,然后转到下一个/上一个
        <Enter>   :应用并退出
        q         :放弃当前更改并退出

如果您使用 "a" 或 "w" 循环选择目标窗口,在您离开该窗口时,将应用所显示的配色方案。当然,您可以轻松返回到任何窗口并重新应用不同的颜色,或使用 "z" 切换开关完全 关闭 颜色显示。

颜色映射屏幕还可用于更改全屏模式或备用显示模式的 "当前" 窗口/字段组。当按下 "q" 或 <Enter> 时,在您返回 top 的同时,正在修改的目标会被设为 "当前" 窗口/字段组。

字段组/窗口
在全屏模式中,只有一个窗口,占据了整个屏幕。您仍然可以将这个窗口设置为显示 4 个不同的 字段组 中的 1 个(参见交互式命令 "g",下文会再次说明)。4 个字段组中的每一个都有一个独立的可单独配置的 概览区 和它自己的可配置的 任务区

在备用显示模式中,这 4 个字段组可以同时设为可见,也可以依照您的命令单独 关闭

概览区将始终显示,即使它只包含消息行。在任一特定时刻只会显示 1 个概览区。但是,依照您的命令,当前屏幕上可能会显示 04 个单独的任务显示。

当前窗口
"当前" 窗口是与概览区关联的窗口,也始终是与任务有关的命令的目标窗口。由于在备用显示模式中,您可以 关闭 任务显示,因此对于 "当前" 窗口而言,某些命令的执行可能会受到限制。

当您将概览区的第一行 关闭 时,情况会变得更加复杂。由于不再显示窗口名称("l" 切换开关所对应的行),您将难以确定哪个窗口是 "当前" 窗口。

   - | _  :显示/隐藏窗口 切换开关
"-" 键 开启关闭 "当前" 窗口的任务显示。开启 时,任务区将至少显示您使用交互式命令 "f" 设置的列标题行。它还将应用您已设置的任何其他任务区选项/切换开关,据此显示零个或多个任务。

"_" 键对所有任务显示执行相同的操作。换句话说,它交替显示当前可见的任务显示,以及被您 关闭 的所有任务显示。如果 4 个任务显示当前均可见,此交互式命令会将概览区作为唯一的显示元素。

*  = | +  :平衡/重置窗口
"=" 键强制使 "当前" 窗口的任务显示变为可见。它还会撤销任何生效的 "i"(空闲任务)、"n"(最大任务数)、"u/U"(用户筛选)、"o/O"(其他筛选)、"v"(隐藏子进程)、"F"(保持焦点)、"L"(查找)和 "!"(合并 cpu)命令。此外,如果窗口已被滚动,此命令会将其重置。参见主题 5c.滚动窗口 以获取有关垂直和水平滚动的更多信息。

"+" 键对所有窗口执行相同的操作。将重新显示四个任务显示,平衡它们的大小,同时将保留之前应用的所有自定义设置,切换命令 "=" 中提到的除外。

*  A  :备用显示模式 切换开关
此命令将在全屏模式和备用显示模式之间切换。

第一次执行此命令时,将显示所有四个任务显示。此后,当您切换模式时,您将仅看到您已设为可见的任务显示。

*  a | w  :下一个/上一个窗口
此命令将更改 "当前" 窗口,从而更改命令的目标窗口。这两个按键会循环选择窗口,因此您可以使用其中任何一个键选定任何您想选定的窗口。

假设窗口名称是可见的(您没有将 "l" 切换开关设为 关闭 状态),当 "当前" 窗口名称失去高亮/颜色时,这是在提醒您任务显示已被 关闭,许多命令的执行将受到限制。

   G  :更改窗口/字段组名称
程序将提示您为 "当前" 窗口输入新名称。此命令不要求窗口名称可见("l" 切换开关 开启)。
*
带有星号 ("*") 的交互式命令在备用显示模式之外也有作用。
    =, A, g    总是可用
    a, w       在颜色映射和字段管理中具有相同的功能
*  g  :选择另一个窗口/字段组
程序将提示您输入 1 到 4 之间的数字,指定要设为 "当前" 窗口的字段组。

在全屏模式中,需要使用此命令来更改 "当前" 窗口。在备用显示模式中,它只是 "a" 和 "w" 命令的不太方便的替代品。

通常,任务窗口仅显示系统中的一部分任务/线程,也仅显示一部分可用的字段/列。您可以使用这些滚动键垂直或水平移动视图,以显示任何想看到的任务或列。

,PgUp  :滚动任务
将视图向上移动,移向第一个任务,直到第一个任务显示在 "当前" 窗口的顶端。 方向键移动一行,而 PgUp 滚动整个窗口。
,PgDn  :滚动任务
将视图向下移动,移向最后一个任务,直到最后一个任务显示在 "当前" 窗口的顶端,并且是唯一一个显示的任务。 方向键移动一行,而 PgDn 滚动整个窗口。
,  :滚动列
水平移动视图,调整显示的字段,一次移动一列。

附注:值得提醒的是,某些字段/列不是固定宽度的,而是在它们可见时分配给它们所有剩余的屏幕宽度。当向右或向左滚动时,该功能一开始可能会产生一些意想不到的结果。

此外,当任何可变宽度字段是最后一个显示的字段时,都有一个特殊功能。通过右方向键到达该字段后,该字段是唯一显示的列,但您可以继续在该字段内水平滚动。 参见下面的交互式命令 "C" 以了解更多信息。

重新放置显示区域到未滚动的位置。
重新放置显示区域,使得最右边的列是最后一个可显示字段,最下方的任务行是最后一个任务。

附注:仍然可以使用方向键从这个位置开始向 和向 滚动。直到只显示一列和一个任务之前都可以。

切换是否显示一条信息性消息,只要消息行未以其他方式使用,就会显示该消息。该消息将使用两种格式中的一个,具体取决于可变宽度列是否已被滚动。
  滚动坐标:y = n/n(任务),x = n/n(字段)
  滚动坐标:y = n/n(任务),x = n/n(字段) + nn

形如 n/n 的坐标是相对于 "当前" 窗口的左上角的。附加的 "+ nn" 表示当可变宽度列已被水平滚动时,可变宽度列的位移。您可通过左方向键和右方向键实现这种位移,位移长度是普通的 8 个字符的制表符的整数倍。

第一个 n 表示最上方的可见任务,受滚动键控制。第二个 n 会自动更新,以反映任务总数。
第一个 n 表示最左边的显示列,受滚动键控制。第二个 n 是可显示字段的总数,受交互式命令 "f" 控制。

在全屏模式中,上述交互式命令 总是 可用,但在备用显示模式中,如果 "当前" 窗口 的任务显示被 关闭,则上述交互式命令总是 可用。

附注:当使用了任何形式的筛选时,滚动时可能会出现一些轻微的异常,因为并非所有任务都可见。当使用上/下方向键时,这种情况会更加明显。

您可以使用这些交互式命令查找含有某个特定值的任务行。

程序将提示您输入区分大小写的字符串,并从当前窗口坐标开始查找。查找字符串的内容没有限制。

查找的内容不限于单个字段或列的值。查找字符串的内容可以是显示的任务行中的一切值。可以包括空格、数字、符号,甚至森林视图里的 ASCII 艺术。

在没有输入内容的情况下按下 <Enter> 将会禁用 "&" 键,直到您输入新的查找字符串。

&  :查找下一个
假设已经输入了查找字符串,top 将尝试找到下一个匹配项。

找到匹配项后,将在垂直方向上重新放置当前窗口,使得包含该字符串的任务行位于第一行。您可以通过滚动坐标消息确认这种垂直方向上的重新放置的发生(参见交互式命令 "C")。但是,水平方向上的坐标永远不会因为查找而改变。

以下因素牵涉到要匹配的字符串是否存在。

参见主题 3b. 管理字段。
参见主题 5c. 滚动窗口。
参见交互式命令 "c"。
例如,PID 可以,但是 %CPU 不行。

如果查找失败,将 "当前" 窗口恢复到 Home(未滚动的)位置、进行水平滚动、显示命令行,或选择更稳定的排序字段之后,仍然有可能成功使用 "&" 查找下一个。

在全屏模式中,上述交互式命令 总是 可用,但在备用显示模式中,如果 "当前" 窗口 的任务显示被 关闭,则上述交互式命令总是 可用。

您可以使用 "其他筛选" 功能来创建筛选标准,以确定哪些任务显示在 "当前" 窗口中。如果您执行交互式命令 "W" 将此类筛选器保存在 rc 文件中,则可以使其永久生效。

创建筛选器至少需要:1) 字段名称;2) 运算符;3) 筛选值。这是 top 中最复杂的对用户输入的要求,因此,当您犯错时,命令历史功能将是您的得力助手。当程序提示您输入内容时,请记得可以使用上/下方向键或其别名。

筛选器基础知识

1. 字段名称区分大小写,拼写与列标题中相同
2. 筛选值不需要包含显示的完整字段
3. 筛选值可以忽略大小写,也可以大小写敏感
4. 默认是包含,前面加上 "!" 表示排除
5. 一个任务窗口可以同时应用多个筛选标准
6. 可以同时应用包含和排除标准
7. 1 个判等 ("=") 和 2 个关系 (">", "<") 筛选器可以自由组合
8. 每个任务窗口有自己单独的已生效的筛选器的集合

如果字段未启用或当前不位于视图中,则您的筛选标准不会影响显示的任务。之后,如果筛选字段变得可见,则您的筛选标准将生效。

按键概览

  O  :其他筛选(大写)
程序将提示您创建 大小写敏感 的筛选器。
  o  :其他筛选(小写)
程序将提示您创建 忽略大小写 的筛选器。
 ^O  :显示生效的筛选器(Ctrl 键 +‘o’)
此命令可以提醒您 "当前" 窗口中哪些筛选器处于生效状态。将在消息行上显示筛选器概览,直到您按下 <Enter> 键。
  =  :重置筛选器,对当前窗口生效
此命令将清除 "当前" 窗口中的所有筛选标准。它还会产生其他影响,因此请参见主题 4a. 全局命令。
  +  :重置筛选器,对所有窗口生效
假设您处于备用显示模式,此命令将清除所有窗口中的筛选标准。与交互式命令 "=" 一样,它也会产生其他影响,因此您可能需要参见主题 5b. 窗口命令。

输入要求

当程序提示您输入筛选标准时,您提供的数据必须使用两种格式之一。有 3 项必需信息,第 4 项为可选信息。 为了方便阅读,这些示例包含空格,但您的输入通常不包含。

        #1           #2  #3              (必需)
        字段名称     ?   包含的值
     !  字段名称     ?   排除的值
     #4                                  (可选)

#1、#3 和 #4 应该无需进一步解释。#2 既是必需的 分隔符,也是 运算符,它必须是判等("=")或关系运算符("<" 或 ">")之一。

"=" 判等运算符仅要求部分匹配,这可以减少 "值" 的输入长度。">" 或 "<" 关系运算符始终使用字符串比较,即使对于数字字段也是如此。在设计上,它们在字段使用默认 对齐方式 和显示相同单位的数据时是能够正常工作的。当字段的某些数值被 缩放 而其他数值没有被 缩放 时,字段的数据就不再是相同单位的了。

如果您创建了关系筛选器并且您 已经 更改了默认的数字或字符 对齐方式,则该筛选器可能会无法正常工作。当关系筛选器应用于内存字段并且您 尚未 更改 单位 时,可能会产生误导性结果。这样说是因为,比如说,当视为字符串进行比较时,"100.0m" (MiB) 将被视为大于 "1.000g" (GiB)。

如果您的筛选结果看起来很可疑,可能只需更改对齐或缩放即可实现所需的效果。请参阅交互式命令 "j"、"J" 和 "e" 了解更多信息。

潜在的问题

这两个 组 (GROUP) 筛选器可能会产生完全相同的结果,也有可能第二个筛选器根本不显示任何内容,只产生一个空白的任务窗口。

     组=root           ( 仅在使用小写 "o" 命令时 )
     组=ROOT           ( 结果相同                )

这两个 驻留 (RES) 筛选器中的任何一个都可能产生不一致和/或有误导性的结果,具体取决于当前的内存缩放系数。或者这两个筛选器也有可能产生完全相同的结果。

     驻留>9999         ( 仅在内存单位是 "KiB" 时 )
     !驻留<10000       ( 结果相同                )

这个 主要 (nMin) 筛选器阐明了可缩放字段特有的问题。这个特定的字段最多可显示 4 位数字,超出该数字的值会自动缩放至 KiB 或以上。因此,虽然存在大于 9999 的数字,但它们将显示为 2.6m、197k 等。

     主要>9999         ( 永远产生空白的任务窗口 )

潜在的解决方案

这些示例说明了如何创造性地使用 "其他筛选" 来实现几乎任何想要的结果。示例中有时会使用单引号来较为清晰地表示出筛选器中的空格,或者用来准确地表示请求筛选器状态 (^O) 命令的输出。但如果您在实际使用时在 "筛选值" 中包含单引号,则将无法找到匹配项。

假设字段 线 (nTH) 当前正在显示,第一个筛选器将导致仅显示多线程的进程。这个例子还提醒我们,末尾的空格是每个显示的字段的一部分。第二个筛选器以更少的输入实现了完全相同的结果。

     !线=' 1 '                 ( ' 只是为了方便阅读 )
     线>1                      ( 输入更短,结果相同 )

当森林视图模式已启用,并且 命令 (COMMAND) 列处于视图中时,此筛选器相当于折叠子进程,使得窗口中只显示 3 层。

     !命令='       `- '        ( ' 只是为了方便阅读 )

最后两组筛选器表示为请求筛选器状态 (^O) 命令的输出。实际上,每个筛选器都需要单独输入。下述 优 (PR) 示例说明了显示优先级为 20 或更高的任务需同时使用的两个筛选器,因为有些优先级可能为负值。然后,通过利用末尾空格,下述 次要 (nMin) 筛选器序列可以实现上面讨论过的失败的 "9999" 筛选目标。

     '优>20' + '!优=-'         ( 需要 2 个筛选器才能得到正确结果 )
     '!次要=0 ' + '!次要=1 ' + '!次要=2 ' + '!次要=3 ' ...

此文件可通过交互式命令 "W" 创建或更新。

旧版本的配置文件是 "$HOME/.您给top取的名字" + "rc",前面有一个 "."。

新创建的配置文件是 "procps/您给top取的名字" + "rc",前面没有 "."。当 $XDG_CONFIG_HOME 变量设置为一个绝对路径时,会在其中创建 procps 目录,否则,在 $HOME/.config 中创建。

虽然不希望用户手动编辑该文件,但配置文件的总体布局如下:

     全局    # 行  1: 程序名称/别名记录
      "      # 行  2: id,altscr,irixps,delay,curwin
    每个窗   # 行  a: winname,fieldscur
    口一组   # 行  b: winflags,sortindx,maxtasks 等
      "      # 行  c: summclr,msgsclr,headclr,taskclr
     全局    # 行 15: 其他杂项设置
      "      # 任何剩余的行都是可选的
      "      # 生效的 "其他筛选器",在上文 5e 节讨论
      "      # 加上 "检视" 条目,在下文 6b 节讨论

如果无法生成有效的指向 rc 文件的绝对路径,则对正在运行的 top 作出的个性化设置将无法保留。

要使用交互式命令 "Y",您必须将条目添加到 top 个人配置文件的 末尾。此类条目仅包含要读取的文件或要执行的命令/管道,其执行结果将显示在单独的可滚动、可搜索的窗口中。

如果您不知道 top rc 文件的位置或名称,请使用交互式命令 "W",然后注意其中的细节。

可以通过使用重定向的 echo 命令,或者编辑配置文件来添加检视条目。使用重定向的 echo 命令时,如果您使用了替换 (>) 而不是追加 (>>) 到该文件,则可能会导致 rc 文件被覆盖。相对地,使用编辑器时必须注意不要损坏现有行,其中某些行可能包含不可打印的数据或不寻常的字符,具体取决于保存该配置文件的 top 版本。

以 "#" 字符开头的检视条目会被忽略,无论其内容如何。否则,检视条目由以下 3 个元素组成,每个元素之间 必须 用制表符隔开(所以总共有 2 个 "\t"):

  .type(类型): 为 "file" 或 "pipe" 之一
  .name(名称): 检视屏幕上的选择区域显示的名称
  .fmts(格式): 表示路径或命令的字符串

这两种类型的检视条目 不能 相互替代。指定为 "file" 的条目将使用 fopen 进行访问,并且在 ".fmts" 元素中必须引用单个文件。 指定为 "pipe" 的条目将使用 popen,它们的 ".fmts" 元素可以包含许多通过管道连接的命令,并且所有命令都不能与用户进行交互。

如果 ".fmts" 中包含的文件名或管道需要包含您在提示符处输入或者直接接受的那个特定的 PID,则格式字符串中还必须使用 "%d" 说明符,如下面这些例子所示。

  .fmts=  /proc/%d/numa_maps
  .fmts=  lsof -P -p %d

仅对于 "pipe" 类型条目而言,您可能还希望将标准错误重定向到标准输出以获得更完整的结果。因此格式字符串将变为:

  .fmts=  pmap -x %d 2>&1

以下是两种类型的检视条目的示例,这是它们在 rc 文件中的样子。由于开头的 "#" 字符,第一个条目将被忽略。为了清楚起见,例子里的伪制表符 (^I) 两边有额外的空格,但实际的制表符两边没有空格。

  # pipe ^I 套接字 ^I lsof -n -P -i 2>&1
  pipe ^I 打开的文件 ^I lsof -P -p %d 2>&1
  file ^I NUMA 信息 ^I /proc/%d/numa_maps
  pipe ^I 日志 ^I tail -n100 /var/log/syslog | sort -Mr

除开上面被注释掉的条目,接下来的示例展示了如何通过 echo 实现类似的结果(假设 rc 文件名为 ".toprc")。然而,由于存在嵌入的制表符,每一行的开头都应该加上 "/bin/echo -e",而不仅仅是一个简单的 "echo",这样无论您使用哪种 shell,都能正确解释反斜杠。

  "pipe\t打开的文件\tlsof -P -p %d 2>&1" >> ~/.toprc
  "file\tNUMA 信息\t/proc/%d/numa_maps" >> ~/.toprc
  "pipe\t日志\ttail -n200 /var/log/syslog | sort -Mr" >> ~/.toprc

如果您创建的任何检视条目生成了带有不可打印字符的输出,它们将以 ^C 表示法或十六进制 <FF> 形式显示,具体取决于它们的值。这也适用于制表符,它将显示为 "^I"。如果您需要更真实的表示方式,则应展开任何嵌入的制表符。下面的示例原本使用 "file" 条目,但改为使用 "pipe" 来展开嵌入的制表符。

  # 下面这行可能会包含 "\t" ...
  # file ^I <您选择的名称> ^I /proc/%d/status
  # 但下面这行将消除嵌入的 "\t" ...
  pipe ^I <您选择的名称> ^I cat /proc/%d/status | expand -

附注:有些程序可能依赖 SIGINT 来结束。因此,如果建立了如下所示的 "pipe",则必须使用 Ctrl-C 来终止它才能查看结果。这是 "^C" 不会同时终止 top 的唯一情况。

  pipe ^I 追踪 ^I /usr/bin/strace -p %d 2>&1

最后,虽然到目前为止,关于 "pipe" 类型条目的讨论使用的都是管道和命令,但没有什么可以阻止您使用 shell脚本。您也许甚至可以使用专门为交互式命令 "Y" 设计的新创建的脚本。

例如,随着检视条目数量随时间的推移而增长,当 "选项:" 行超出屏幕宽度时, 该行将被截断。除了使某些选项不可见之外,这一问题不会影响您的操作。但是,如果某些选项因截断而无法显示,但您想查看更多选项,下面解释了一个简单的解决方案。

  检视 暂停于 pid ...
  使用: 左箭头/右箭头然后 <Enter> ...
  选项: 帮助  1  2  3  4  5  6  7  8  9  10  11 ...

top 的 rc 文件中的条目的 ".name" 元素是一个数字编号,而 "help" 条目指向一个您编写的 shell 脚本,解释这些带编号的选项的实际含义。这样就可以使更多选项变为可见。

此配置文件存储尚未保存自己的配置文件的用户的默认设置。文件格式与个人配置文件完全相同,并且还可以包含上面描述的 "检视" 条目。

创建它的过程很简单。

1. 适当地配置您安装好的 top,并使用交互式命令 "W" 保存该配置。

2. 添加并测试任何想要的‘检视’条目。

3. 将此配置文件复制到 /etc/,并命名为‘topdefaultrc’。

该文件的存在将决定向普通用户展示哪一版本的帮助屏幕。

更重要的是,它会限制普通用户在 top 运行时可以执行的操作。他们将无法执行以下命令。

    k        杀死任务
    r        重新设置任务的 nice 值
    d 或 s   更改延迟/睡眠间隔

这个配置文件不应该由 top 创建。相反,需要手动创建它,并将其放置在 /etc/ 目录中,命名为 "toprc"。

它应该只有两行,如下面的例子所示:

    s        # 行 1: 安全模式开关
    5.0      # 行 2: 延迟间隔(秒)

以下环境变量的值并不重要,重要的是它是否存在。

这将阻止显示任何内核线程,并使得此类进程不被计入概览区的任务/线程计数。

这些技巧中的大部分技巧在您提升了 top 的调度优先级之后会更加有效。因此,假设您有相应的权限,请考虑以 -10 的 nice 值启动他。

对于这些傻瓜技巧,top 需要处于全屏模式。

  • 用户界面的提示符和帮助屏幕有意暗示用户延迟只能设置为 0.1 秒的整数倍。事实上,您可以自由设置任何想设置的延迟。如果您想看到 Linux 的调度能力处于最佳状态,请尝试将延迟设置为 0.09 秒或更短。

    要进行此实验,请在 x-windows 下打开 xterm 并将其最大化。然后执行以下操作:

      . 执行以下命令提升调度优先级并设置很小的延迟:
          nice -n -10 top -d.09
      . 保持排序列高亮显示处于 关闭 状态,以使路径长度最短
      . 开启 反色和行高亮显示,以提供更明显的视觉效果
      . 尝试各种排序列(时间 (TIME) 或 MEM 效果很好),
        以及正序或逆序排序,以显示最活跃的进程

    您将看到一个非常繁忙的 Linux 正在做他一直以来为您做的事情,却一直没有可用的程序来展示这一点。

  • 在使用 "黑底白字" 颜色的 xterm 下,在 top 的颜色映射屏幕上将任务颜色设置为黑色,并确保任务高亮设置为加粗,而不是反色。然后将延迟间隔设置为 0.3 秒左右。

    在显示最活跃的进程后,您将仅看到当前正在运行的任务的幽灵一般的图像。

  • 删除现有的 rc 文件,或创建一个新的符号链接。启动这个新版本,然后按下 "T"(一个隐藏命令,参见主题 4c. 任务区命令,排序),然后按下 "W" 和 "q"。最后,使用 -d0(零延迟)重新启动程序。

    您的显示将以三倍于旧版本 top 的速度刷新,也就是 300% 的速度优势。随着 top 在时间 (TIME) 排行榜上越爬越高,请耐心等待,并猜猜看 top 是否最终能攀登到顶峰 (top)。

对于这些傻瓜技巧,top 需要处于备用显示模式。

  • 使 3 到 4 个 任务显示可见,然后选择最后一个窗口以外的任意窗口,然后使用切换命令 "i" 来 关闭 空闲进程。根据您应用 "i" 命令的位置,top 会尽力分配屏幕空间,有时会出现多个任务显示在跳动,有时就像手风琴一样。
  • 以不同的方式设置每个窗口的概览行:一个窗口不显示内存 ("m");另一个不显示状态 ("t");另一个可能什么都没有,只有消息行。然后按住 "a" 或 "w",观看跳动窗口的变种  --  弹跳窗口。
  • 显示所有 4 个窗口,并依次对每个窗口使用切换命令 "i" 关闭 空闲进程。您已进入 "极度跳动" 区域。

这个傻瓜技巧也需要处于备用显示模式。

显示所有 4 个窗口并确保 1:Def 是 "当前" 窗口。然后,使用交互式命令 "n" 不断增加窗口大小,直到所有其他任务显示被 "赶出鸟巢"。

当它们全部被移位后,使用切换命令 "_" 在所有窗口可见/不可见之间切换。然后思考一下:
top 是在撒谎还是诚实地说出您强加的真相?

这个傻瓜技巧在不处于备用显示模式的情况下效果最好,因为对齐是每个窗口单独设置的。

启动 top 并使命令 (COMMAND) 列是最后一个(最右侧)显示的列。如有必要,请使用切换命令 "c" 显示命令行,并使用切换命令 "V" 确保森林视图模式处于活动状态。

然后使用上/下方向键调整显示区域,使得显示的部分命令行被截断(最后一格显示 "+")。您可能需要调整 xterm 的大小才能导致截断。

最后,使用切换命令 "j" 使命令 (COMMAND) 列右对齐。

现在使用右方向键定位到命令 (COMMAND) 列。继续使用右方向键,仔细观察显示的命令行的行进方向。


有些行向左,有些行向右


最终所有行都峰回路转,一起向右

请将错误报告发送到 procps@freelists.org

free(1), ps(1), uptime(1), atop(1), slabtop(1), vmstat(8), w(1)

2025-01-01 procps-ng