介绍

top 命令经常用来监控 linux 的系统状况, 是常用的性能分析工具, 能够实时显示系统中各个进程占用情况。

命令详解

参数解释

  • -d : number 代表秒数, 表示 top 命令显示的页面更新一次的时间. 默认是5秒.
  • -b : 以批次的方式执行 top
  • -n : 与 -b 配合使用, 表示需要进行几次 top 命令输出结果.
  • -p : 指定特定的 pid 进程号进行观察.

在top命令显示的页面还可以输入以下按键执行相应的功能(注意大小写区分的)

  • ? : 显示在 top 当中可以输入的命令
  • P: 以 CPU 的使用资源排序显示
  • M : 以内存的使用资源显示
  • N : 以 pid 排序显示
  • T : 由进程使用时间累计排序显示
  • k : 给某一个 pid 一个信号, 可以用来杀死进程
  • r : 给某个 pid 重新定制一个 nice 值
  • q : 退出 top (用 ctrl+c 也可以退出)

输出介绍

image.png

前5行汇总信息

前5行为总体的统计信息,具体介绍如下:

1.top - 15:54:51 up 37 days, 5:30, 14 users, load average: 0.52, 0.42, 1.55

内容 含义
15:54:51 up 37 days, 5:30 当前时间为15点54分51秒,系统持续运行了37天5小时30分钟
14 users 当前登录用户数
load average: 0.52, 0.42, 1.55 系统负载, 即任务队列的平均长度, 三个数值分别为 1 分钟, 5 分钟, 15分钟前到现在的平均值,数字越大,表名负载越大。

load average : 如果这个数除以逻辑 CPU 的数量, 如果高于 5 的时候表明系统在超负荷运转了。
负载是对系统执行的计算工作量的度量。在Linux上,负载是在任何给定时刻处于 R 和 D 状态的进程数。load average值为您提供了必须等待多长时间才能完成任务的相对度量。这里有几个小例子,我们来直观的理解下这两个概念。

  • 在单核心系统上,load average 为 0.4 意味着系统只完成了它能完成的 40% 的工作。load average为 1 意味着系统正好处于满负荷状态——即使添加一点点额外的工作,系统也会过载。一个 load average 为 2.12 的系统意味着它超载了 112% 的工作,超出了它的处理能力。
  • 在多核系统上,应该首先用 load average 除以 CPU 核数,以得到类似的度量。

2.Tasks: 245 total, 1 running, 244 sleeping, 0 stopped, 0 zombie

内容 含义
245 total 当前系统正在运行的进程总数
1 running 正在运行的进程数
244 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸的进程数

进程执行是 I/O 限制的工作(如读取磁盘)和 cpu 限制的工作(如执行算术操作)的混合模式。当一个进程执行 I/O 时,CPU 是空闲的,所以 os 在这段时间切换到执行其他进程。此外,该操作系统允许一个给定的进程执行非常短的时间,然后它切换到另一个进程。这就是操作系统“多任务处理”的表现。做所有这些需要我们跟踪流程的“状态”。在 Linux 中,进程可能处于以下状态:
1、Runnable (R): 处于这种状态的进程要么在 CPU 上执行,要么存在于运行队列中,准备执行。
2、Interruptible sleep(S): 处于这种状态的进程在等待事件完成。
3、Uninterruptible sleep (D): 在这种情况下,一个进程正在等待一个 I/O 操作完成。
4、Stopped (T): 这些进程已经被一个作业控制信号(如按 Ctrl+Z)停止,或者因为它们正在被跟踪。
5、Zombie (Z): 僵尸进程,一个进程可以创建许多子进程,当父进程仍然存在时,这些子进程是可以退出的,但是,这些数据结构必须保留下来,直到父进程获得子进程的状态。这种数据结构仍然存在的终止进程称为僵尸进程。D 和 S 状态都是在 top 信息中体现为 sleeping,T 状态体现为 stopped,Z 状态体现为 zombie。

3.%Cpu(s): 2.3 us, 2.2 sy, 0.0 ni, 95.4 id, 0.1 wa, 0.0 hi, 0.1 si, 0.0 st

内容 含义
2.3 us 用户空间占用 CPU 百分比
2.2 sy 内核空间占用 CPU 百分比
0.0 ni 用户进程空间内改变过优先级的进程占用 CPU 百分比
95.4 id 空闲 CPU 百分比
0.1 wa 等待输入输出的 CPU 时间百分比
0.0 hi 硬中断 (Hardware IRQ) 占用 CPU 的百分比
0.1 si, 0.0 st 软中断 (Software Interrupts) 占用 CPU 百分比
  1. KiB Mem : 65808032 total, 25927004 free, 38146216 used, 1734812 buff/cache | 内容 | 含义 | | —- | —- | | 65808032 total | 物理内存总量 | | 25927004 free | 空闲内存总量 | | 38146216 used | 使用的内存物理总量 | | 1734812 buff/cache | 作为内核缓存的内存量 |

