Contents

Linux中Top命令简介

1. 概述

我们经常发现自己处于需要了解系统中每个进程和线程的资源使用情况的情况。例如,我们可能想知道哪个进程正在减慢我们的系统。

在本教程中,我们将了解如何使用top 命令获得这种洞察力。

2. 默认界面

我们可以通过简单地在命令行中输入top来使用top ,之后我们将获得一个交互式界面:

top
top - 04:05:27 up 3 days, 12:02,  1 user,  load average: 0.55, 1.06, 1.27
Tasks: 362 total,   2 running, 290 sleeping,   0 stopped,   0 zombie
%Cpu(s): 35.8 us, 10.7 sy,  0.0 ni, 52.4 id,  0.3 wa,  0.0 hi,  0.7 si,  0.0 st
KiB Mem :  8060436 total,   150704 free,  4438276 used,  3471456 buff/cache
KiB Swap:  2097148 total,  1656152 free,   440996 used.  2557604 avail Mem 
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
32081 abhishe+  20   0  879676 198164 106096 S 152.6  2.5   0:10.16 chrome
  582 abhishe+  20   0   51448   4088   3372 R  15.8  0.1   0:00.04 top
  503 root     -51   0       0      0      0 S   5.3  0.0  11:05.61 irq/130-iwlwifi
  875 message+  20   0   53120   5900   3204 S   5.3  0.1  10:10.14 dbus-daemon
 6855 abhishe+  20   0 1564544 170444  22924 S   5.3  2.1  75:21.88 deluge-gtk
    1 root      20   0  225840   7200   4720 S   0.0  0.1   4:51.28 systemd
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.20 kthreadd
    4 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 kworker/0:0H
    6 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 mm_percpu_wq

此交互式屏幕分为四个部分:

  1. 概括
  2. 字段/列标题
  3. 输入/消息行
  4. 任务

2.1. 概括

第一行包括五件事:

  • 窗口名称
  • 当前时间
  • 自上次启动以来的时间长度
  • 用户总数,以及
  • 过去 1、5 和 15 分钟的平均系统负载
top - 04:05:27 up 3 days, 12:02, 1 user, load average: 0.55, 1.06, 1.27

我们可以看到第二行给出了各种进程和线程的计数,分为四类:running, sleeping, stopped , zombie

下一行告诉我们 CPU 状态百分比,即用户和内核进程占用的时间:

Tasks: 362 total, 2 running, 290 sleeping, 0 stopped, 0 zombie
%Cpu(s): 35.8 us, 10.7 sy, 0.0 ni, 52.4 id, 0.3 wa, 0.0 hi, 0.7 si, 0.0 st

