简介
top 命令用于实时监视系统的性能和进程信息。它提供了一个动态的、交互式的界面,列出了当前运行的进程,并显示了它们的 CPU
和内存使用情况。通过该命令可以对硬件性能瓶颈做出基本判断。
1. 语法
top
top [参数]
top 有 2 种指定参数方式:
直接指定参数 top -[参数]
交互界面指定参数 top,交互按 [参数]
1.1. 常用参数
-c:显示程序完整命令路径
-p:指定查看某个PID状态(最多指定20个PID,以逗号分割)
-u:指定查看某个用户下的进程
-b:批处理模式操作(默认3s显示一次指定信息)
-d:延迟时间间隔(秒)
-n:迭代次数限制
1.2. 交互命令
h:帮助文档
f:视图设置
q:退出
1:显示各个 CPU 使用情况
P:按 CPU 使用率排序
c:显示 COMMAND 完整命令
i:忽略闲置进程和僵尸进程
T:按使用时间排序
M:按内存使用率排序
e:切换进程使用内存单位(K/M/G/T/P/E/)
E:切换第 4 行总内存单位(K/M/G/T/P/E/)
s:指定刷新时间(单位:s)
U:指定用户
k:kill 某个进程(输入PID)
2. 关键字解释
在学习使用之前,需要先理解各个关键字的意思
2.1. 头部解释
【第 1 行】查看系统负载信息
top - 18:28:46:当前时间
up 9:34 :系统运行时间
4 users :当前用户连接数
load average :平均负载。分别显示1/5/15分钟的负载情况
【第 2 行】查看进程状态
184 total :当前进程总数为 184
1 running :正在运行的进程数为 1
182 sleeping:睡眠的进程数为 182
1 stopped :停止的进程数为 1
0 zombie :僵尸进程数为 0
【第 3 行】查看 CPU 占用情况
0.0 us :用户空间占用的 cpu%
0.3 sy :内核空间占用的 cpu%
0.0 ni :用户进程空间内改变过优先级的进程,占用的 cpu%
99.7 id:空闲的 cpu%
0.0 wa :正在等待中的 cpu%
0.0 hi :硬中断占用的 cpu%
0.0 si :软中断占用的 cpu%
0.0 st :管理程序(hypervisor)为另一个虚拟进程提供服务而等待的虚拟CPU占比
【第 4 行】查看物理内存使用情况(默认单位 KB)
995676 total :物理内存总量
96392 free :剩余的物理内存
527376 used :使用的物理内存
371908 buff/cache:缓冲区正在使用的内存
# 剩余内存(free)公式
total - used - buff/cache = free
# 实际可用内存公式
total - used
【第 5 行】查看交换分区使用情况(默认单位 KB)
2097148 total :交换区总内存 2097148 free :交换区剩余的内存 0 used :交换区使用的内存 297912 avail Mem:交换区可用的内存
这里的交换分区内存和第4行的物理内存是有明显区别的。物理内存是系统中真正的内存,速度非常快;而交换分区的内存只是在硬盘上创建的一个特殊的区域,相当于物理内存的延伸,它的速度是远低于物理内存的。所以,只有当物理内存使用完了才会用到交换分区的内存,换句话说,当使用交换分区就说明物理内存用完了,要及时检查进程,避免系统卡死。
2.2. 内容解释
PID :进程的PID
USER :进程的用户
PR :优先级(rt 表示实时调度优先级)
NI :进程的静态优先级调整值(负数表示优先级高,正数表示优先级低)
VIRT :进程的虚拟内存大小
RES :进程使用的物理内存大小
SHR :进程共享的内存大小
S :进程状态(D:不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
%CPU :进程的 cpu 占用情况
%MEM :进程的物理内存占总内存百分比
TIME+ :进程累计的CPU使用时间(单位1/100秒)
COMMAND:进程名
3. top 交互方法
3.1. 查看cpu信息
查看 cpu 信息直接使用 top 即可,默认是以 cpu 占用率排序。如果切换到其他选项,也可以使用大写 P 切换到以 cpu 排序。
top -c # 交互按 P
# -c 是为了显示进程的详细信息,协助分析问题
通过 cpu 排序可以清晰得知当前正在运行的进程。比如占用最高的是 test.sh 程序
除了查看使用 cpu 最高的进程,还能查看各个 cpu 的详细使用情况
top 交互按 1
cpu 的编号从 0 开始,4个核就是 cpu0~3,这里可以清晰的了解各个 cpu 的详细使用情况。正常情况下,us 值会比 sy 值高得多。如果 sy 比较高,那么程序的调用可能不合理;如果 us 和 sy 都不高,但是 wa 很高,那么可能是磁盘出现了瓶颈,cpu 在等待 IO。
除了观察各个进程的 cpu 使用情况外,还应该观察整体的负载信息
lscpu # 查看cpu信息
top # 第1行查看负载
可以看到本机 cpu 有 4 核,系统负载的 1/5/15 分钟监控分别是 19/11/5 。
cpu 为 4 核可以理解为高速公路上有 4 条道路,使用 cpu 的程序可以理解为高速上的车。按正常情况下,一次性可以通过 4 辆车,如果超过 4 辆则会阻塞,而这些阻塞的车就是系统负载。
从结果来看,1分钟监控有19个负载,也就是说前面的车辆后面排了19辆,4条道路 19 / 4 = 4.75,也就是每个 cpu 后面还有 5 个程序在等待着,所以造成了负载。
正常来讲,负载小于 cpu数 * 2 可以接受,如果大于这个数则需要关注程序的执行情况了,这可能会使上下文切换严重,导致性能下降。
3.2. 查询内存信息
top 可以查看整体的内存使用情况和各个进程使用的内存情况,并分析是否存在内存泄漏。
top -c # 交互按 M
# -c 是为了显示进程的详细信息,协助分析问题
从头部信息第 4、5 行可以看到整体的内存使用情况。如果 free 剩余内存越多,说明可用的内存越多;如果 used 使用内存越多,说明真正还能用的内存越少;buff/cache 是缓存的大小,是将一部分空闲的物理内存用于存放最近使用过的文件数据和文件系统元数据放在这里,用来提高系统性能和响应速度,当 free 不足时,系统会自动清理 buff/cache 的缓存,所以缓存的数据+剩余内存才是系统实际可用的大小。
第5行的交换分区在头部解释中已说明,使用当物理内存不够才会使用交换分区。
交互按下 M 键后,所有的进程都是以内存使用占比来排序,体现在 %MEM 列。举个例子:当发现机器很卡怎么处理?
使用 top 查看整体内存,查看 free 是否已经很小。
当可用内存很小时,按 M 键查看占用内存最多的进程,如果该进程可有可无,kill 即可
判断某个进程是否发生内存泄漏我们通过 VIRT、RES、SHR 来判断。一般来说一个程序在启动的时候就已经规划好了使用大小,启动程序后可以在 VIRT 中查看大小。正常情况下该程序的所有进程 RES 不会超过 VIRT 起始分配的大小,并且存在多个进程时,它们的内存都是共享的,可以通过 SHR 来判断。所以,判断的方法如下:
记录起始的 VIRT 大小
查看进程的 RES 是否持续增长,如果超过了起始 VIRT 还在增长,那么需要关注
程序的多个进程的内存是共享的,如果其中某个进程 RES 远大于 SHR,也需要关注
需要注意的是 %MEM 占比是当前进程使用的内存除以总内存,由于很多进程的内存都是共享的,所以全部百分比加起来可能超过了 100%,这是正常的。
3.3. 查看某个用户信息
查看某个用户信息可以通过参数或交互参数实现
# 方法一
top -U [用户名]
# 方法二
top 交互下按U键,输入用户名
直接指定某个用户后,显示的进程不会包含其他用户,当然,按 cpu 或内存排序依然不受影响。
4. 批处理模式
这是一种非交互方式运行的 top 命令,一般自动化脚本或需要记录某个进程信息时使用,下面介绍几个常用案例。参数如下
-b:指定批处理模式
-d:指定间隔时间(s)
-n:指定监控次数(不指定则一直监控)
4.1. 按cpu排序的进程
top -b -d 2 -o %CPU
-b:指定批处理模式
-d:每2s输出一次
-o:指定以cpu排序(实际上不指定也行,默认是cpu排序)
可以看到 top 会将全部进程显示,所以显得非常繁琐。我们可以让其只显示一次,只查看前10的进程
top -b -n 1 | head -17 | tail -11
还可以指定某个用户
top -b -d 2 -U yt
4.2. 按内存排序的进程
按内存排序的方法与cpu方法一样,只是换成 -o %MEM
top -b -d 2 -U yt -o %MEM
4.3. 按PID查看进程
批处理模式按 PID 查看是最实用的方法,但 PID 最多支持20个,以逗号分割。
【案例一】指定PID按cpu排序
top -b -c -d 2 -n 5 -o %CPU -p 2093,2092,2022
-b:指定批处理模式
-c:显示进程详细信息
-d:间隔2s输出一次
-n:总共输出5次
-o:指定cpu排序
-p:指定PID,以逗号分割
【案例二】指定PID按内存排序
top -b -c -d 2 -n 5 -o %MEM -p 2093,2092,2022