Mem 和 Swap 分别显示的是 RAM 和 swap 空间信息;当 RAM 使用率接近满时,RAM 中不经常使用的区域将被写入 Swap 空间,以便稍后需要时检索。但是,由于访问磁盘的速度很慢,过分依赖 Swap 可能会损害系统性能。

  1. KiB Swap: 8257532 total, 4351592 free, 3905940 used. 27117500 avail Mem | 内容 | 含义 | | —- | —- | | 8257532 total | 交换区总量 | | 4351592 free | 空闲的交换区总量 | | 3905940 used | 使用的交换区总量 | | 27117500 avail Mem | 代表可用于进程下一次分配的物理内存数量 |

关于 Swap

  • 物理内存就是计算机的实际内存大小,由RAM芯片组成的。虚拟内存则是虚拟出来的、使用磁盘代替内存。虚拟内存的出现,让机器内存不够的情况得到部分解决。当程序运行起来由操作系统做具体虚拟内存到物理内存的替换和加载(相应的页与段的虚拟内存管理)。这里的虚拟内存即所谓的 swap;
  • 当用户提交程序,然后产生进程,在机器上运行。机器会判断当前物理内存是否还有空闲允许进程调入内存运行,如果有那么则直接调入内存进行运行;如果没有,那么会根据优先级选择一个进程挂起,把该进程交换到swap中等待,然后把新的进程调入到内存中运行。根据这种换入和换出,实现了内存的循环利用,让用户感觉不到内存的限制。从这也可以看出swap扮演了一个非常重要的角色,就是暂存被换出的进程。
  • 内存与swap之间是按照内存页为单位来交换数据的,一般Linux中页的大小设置为4kb。而内存与磁盘则是按照块来交换数据的。

进程信息

image.png

内容 含义
PID 进程 id
PPID 父进程 id
RUSER real user name
UID 进程所有者的用户id
USER 进程所有者的用户名
GROUP 进程所有者的组名
TTY 启动进程的终端名称. 不是从终端启动的进程显示为 ?
PR 优先级
NI nice 值, 负值表示最高优先级, 正值表示低优先级
P 最后使用的CPU, 仅在多 CPU 环境下有意义
%CPU 上次更新到现在的 CPU 时间占用百分比
TIME 进程使用的 CPU 时间总计, 单位 秒
TIME+ 进程使用的 CPU 时间总计, 单位 1/100秒
%MEM 进程使用的物理内存百分比
VIRT 进程使用的虚拟内存总量, 单位 kb, VIRT = SWAP + RES
SWAP 进程使用的虚拟内存中, 被换出的大小 单位 kb
RES 进程使用的, 未被换出物理内存的的大小, 单位 kb. RES = CODE + DATA
CODE 可执行代码占用物理内存大小, 单位 kb
DATA 可执行代码以外的部分(数据段 + 栈) 占用的物理内存大小, 单位 kb
SHR 共享内存大小, 单位 kb
nFLT 页面错误次数
nDRT 最后一次写入到现在, 被修改过的页面
S 进程状态. D = 不可中断的睡眠状态, R = 运行, S = 睡眠, T = 跟踪/停止, Z = 僵尸进程
COMMAND 命令名/命令行
WCHAN 若该进程在睡眠, 则显示睡眠中的系统函数名
FLAGS 任务标志

VIRT, RES, SHR and %MEM
VIRT、RES、SHR 这三个字段都与进程的内存消耗有关。VIRT是一个进程所消耗的内存总量。这包括程序代码、进程在内存中存储的数据,以及已经 swap 到磁盘的任何内存区域。RES是进程在 RAM 中消耗的内存,%MEM 表示这个值占总可用 RAM 的百分比。最后,SHR 是与其他进程共享的内存量。

如何改变进程显示字段?
在 top 基本视图中, 敲击 F 进入另一个视图, 在这里可以编辑基本视图中显示字段。

常见用法

常用快捷键

进入top界面后,可以使用如下快捷键:

内容 含义
q 退出
s 修改刷新时间,默认3秒刷新一次,按空格立即刷新
P 按CPU排序
M 按内存排序
T 按时间排序
p 进程IP, 查看某个进程状态
1 显示每个内核的CPU使用率
u/U 指定显示的用户
h 帮助

排序进程列表

使用像 top 这样的工具的一个最常见的原因是找出哪个进程消耗的资源最多。我们可以按以下键排序列表:

  • M:用于按内存使用情况排序
  • P:来按CPU使用率排序
  • N:按进程ID排序
  • T:来按运行时间排序

默认情况下,top 按降序显示所有结果,但是我们可以通过按R键切换到升序。还可以使用 -o 开关对列表进行排序。例如,如果想排序进程的CPU使用量,可以这样做:top -o %CPU

监控指定进程

  1. top -p xxxx

查看线程情况

  1. top -H -p xxxx

参考

https://juejin.cn/post/6963162384169074718
https://juejin.cn/post/6889817932633735181
https://juejin.cn/post/6973423622815744031#heading-10