想要找出您的机器上正在运行什么——以及哪个进程占用了所有内存并导致速度变慢——top
实用程序可以很好地完成这项任务。
top
是一个非常有用的程序,其作用类似于 Windows 任务管理器或 MacOS 的活动监视器。在您的 *nix 机器上运行 top
将向您显示系统上正在运行的进程的实时视图。
$ top
根据您运行的 top
版本,您会得到类似这样的结果
top - 08:31:32 up 1 day, 4:09, 0 users, load average: 0.20, 0.12, 0.10
Tasks: 3 total, 1 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.5 us, 0.3 sy, 0.0 ni, 99.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 4042284 total, 2523744 used, 1518540 free, 263776 buffers
KiB Swap: 1048572 total, 0 used, 1048572 free. 1804264 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 21964 3632 3124 S 0.0 0.1 0:00.23 bash
193 root 20 0 123520 29636 8640 S 0.0 0.7 0:00.58 flask
195 root 20 0 23608 2724 2400 R 0.0 0.1 0:00.21 top
您的 top
版本可能与此不同,尤其是在显示的列方面。
如何阅读输出
您可以根据输出来判断您正在运行什么,但是尝试解释结果可能会有点令人困惑。
前几行包含一堆统计信息(详细信息),然后是一个包含结果列表的表格(列表)。让我们从后者开始。
列表
这些是在系统上运行的进程。默认情况下,它们按 CPU 使用率降序排列。这意味着列表顶部的项目正在使用更多的 CPU 资源,并给您的系统带来更多的负载。它们实际上是按资源使用率排列的“顶部”进程。您不得不承认,这是一个聪明的名字。
最右侧的 COMMAND
列报告进程的名称(您运行以启动它们的命令)。在本例中,它们是 bash
(我们正在其中运行 top
的命令解释器)、flask
(一个用 Python 编写的 Web 微框架)和 top
本身。
其他列提供有关进程的有用信息
PID
:进程 ID,用于寻址进程的唯一标识符USER
:运行进程的用户PR
:任务的优先级NI
:优先级的更友好的表示形式VIRT
:虚拟内存大小,单位为 KiB (千字节)*RES
:常驻内存大小,单位为 KiB*(“物理内存”,是 VIRT 的子集)SHR
:共享内存大小,单位为 KiB*(“共享内存”,是 VIRT 的子集)S
:进程状态,通常 I=空闲,R=运行,S=睡眠,Z=僵尸,T 或 t=停止(还有其他不太常见的选项)%CPU
:自上次屏幕更新以来 CPU 使用率的百分比%MEM
:自上次屏幕更新以来RES
内存使用率的百分比TIME+
:自进程启动以来使用的总 CPU 时间COMMAND
:命令,如上所述
*确切了解 VIRT
、RES
和 SHR
值代表什么在日常操作中并不真正重要。重要的是要知道 VIRT
值最大的进程是使用最多内存的进程。如果您运行 top
是因为您正在调试为什么您的计算机感觉像是在一池糖浆中,那么 VIRT
数字最大的进程就是罪魁祸首。如果您想确切了解“共享”和“物理”内存的含义,请查看 top 手册 中的“Linux 内存类型”。
而且,是的,我确实想输入千比字节,而不是千兆字节。您通常称为千字节的 1,024 值实际上是千比字节。希腊语 kilo (“χίλιοι”) 意思是千,表示 1,000 个某物(例如,一公里是一千米,一公斤是一千克)。Kibi 是 kilo 和 byte 的组合词,它表示 1,024 字节(或 210)。但是,由于单词很难说,许多人在表示 1,024 字节时会说千字节。所有这些都意味着 top
试图在此处使用正确的术语,所以请接受它。#你知道的越多?。
关于屏幕更新的说明
实时屏幕更新是 Linux 程序可以做的客观上非常酷的事情之一。这意味着它们可以实时更新自己的显示,因此它们看起来是动画的。即使它们使用的是文本。太酷了!在我们的例子中,更新之间的时间很重要,因为我们的一些统计信息(%CPU
和 %MEM
)是基于自上次屏幕更新以来的值。
而且由于我们在持久应用程序中运行,我们可以按下按键命令来实时更改设置或配置(而不是,例如,关闭应用程序并使用不同的命令行标志再次运行应用程序)。
键入 h
会调用“帮助”屏幕,该屏幕也显示默认延迟(屏幕更新之间的时间)。默认情况下,此值为(大约)三秒,但您可以通过键入 d
(可能是“延迟”的缩写)或 s
(可能是“屏幕”或“秒”的缩写)来更改它。
详细信息
在进程列表上方,还有一大堆其他有用的信息。其中一些详细信息可能看起来很奇怪且令人困惑,但是一旦您花一些时间逐步了解每一个细节,您会发现它们是非常有用的统计数据,可以在紧要关头调出。
第一行包含常规系统信息
top
:我们正在运行top
!你好top
!XX:YY:XX
:时间,每次屏幕更新时都会更新up
(然后是X 天,YY:ZZ
):系统的正常运行时间,或自系统启动以来经过的时间load average
(然后是三个数字):过去一分钟、五分钟和十五分钟的系统负载,分别为
第二行 (Tasks
) 显示有关正在运行的任务的信息,这很容易理解。它显示了进程总数以及正在运行、睡眠、停止和僵尸进程的数量。这实际上是上面描述的 S
(状态)列的总和。
第三行 (%Cpu(s)
) 显示按类型分隔的 CPU 使用率。数据是屏幕刷新之间的值。这些值是
us
:用户进程sy
:系统进程ni
:nice 用户进程id
:CPU 的空闲时间;高空闲时间意味着没有太多其他事情发生wa
:等待时间,或花费在等待 I/O 完成上的时间hi
:花费在等待硬件中断上的时间si
:花费在等待软件中断上的时间st
:“虚拟机从虚拟机监控程序窃取的时间”
您可以通过键入 t
(“切换”的缩写)来折叠 Tasks
和 %Cpu(s)
行。
第四行 (KiB Mem
) 和第五行 (KiB Swap
) 提供有关内存和交换的信息。这些值是
总计
已用
可用
还有
- 内存
buffers
- 交换
cached Mem
默认情况下,它们以 KiB 列出,但是按 E
(“扩展内存缩放”的缩写)会在不同的值之间循环:千比字节、兆比字节、吉比字节、太比字节、拍比字节和艾比字节。(也就是说,千字节、兆字节、千兆字节、兆兆字节、拍字节和艾字节,但它们的“真名”。)
top
用户手册显示了有关有用的标志和配置的更多信息。要在您的系统上找到手册,您可以运行 man top
。有各种网站显示 手册的 HTML 渲染,但请注意,这些可能适用于不同版本的 top。
两个 top 替代方案
您不必总是使用 top
来了解正在发生的事情。根据您的情况,其他工具可能会帮助您诊断问题,尤其是在您想要更图形化或更专业的界面时。
htop
htop
与 top
非常相似,但它带来了一些非常有用的东西:CPU 和内存使用情况的图形表示。