上例中各种符号的含义是CPU运行各种进程所花费的时间:

  • us – 用户进程(没有任何用户定义的优先级定义的用户进程 –非 niced 用户进程
  • sy——内核进程
  • is——漂亮的用户进程
  • id – 内核空闲处理程序
  • wa – I/O 完成
  • hi- 硬件中断
  • si——软件中断
  • st – 管理程序从该 VM 窃取的时间

我们可以注意到第 4 行描述了物理内存的状态;而第 5 行描述了虚拟内存:

KiB Mem : 8060436 total, 150704 free, 4438276 used, 3471456 buff/cache
KiB Swap: 2097148 total, 1656152 free, 440996 used. 2557604 avail Mem

3. top标题

正如我们在上面给出的示例中看到的,有各种字段描述各种进程和线程的状态。

让我们一一了解这些标头的含义:

  • PID (进程 ID):由**task_struct定义的任务的唯一 ID——内核使用它来标识任何进程
  • USER(用户名):任务所有者的有效用户名
  • PR (Priority):任务的调度优先级。该字段下的rt值表示任务正在实时调度优先级下运行
  • NI(Nice Value):也描述了任务的优先级。PRNI之间的区别在于PR是内核所看到的进程的真正优先级,而NI只是内核的优先级提示。负 nice 值意味着更高的优先级,而正 nice 值意味着更低的优先级
  • TIME+ (CPU Time):描述了任务从启动到现在总共使用的CPU时间,粒度为百分之一秒
  • COMMAND(命令名称):显示用于启动任务的命令行或关联程序的名称

3.1. 内存头

用于总结与内存相关的各种参数的标头如下所述:

  • VIRT(以 KiB 为单位的虚拟内存大小):描述任务使用的虚拟内存总量。虚拟内存包括所有代码、数据和共享库。它还包括已换出的页面和已映射但未使用的页面
  • RES (以 KiB 为单位的常驻内存大小):代表虚拟内存空间 ( VIRT )的子集,表示任务当前正在使用的非交换物理内存
  • SHR(以 KiB 为单位的共享内存大小):代表常驻内存 ( RES ) 的子集,可由其他进程使用
  • %CPU(CPU 使用率):代表自上次屏幕更新后任务占用的 CPU 时间份额,以占总 CPU 时间的百分比表示。当top未在线程模式下运行时,可以为多线程进程报告大于 100% 的值
  • %MEM (Memory Usage -RES):任务当前可用物理内存的份额

4.交互命令

我们可以使用各种命令与top界面进行交互:

  • 最简单的方法是按h按钮查看帮助菜单。
  • 我们可以使用ds按钮来更改**top的刷新率。默认刷新率为 3.0 秒。
  • 要从top界面退出,我们可以按q按钮。

我们可以通过按k按钮终止任务,之后“输入行”将被激活,我们需要输入任务的PID

我们还可以通过按r按钮更改任务的renice 值。之后,我们将输入PID,然后输入该任务的renice 值。普通用户只能增加nice值,不能降低。

我们可以通过按EKiB更改用于在摘要区域中显示内存的单位:

MiB Mem : 7871.520 total,  995.176 free, 4501.594 used, 2374.750 buff/cache
MiB Swap: 2047.996 total, 1607.332 free,  440.664 used. 2275.230 avail Mem

要更改任务区中使用的内存单元,我们可以按e

22011 abhishe+  20   0 4049.7m 266.1m 138.3m S  13.2  3.4  18:08.67 gnome-shell
  920 cyberea+  20   0 2545.5m 110.4m   8.6m S   7.9  1.4  92:37.54 cybereason-sens
 1554 abhishe+  20   0  489.2m  69.9m  53.0m S   6.6  0.9  97:43.26 Xorg
 6855 abhishe+  20   0 1536.8m 174.6m  21.6m S   6.6  2.2  85:00.29 deluge-gtk
23393 abhishe+  20   0 1689.2m 197.4m  63.4m S   6.0  2.5   3:09.83 _Postman

这两者都会导致内存单元从 KiB 开始一直循环到 EiB(exbibytes)。

4.1. 全局模式

在各种情况下都有不同的模式,其中之一是线程模式

默认情况下,top显示每个进程中所有线程的总和。我们可以通过按H按钮来更改它。在此top之后将显示每个进程的各个线程:

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 6855 abhishe+  20   0 1573660 178760  22124 S  2.6  2.2  45:11.77 deluge-gtk
 6899 abhishe+  20   0 1573660 178760  22124 S  2.3  2.2  37:41.68 deluge-gtk

正如我们在前面的示例中注意到的那样,由于未显示底层线程,因此仅提及一次名为deluge的应用程序,而在此示例中,我们可以看到该应用程序使用了两个不同的线程。

另一种模式是Solaris 模式,可以通过按I按钮将其关闭。在此模式下运行时,任务的 CPU 使用率将除以 CPU 总数。

4.2. 与任务窗口的交互

我们可以通过按f按钮更改显示的字段及其顺序。字段菜单将打开,然后我们可以选择要显示的字段、它们的顺序、按字段排序等。

top提供的最有用的视图之一是Forest View Mode。在这种模式下,任务将像树一样排序,所有子任务将在各自的父任务下对齐:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0  225840   7196   4716 S   0.0  0.1   5:46.79 systemd
  283 root      19  -1  148972  37300  36300 S   0.0  0.5   0:23.01  `- systemd-journal
  336 root      20   0   47060   4000   2528 S   0.0  0.0   0:01.10  `- systemd-udevd
  862 systemd+  20   0  146112   1276   1208 S   0.0  0.0   0:00.35  `- systemd-timesyn
  864 systemd+  20   0   71072   4556   3916 S   0.0  0.1   0:12.47  `- systemd-resolve
  867 root      20   0   70728   3732   3448 S   0.0  0.0   0:03.05  `- systemd-logind
  871 root      20   0   38428   2748   2652 S   0.0  0.0   0:00.27  `- cron

我们可以使用x键来突出显示已排序的字段。我们可以使用*><分别将已排序的字段向右或向左更改。一些字段具有用于排序的直接键绑定,M代表%MEM*,N代表PIDP代表*%CPU*,T代表TIME+

5. 命令行选项

我们可以通过传递*-b标志以批处理模式使用top*。在批处理模式下,top 不接收任何输入并将运行直到程序被终止。这对于将top命令的输出传递给其他程序或文件非常有用。

要固定迭代次数,我们可以使用*-n*标志:

top -b -n10

要更改刷新率,我们可以使用*-d*标志。我们可以使用带有此标志的小数秒:

top -d2.5

要查看top支持的所有输出字段,我们可以使用*-O*标志:

top -O
PID
PPID
UID
USER
... more output omitted

我们可以使用这些字段名称通过在*-o*标志之后传递它来定义排序顺序。所以,如果我们想按虚拟内存对 top 的输出进行排序,我们可以使用:

top -o VIRT
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
23584 abhishe+  20   0 14.593g 554600  58412 S   2.3  6.9  10:25.55 _Postman
22011 abhishe+  20   0 4142400 277884 141424 S   0.7  3.4  22:00.86 gnome-shell
 1183 gdm       20   0 3664328 114104  72160 S   0.0  1.4   6:33.79 gnome-shell
 2008 abhishe+  20   0 2782760  22520  15096 S   0.0  0.3   0:35.15 copyq

接下来,我们可以根据PID、用户等使用各种过滤器来监视任务。要根据PID过滤任务,我们可以使用*-p标志最多传递 20 个PID*:

top -p23584,22011
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
22011 abhishe+ 20 0 4144624 276900 141368 S 6.2 3.4 22:16.92 gnome-shell
23584 abhishe+ 20 0 14.593g 554600 58412 S 0.0 6.9 10:29.91 _Postman

最后,要根据用户进行过滤,我们可以使用*-u*标志:

top -u root
PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
503 root     -51   0       0      0      0 S   6.2  0.0  12:55.09 irq/130-iwlwifi
  1 root      20   0  225840   7196   4716 S   0.0  0.1   5:43.72 systemd