文章目录
- 介绍
- 常用选项
- 交互命令
- 参考示例
- 示例 1:直接输入命令 `top` 就可以动态显示进程信息
- 统计参数信息详解
- 进程属性说明(即进程列表的字段说明)
- 其它
- 1.在 top 基本视图中,按键盘数字 `1` 可以监控每个逻辑 CPU 的状况
- 2.敲击键盘 `b`,打开关闭加亮效果,top 视图变换如下:
- 3.敲击键盘 `x` 打开/关闭排序列的加亮效果,top 视图变换如下:
- 4.改变 top 基本视图中的进程显示字段
- 5.使用命令 sar 报告每个 CPU 的状态
- 6.使用命令 mpstat 显示各个可用 CPU 的状态:
- 7.使用命令 cat 查看某个进程的详情
介绍
top 命令是 Linux 下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,常用于服务端性能分析。
在 top 命令中按 f
,可以修改显示的列,按对应字母来开启/关闭列,大写字母表示开启,小写字母表示关闭。带 *
号的是默认列。
通俗点说,Linux 中的 top 命令就像是 Windows 中的任务管理器。它会以列表的形式展示出系统的当前状态以及进程信息,并且定时刷新,同时也支持一些交互性的操作。
常用选项
选项 | 说明 |
---|---|
-b | 以批处理模式操作 |
-c | 显示完整的治命令 |
-d | 屏幕刷新间隔时间 |
-I | 忽略失效过程 |
-s | 保密模式 |
-S | 累积模式 |
-i<时间> | 设置间隔时间 |
-u<用户名> | 指定用户名 |
-p<进程号> | 指定进程 |
-n<次数> | 循环显示的次数 |
交互命令
在top命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了 -s
选项, 其中一些命令可能会被屏蔽。
选项 | 说明 |
---|---|
CTRL+L | 刷新整个屏幕,重新开始显示 |
h 或者 ? | 显示帮助 |
k | 终止一个进程,杀掉进程。输入 k 之后,会提示用户输入 PID 及要发送哪种信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽 |
i | 忽略闲置和僵死进程,这是一个开关式命令 |
q | 退出 top 程序 |
r | 重新安排一个进程的优先级别,重新设置进程优先级,即 renice。输入 r 之后,会提示用户输入 PID 及新的 nice 值。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10 |
S | 切换到累计模式 |
s | 改变两次刷新之间的延迟时间(单位为 s),改变刷新周期,更改刷新间隔时间。输入 s 之后,会提示用户输入新的刷新周期,单位为秒。如果有小数,就换算成 ms。输入 0 值则系统将不断刷新,默认值是 5s |
f/F | 从当前显示中添加或者删除项目。添加或删除进程列表中的列。输入 f 之后会显示字母与列的映射表,再输入对应字母就可以开关相应的列。 |
o/O | 改变显示项目的顺序 |
l | 切换显示平均负载和启动时间信息,切换显示界面中第一行信息(时间和平均负载),隐藏或显示第一部分第一行 top 信息 |
m | 切换显示内存信息,关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示 |
t | 切换显示进程和 CPU 状态信息,隐藏或显示第一部分第二行 Tasks 和第三行 Cpus 信息 |
c | 切换显示命令名称和完整命令行 |
M | 根据驻留内存大小进行排序,按%MEM对进程排序,就是以内存占用率大小的顺序排列进程列表 |
P | 根据CPU使用百分比大小进行排序,即以 CPU 占用率大小的顺序排列进程列表 |
T | 根据时间/累计时间进行排序,按TIME+对进程排序 |
w | 将当前设置写入~/.toprc文件中 |
空格 | 立即刷新信息 |
n | 设置进程列表中的显示数量 |
u | 指定在进程列表中只显示对应用户的进程 |
1 | 切换展开CPU统计信息。展开后,会分别显示CPU每个逻辑核心的占用 |
N | 按PID的大小对进程排序 |
H | 切换在进程列表中显示所有线程信息 |
参考示例
示例 1:直接输入命令 top
就可以动态显示进程信息
[root@htlwk0001host ~]# top
直接得到如下结果:
top - 22:29:09 up 201 days, 12:27, 4 users, load average: 0.00, 0.00, 0.00
Tasks: 129 total, 1 running, 128 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.2 hi, 0.0 si, 0.0 st
MiB Mem : 3635.0 total, 167.1 free, 1510.5 used, 1957.4 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 1842.6 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 545465 root 20 0 803208 11376 4664 S 0.3 0.3 27:29.87 aliyun-service 785225 root 10 -10 182296 29176 10860 S 0.3 0.8 60:21.74 AliYunDun 1 root 20 0 179148 9736 6740 S 0.0 0.3 12:37.12 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:02.72 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
统计参数信息详解
第一行,任务队列信息,同 uptime 命令的执行结果一样
top - 09:44:56 # 当前系统时间
up 201 days # 系统已经运行了 201 天
4 users # 当前登录用户数 4 个
load average: 9.59, 4.75, 1.92 # 系统负载,即任务队列的平均长度,系统1分钟、5分钟、15分钟内的平均负载值。load average 数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了
第二行,Tasks,任务(进程)信息
Tasks: 145 total # 总进程数
2 running # 正在运行的进程数,对应状态 TASK_RUNNING
143 sleeping # 睡眠的进程数,对应状态 TASK_INTERRUPTIBLE 和 TASK_UNINTERRUPTIBLE
0 stopped # 停止的进程数,对应状态 TASK_STOPPED
0 zombie # 冻结进程数,僵尸进程数,对应状态TASK_ZOMBIE。
第三行,cpu 状态,CPU使用率等信息
99.8%us # user space 用户空间占用 CPU 百分比,即进程在用户空间消耗的CPU时间占比,不包含调整过优先级的进程
0.1%sy # sysctl 内核空间占用CPU百分比,即进程在内核空间(system)消耗的CPU时间占比
0.0%ni # nice 用户进程空间内改变过优先级的进程占用CPU百分比,即调整过用户态优先级的(niced)进程的CPU时间占比
0.2%id # idle 空闲CPU百分比,空闲的CPU时间占比。
0.0%wa # wait 等待输入输出(I/O)完成的CPU时间百分比
0.0%hi # Hardware IRQ 处理硬中断的CPU时间占比
0.0%si # software interrupt 处理软中断的CPU时间占比
0.2%us # user space 用户空间占用CPU的百分比
0.0%st # 当Linux系统是在虚拟机中运行时,等待CPU资源的时间(steal time)占比
第四行,内存状态
4147888k total # 物理内存总量
2493092k used # 使用的物理内存总量
1654796k free # 空闲内存总量
158188k buffers # 用作内核缓存的内存量
第五行,swap 交换分区信息
5144568k total # 交换区总量
56k used # 使用的交换区总量
5144512k free # 空闲交换区总量
2013180k cached # 缓冲的交换区总量
备注:
Swap 分区在系统的物理内存不够用的时候,把硬盘内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的数据被临时保存到 Swap 分区中,等到那些程序要运行时,再从 Swap 分区中恢复保存的数据到内存中。
Swap 分区,即交换区,系统在物理内存(这里应该是运行内存)不够时,与 Swap 进行交换。 其实,Swap的调整对 Linux服务器,特别是Web服务器的性能至关重要。通过调整 Swap,有时可以越过系统性能瓶颈,节省系统升级费用。
关于缓冲的交换区总量,这里解释一下,所谓缓冲的交换区总量,即内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。
计算可用内存数有一个近似的公式: 第四行的 free + 第四行的 buffers + 第五行的 cached。
对于内存监控,在 top 里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,第四行中空闲内存总量(free)是内核还未纳入其管控范围的数量。
纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
进程属性说明(即进程列表的字段说明)
列名 含义
PID # 进程id
PPID # 父进程id
RUSER # Real user name
UID # 进程所有者的用户id
USER # 进程所有者的用户名
GROUP # 进程所有者的组名
TTY # 启动进程的终端名。不是从终端启动的进程则显示为问号 ?
PR # 优先级,从系统内核角度看的进程调度优先级
NI # 进程的nice值。负值表示高优先级,正值表示低优先级,即从用户空间角度看的进程优先级。值越低,优先级越高。
P # 最后使用的CPU,仅在多CPU环境下有意义
%CPU # 上次更新到现在的CPU时间占用百分比,进程在一个更新周期内占用的CPU时间比例
TIME # 进程使用的CPU时间总计,单位秒
TIME+ # 进程使用的CPU时间总计,进程创建后至今占用的CPU时间长度,单位 1/100 秒
%MEM # 进程使用的物理内存百分比
VIRT # 进程使用的虚拟内存总量,进程申请使用的虚拟内存量,单位 kb。VIRT=SWAP+RES,
SWAP # 进程使用的虚拟内存中,被换出的大小,单位kb
RES # 进程使用的、未被换出的物理内存大小,就是进程使用的驻留内存(即未被swap out的内存)量。单位 kb。RES=CODE+DATA
CODE # 可执行代码占用的物理内存大小,单位kb
DATA # 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位 kb
SHR # 进程使用的共享内存量,进程使用的共享内存大小,单位 kb
nFLT # 页面错误次数
nDRT # 最后一次写入到现在,被修改过的页面数。
S # 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程,进程状态。R=running,S=interruptible sleeping,D=uninterruptible sleeping,T=stopped,Z=zombie。
COMMAND # 命令名/命令行,运行进程使用的命令。
WCHAN # 若该进程在睡眠,则显示睡眠中的系统函数名
Flags # 任务标志
部分参数详解:
VIRT:virtual memory usage 虚拟内存
1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量
RES:resident memory usage 常驻内存
1、进程当前使用的内存大小,但不包括swap out
2、包含其他进程的共享
3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
4、关于库占用内存的情况,它只统计加载的库文件所占内存大小
SHR:shared memory 共享内存
1、除了自身进程的共享内存,也包括其他进程的共享内存
2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
3、计算某个进程所占的物理内存大小公式:RES – SHR
4、swap out 后,它将会降下来
DATA
1、数据占用的内存。如果top没有显示,按f键可以显示出来。
2、真正的该程序要求的数据空间,是真正在运行中要使用的。
其它
默认进入 top 时,各进程是按照 CPU 的占用量来排序的。
1.在 top 基本视图中,按键盘数字 1
可以监控每个逻辑 CPU 的状况
按数字 1 后可以看到 8 个逻辑 CPU(%Cpu0 到 %Cpu7)各自的运行情况。
2.敲击键盘 b
,打开关闭加亮效果,top 视图变换如下:
如上图所示,PID 为 16283 的进程是当前 top 视图中唯一的运行态进程。也可以敲击键盘 y
来打开或者关闭运行态进程的加亮效果。
3.敲击键盘 x
打开/关闭排序列的加亮效果,top 视图变换如下:
如上图所示,可以看到现在是按 %CPU
进行排序的,可以按 shift+>
或者 shift+<
左右改变排序序列。
4.改变 top 基本视图中的进程显示字段
在 top 基本视图中,敲击 f
进入另一个视图,在这里可以编辑基本视图中的显示字段:
这里列出了所有可在 top 基本视图中显示的进程字段,有 *
并且标注为大写字母的字段是可显示的,没有 *
并且是小写字母的字段是不显示的。用上下键选择选项,按下空格键或者 d
可以决定是否在基本视图中显示这个字段。如果要在基本视图中显示 CODE
和 DATA
两个字段,可以通过敲击 r
和 s
键,enter
返回基本视图,可以看到多了 CODE
和 DATA
两个字段。
5.使用命令 sar 报告每个 CPU 的状态
[root@htlwk0001host ~]# sar -P ALL
Linux 4.18.0-193.6.3.el8_2.x86_64 (htlwk0001host) 2021年03月13日 _x86_64_ (2 CPU)00时00分05秒 CPU %user %nice %system %iowait %steal %idle
00时10分05秒 all 0.27 0.00 0.19 0.00 0.00 99.54
00时10分05秒 0 0.27 0.00 0.20 0.00 0.00 99.53
00时10分05秒 1 0.27 0.00 0.17 0.00 0.00 99.55[root@htlwk0001host ~]# sar -P ALL > aaa.txt # 重定向输出内容到文件 aaa.txt
6.使用命令 mpstat 显示各个可用 CPU 的状态:
[root@htlwk0001host ~]# mpstat -P ALL
Linux 4.18.0-193.6.3.el8_2.x86_64 (htlwk0001host) 2021年03月13日 _x86_64_ (2 CPU)13时37分08秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
13时37分08秒 all 0.16 0.01 0.05 0.00 0.04 0.02 0.00 0.00 0.00 99.72
13时37分08秒 0 0.16 0.01 0.05 0.00 0.04 0.04 0.00 0.00 0.00 99.71
13时37分08秒 1 0.16 0.01 0.05 0.00 0.04 0.01 0.00 0.00 0.00 99.73
[root@htlwk0001host ~]#
7.使用命令 cat 查看某个进程的详情
[root@htlwk0001host ~]# cat /proc/34295/status # 34295 是 PID
Name: svnserve
Umask: 0022
State: S (sleeping)
Tgid: 34295
Ngid: 0
Pid: 34295
PPid: 1
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 64
Groups: 0
NStgid: 34295
NSpid: 34295
NSpgid: 34295