这就是我们在 top
中检查的环境在 htop
中的外观。显示更简单,但功能仍然丰富。
我们的任务计数、负载、正常运行时间和进程列表仍然存在,但是我们获得了每个核心的 CPU 使用率以及内存使用情况图表的漂亮、彩色、动画视图。
以下是不同颜色的含义(您也可以通过按 h
获取“帮助”来获得此信息)。
CPU 任务优先级或类型
- 蓝色:低优先级
- 绿色:正常优先级
- 红色:内核任务
- 蓝色:虚拟化任务
- 条形图末尾的值是已用 CPU 的百分比
内存
- 绿色:已用内存
- 蓝色:缓冲内存
- 黄色:缓存内存
- 条形图末尾的值显示已用内存和总内存
如果颜色对您没有用,您可以运行 htop -C
来禁用它们;相反,htop
将使用不同的符号来分隔 CPU 和内存类型。
在底部,有一个有用的活动功能键显示,您可以使用这些功能键来执行诸如过滤结果或更改排序顺序之类的操作。尝试一些命令以查看它们的作用。在尝试 F9
时要小心。这将弹出一个信号列表,该列表将杀死(即停止)进程。我建议在生产环境之外探索这些选项。
htop
的作者 Hisham Muhammad(是的,它在 Hisham 之后被称为 htop
)在 2 月的 FOSDEM 2018 上就 htop
发表了 闪电演讲。他解释了 htop
不仅具有简洁的图形,而且还展示了有关进程的更现代的统计信息,而较旧的监视实用程序(如 top
)则没有。
您可以在 手册页 或 htop 网站 上阅读有关 htop
的更多信息。(警告:该网站包含 htop
的动画背景。)
docker stats
如果您正在使用 Docker,则可以运行 docker stats
以生成容器正在执行的操作的上下文丰富的表示形式。
这可能比 top
更有帮助,因为它是按容器而不是按进程分隔的。当容器速度较慢时,这尤其有用,因为查看哪个容器正在使用最多的资源比运行 top
并尝试将进程映射到容器更快。
上面对 top
和 htop
中首字母缩略词和描述符的解释应该使您很容易理解 docker stats
中的那些。但是,docker stats 文档 提供了每个列的有用描述。
1 条评论