top
命令是Linux和Unix系统中广泛使用的性能监控工具,它提供了一个实时更新的视图,展示系统中各个进程的活动及统计信息,包括CPU使用率、内存使用情况、进程状态等。top
命令对于系统管理员和性能分析师来说是一个非常有用的工具,因为它可以快速地提供系统当前的性能概览。
1. 作用与使用场景
top命令的主要作用和使用场景包括:
- 性能监控:实时监控系统的CPU和内存使用情况。
- 进程管理:查看哪些进程正在运行,以及它们的资源占用情况。
- 问题诊断:帮助诊断系统的性能瓶颈,如CPU过载、内存泄漏等。
例如:
- 高CPU使用率:哪个进程或服务占用了过多的CPU资源。
- 内存泄漏:哪个进程占用了过多的内存资源,特别是长时间运行的进程。
- 系统负载:系统当前的负载情况,是否有过多的进程等待CPU资源
2.1 基本用法
直接在终端中输入top
命令,然后按回车键,即可启动top
监控界面。
2.1.1 主要显示区域
top
命令的输出可以分为几个部分:
- 系统概览:显示当前时间、系统运行时间、登录用户数、平均负载等信息。
- 任务(进程)概览:显示当前系统中进程的总数、运行中的进程数、睡眠中的进程数、停止的进程数和僵尸进程数。
- CPU使用情况:显示用户空间占用的CPU百分比、系统空间占用的CPU百分比、空闲CPU百分比等。
- 内存使用情况:显示物理内存和交换空间的总量、使用量、空闲量和缓存量。
- 进程列表:显示系统中各个进程的详细信息,包括进程ID、用户、优先级、虚拟内存使用量、物理内存使用量、共享内存使用量、CPU使用率、内存使用率等。
2.1.2 交互命令
在top
运行时,可以使用以下一些交互命令来控制显示或操作进程:
-
Z,B:全局设置,
Z
用于更改颜色映射;B
用于禁用/启用粗体显示。 -
l,t,m:切换汇总信息的显示,
l
加载平均值;t
任务/CPU状态;m
内存信息。 -
1,I:切换SMP(对称多处理)视图,
1
单个/分开状态显示;I
切换Irix模式和Solaris模式。 -
f,o:字段/列设置,
f
添加或移除字段;o
更改显示顺序。 -
F or O:选择排序字段。
-
<,>:移动排序字段,
<
向左移动到下一个列;>
向右移动到下一个列。 -
R,H:切换设置,
R
正常/反向排序;H
显示线程。 -
c,i,S:切换设置,
c
命令名称/行;i
空闲任务;S
累计时间。 -
x,y:切换高亮显示,
x
排序字段;y
运行中的任务。 -
z,b:切换显示模式,
z
颜色/单色;b
粗体/反向(仅当x
或y
被激活时)。 -
k,r:操作任务,
k
杀死任务;r
重新设置nice值。 -
d or s:设置更新间隔。
-
W:写入配置文件。
-
q:退出
top
。 -
h
或?
:显示帮助屏幕,列出所有的交互命令及其描述。 -
k
:杀死进程。输入此命令后,top
会要求输入要终止的进程ID(PID)和要发送的信号(默认为SIGTERM,15)。 -
n
或#
:设置显示的进程数量。输入此命令后,top
会要求输入一个数字,表示要显示的最大进程数。 -
u
:按用户过滤进程。输入此命令后,top
会要求输入一个用户名,之后只显示该用户的进程。 -
p
:按PID过滤进程。输入此命令后,top
会要求输入一个或多个进程ID,之后只显示这些进程。 -
M
:按物理内存使用量排序。 -
P
:按CPU使用率排序。 -
T
:按时间/累计时间排序。 -
z
:切换彩色/黑白显示模式。 -
i
:切换空闲进程的显示。默认情况下,空闲进程(即没有占用CPU资源的进程)会被显示,使用此命令可以切换是否显示这些进程。 -
c
:切换命令行/程序名显示。默认情况下,top
显示每个进程的命令行参数。使用此命令可以切换显示完整命令行和仅显示程序名。 -
r
:重新调整进程的nice值。输入此命令后,top
会要求输入进程ID和新的nice值。 -
V
:显示top
版本信息。 -
q
:退出top
。
注意:带有.
的命令需要任务显示窗口可见才能使用。
2.1.3 系统概览部分
- top - 显示当前时间、系统运行时间、当前登录用户数、系统平均负载(1分钟、5分钟、15分钟平均值)。
2.1.4 任务(进程)概览部分
- Tasks - 显示进程的总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵尸进程数。
2.1.5 CPU使用情况部分
- %Cpu(s) - 显示CPU使用的细分:
- us - 用户空间占用CPU的百分比。
- sy - 内核空间占用CPU的百分比。
- ni - 改变过优先级的进程占用CPU的百分比。
- id - 空闲CPU百分比。
- wa - 等待输入输出的CPU时间百分比。
- hi - 处理硬件中断的CPU时间百分比。
- si - 处理软件中断的CPU时间百分比。
- st - 被虚拟机偷去的CPU时间百分比。
2.1.6 内存使用情况部分
- KiB Mem 和 KiB Swap - 显示物理内存和交换空间的使用情况:
- total - 总量。
- used - 已使用量。
- free - 空闲量。
- buff/cache - 用作缓冲和缓存的内存量。
2.1.7 进程列表部分
- PID - 进程ID。
- USER - 运行此进程的用户。
- PR - 进程的优先级。
- NI - nice值,影响进程的优先级。
- VIRT - 进程占用的虚拟内存总量。
- RES - 进程占用的物理内存量。
- SHR - 进程使用的共享内存量。
- S - 进程状态(D不可中断的睡眠状态、R运行、S睡眠、T停止、Z僵尸)。
- %CPU - 进程占用的CPU百分比。
- %MEM - 进程占用的物理内存百分比。
- TIME+ - 进程占用CPU的时间总量。
- COMMAND - 启动进程的命令。
3. top 实战
启动top
并按CPU使用率(按P
键)排序:
我这里是16核服务器
top
top - 23:40:15 up 1:44, 1 user, load average: 6.49, 6.97, 7.50
Tasks: 50 total, 1 running, 48 sleeping, 0 stopped, 1 zombie
Cpu(s): 13.1%us, 1.2%sy, 0.0%ni, 85.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 25165824k total, 19462772k used, 5703052k free, 0k buffers
Swap: 2097152k total, 0k used, 2097152k free, 2906840k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
527 ssskkkk 20 0 30.3g 15g 20m S 617.7 64.2 764:58.43 java
3916 ssskkkk 20 0 8985m 202m 24m S 21.0 0.8 10:45.47 sg_agent
109 ssskkkk 20 0 1060m 12m 8444 S 1.0 0.1 0:49.60 log_agent_file
3297 root 20 0 1845m 25m 11m S 0.7 0.1 0:23.94 falcon-agent
4221 root 20 0 711m 21m 14m S 0.7 0.1 0:02.19 dw_1001
4661 ssskkkk 20 0 208m 32m 21m S 0.7 0.1 0:43.99 octo-proxy
113 ssskkkk 20 0 2044m 18m 7984 S 0.3 0.1 0:31.89 log_agent
414 ssskkkk 20 0 1755m 26m 13m S 0.3 0.1 0:06.39 kms_agent
4222 root 20 0 76032 1792 1692 S 0.3 0.0 0:02.33 t_800
4408 root 20 0 721m 21m 13m S 0.3 0.1 0:06.84 dw_1011
4417 root 20 0 700m 21m 5808 S 0.3 0.1 1:30.36 dw_1003
9520 wwwwnnnn 20 0 48076 4212 3584 R 0.3 0.0 0:00.03 top
1 root 20 0 689m 4064 2868 S 0.0 0.0 0:00.03 container-init
92 root 20 0 105m 2920 2712 S 0.0 0.0 0:00.00 svscanboot
98 root 20 0 4168 1088 996 S 0.0 0.0 0:00.11 svscan
99 root 20 0 3984 412 336 S 0.0 0.0 0:00.00 readproctitle
100 root 20 0 3996 412 340 S 0.0 0.0 0:00.00 supervise
101 root 20 0 3996 504 428 S 0.0 0.0 0:00.00 supervise
102 root 20 0 4128 412 336 S 0.0 0.0 0:00.00 supervise
103 root 20 0 4128 460 384 S 0.0 0.0 0:00.00 supervise
104 root 20 0 3996 504 428 S 0.0 0.0 0:00.00 supervise
105 root 20 0 3996 500 424 S 0.0 0.0 0:00.00 supervise
106 root 20 0 4128 452 384 S 0.0 0.0 0:00.00 supervise
107 root 20 0 3996 404 332 S 0.0 0.0 0:00.00 supervise
108 root 20 0 4128 444 368 S 0.0 0.0 0:00.00 supervise
114 ssskkkk 20 0 387m 16m 12m S 0.0 0.1 0:00.30 agent
207 root 20 0 701m 18m 9620 S 0.0 0.1 0:00.35 one-agent
226 root 20 0 167m 2712 2336 S 0.0 0.0 0:00.11 rsyslogd
411 root 20 0 196m 13m 3148 S 0.0 0.1 0:08.35 supervisord
504 root 20 0 1030m 13m 9384 S 0.0 0.1 0:00.38 container-agent
760 root 20 0 3996 412 340 S 0.0 0.0 0:00.00 supervise
761 root 20 0 48224 5032 4464 S 0.0 0.0 0:00.00 sshd
1183 root 20 0 1865m 18m 8940 S 0.0 0.1 0:00.65 upgrader-agent
3848 ssskkkk 20 0 101m 2740 1876 S 0.0 0.0 0:00.00 ragent
4085 ssskkkk 20 0 204m 9100 8256 S 0.0 0.0 0:00.04 crane_agent_par
4288 root 30 10 2078m 18m 5392 S 0.0 0.1 0:02.40 jumper-agent
4350 nscd 30 10 575m 4716 3956 S 0.0 0.0 0:00.40 nscd
4398 root 30 10 114m 2416 1808 S 0.0 0.0 0:00.00 crond
4409 root 20 0 702m 15m 9480 S 0.0 0.1 0:03.72 dw_1006
4410 root 20 0 699m 11m 5600 S 0.0 0.0 0:01.73 dw_1002
4411 root 20 0 703m 17m 9988 S 0.0 0.1 0:03.26 dw_1004
4412 root 20 0 1979m 21m 10m S 0.0 0.1 0:05.20 dw_1008
4426 root 20 0 704m 18m 11m S 0.0 0.1 0:27.48 dw_1013
4564 ssskkkk 20 0 689m 4476 3364 S 0.0 0.0 0:00.00 go-ark
4633 ssskkkk 20 0 112m 9528 7784 S 0.0 0.0 0:10.74 cplugin
4664 ssskkkk 20 0 0 0 0 Z 0.0 0.0 0:00.00 sh <defunct>
4710 ssskkkk 20 0 816m 5864 4572 S 0.0 0.0 0:00.00 pamela-agent
9479 root 20 0 121m 9.8m 7560 S 0.0 0.0 0:00.05 sshd
3.1 僵尸问题示例:
Tasks: 50 total, 1 running, 48 sleeping, 0 stopped, 1 zombie
在top
命令的输出中,Tasks
部分显示了系统中进程的状态信息。具体来说:
- 50 total:系统中总共有50个进程。
- 1 running:当前有1个进程正在运行。
- 48 sleeping:有48个进程处于睡眠状态(等待某些事件或资源)。
- 0 stopped:没有进程处于停止状态。
- 1 zombie:有1个僵尸进程。
3.1.1 说明的问题
-
总进程数(50 total):系统中当前有50个进程,这个数字包括所有状态的进程。
-
运行中的进程(1 running):只有1个进程正在运行,这通常是正常的,因为在多任务操作系统中,CPU会在多个进程之间快速切换,通常只有少数进程在任何时刻实际占用CPU。
-
睡眠中的进程(48 sleeping):大多数进程处于睡眠状态,这也是正常的,因为许多进程在等待I/O操作、用户输入或其他事件时会进入睡眠状态。
-
停止的进程(0 stopped):没有进程处于停止状态,这意味着没有进程被暂停或停止。
-
僵尸进程(1 zombie):有1个僵尸进程,这通常是一个需要注意的问题。
3.1.2 僵尸进程的说明
僵尸进程(Zombie Process)是已经终止但其父进程尚未读取其退出状态的进程。僵尸进程占用系统的进程表项,但不占用其他资源。僵尸进程的存在通常是因为父进程没有正确处理子进程的退出状态。
3.1.3 处理僵尸进程
-
检查父进程:找出僵尸进程的父进程ID(PPID),可以使用
ps
命令来查看:ps -ef | grep Z
当你运行ps -ef | grep Z
命令来查找僵尸进程时,ps -ef
命令会列出系统中所有进程的详细信息,然后通过grep Z
过滤出状态为Z
(僵尸状态)的进程。这里是ps -ef
命令输出的各列信息的含义:
-
- UID:用户ID,显示进程拥有者的用户名称。
-
- PID:进程ID,唯一标识一个进程。
-
- PPID:父进程ID,即创建这个进程的进程的ID。
-
- C:CPU利用率,用于调度。
-
- STIME:进程启动时间。
-
- TTY:进程终端类型,如果进程没有终端,则显示为
?
。
- TTY:进程终端类型,如果进程没有终端,则显示为
-
- TIME:进程占用的CPU时间。
-
- CMD:启动进程的命令名称或命令行。
对于僵尸进程,最重要的是查看其PID
(进程ID)和PPID
(父进程ID),因为处理僵尸进程通常需要了解它的父进程。僵尸进程本身不占用除进程表项外的任何资源,但如果大量积累,可能会耗尽系统的进程号资源。
在grep Z
的输出中,你会看到类似下面的行:
username 1234 1233 0 May18 ? 00:00:00 [example]<defunct>
这里,[example]<defunct>
表示一个僵尸进程,<defunct>
是另一种表示僵尸进程的方式。1234
是僵尸进程的PID
,而1233
是其父进程的PID
。这行信息表明,有一个名为example
的进程已经结束,但其父进程尚未通过wait()
或waitpid()
系统调用来读取其退出状态,导致它成为僵尸进程。
处理僵尸进程通常需要从其父进程入手,确保父进程能够正确地回收子进程的状态信息。如果父进程是由于错误而未能回收子进程,可能需要修复父进程的代码。在极端情况下,如果父进程无法修复,可能需要重启父进程或系统来清理僵尸进程。
-
终止父进程:如果父进程没有正确处理子进程的退出状态,可以考虑终止父进程。终止父进程后,僵尸进程会被
init
进程(PID 1)接管,并清理掉:kill -9 <父进程ID>
-
修复代码:如果你是开发者,应该检查和修复父进程的代码,确保它能够正确处理子进程的退出状态。通常可以通过在父进程中捕获
SIGCHLD
信号并调用wait
或waitpid
函数来实现。
当一个进程结束时,它的进程描述符(PID)和最终的退出状态需要被其父进程读取。在父进程读取这些信息之前,已结束的进程会保留在系统中作为一个僵尸进程(Zombie Process)。僵尸进程占用系统资源(尽管非常少),如果大量积累,可能会耗尽系统的PID资源,导致新的进程无法创建。
为了预防僵尸进程的产生,可以在父进程中捕获SIGCHLD
信号并调用wait
或waitpid
函数。下面解释这是如何工作的:
-
SIGCHLD
信号:这是一个由子进程结束时向其父进程发送的信号。默认情况下,SIGCHLD
信号可能会被忽略,但父进程可以通过设置信号处理函数来捕获这个信号。
-
wait
和waitpid
函数:这些函数用于父进程等待子进程结束,并收集子进程的退出状态。调用wait
或waitpid
会使父进程阻塞,直到至少有一个子进程结束。如果子进程已经结束,这些调用会立即返回子进程的状态,并清理掉子进程,防止其成为僵尸进程。
通过在父进程中捕获SIGCHLD
信号并在信号处理函数中调用wait
或waitpid
,可以确保:
- 父进程会被通知到子进程的结束。
- 父进程可以立即处理子进程的退出,读取其退出状态,并清理系统资源。
- 避免了僵尸进程的产生,因为父进程及时地处理了子进程的结束。
这种方法既可以保证父进程能够及时响应子进程的结束,又能有效管理系统资源,避免僵尸进程的积累。
总的来说,top
命令显示的这些信息帮助你了解系统中进程的状态,并识别出潜在的问题,如僵尸进程。通过适当的措施,可以确保系统的稳定性和性能。
3.2 load average 系统负载,多核CPU系统示例
在多核CPU系统中,使用top
命令可以观察到系统负载和各个CPU核心的使用情况。以下是一个假设的例子,展示了在多核场景下,系统负载逐渐降低的情况。
3.2.1 负载逐渐降低
在一个多核CPU系统中,使用top
命令可以观察到系统负载和CPU使用情况。以下是一个假设的例子,展示了在多核场景下,系统负载逐渐降低的情况。为了简化,我们只关注load average
和%Cpu(s)
部分,并解释每个值的含义。
3.2.1.1 初始高负载状态
load average: 4.00, 3.50, 3.00
%Cpu(s): 70.0 us, 20.0 sy, 0.0 ni, 10.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
- load average:
4.00, 3.50, 3.00
分别代表过去1分钟、5分钟和15分钟的平均系统负载。负载平均值超过CPU核心数表明系统过载,有任务在等待CPU资源。 - %Cpu(s):
70.0 us
:用户空间占用CPU的百分比为70%,表示大部分CPU时间用于执行用户进程。20.0 sy
:系统空间占用CPU的百分比为20%,表示CPU时间有相当一部分用于执行内核进程。0.0 ni
:改变过优先级的进程占用CPU的百分比为0%。10.0 id
:空闲CPU百分比为10%,表示CPU资源紧张,几乎被完全利用。0.0 wa
:等待I/O的CPU时间百分比为0%,表示I/O不是瓶颈。0.0 hi
:硬件中断占用CPU的百分比为0%。0.0 si
:软件中断占用CPU的百分比为0%。0.0 st
:被偷走的时间(在虚拟化环境中其他虚拟机占用的CPU时间)为0%。
3.2.1.2 负载逐渐降低
随着时间的推移,系统负载开始下降,top
命令可能显示如下信息:
load average: 2.00, 2.50, 2.75
%Cpu(s): 40.0 us, 10.0 sy, 0.0 ni, 50.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
- load average:
2.00, 2.50, 2.75
分别代表过去1分钟、5分钟和15分钟的平均系统负载。负载平均值的降低表明系统负载正在减轻,CPU资源的竞争减少。 - %Cpu(s):
40.0 us
:用户空间占用CPU的百分比降低到40%,表示用户进程的CPU使用减少。10.0 sy
:系统空间占用CPU的百分比降低到10%,内核进程的CPU使用也减少。50.0 id
:空闲CPU百分比增加到50%,表示有更多的CPU资源处于空闲状态,系统不再过载。
3.2.1.3 小结
通过观察top
命令的load average
和%Cpu(s)
部分,我们可以了解到系统负载和CPU使用情况。load average
提供了系统负载的直观指标,而%Cpu(s)
详细展示了CPU时间的分配情况。当系统从高负载状态逐渐过渡到低负载状态时,load average
会下降,%Cpu(s)
中的id
(空闲)比例会上升,反映出系统负载的减轻和CPU资源的释放。
3.2.2 负载逐渐升高
在一个多核CPU系统中,使用top
命令可以观察到系统负载和CPU使用情况。以下是一个假设的例子,展示了在多核场景下,系统负载逐渐升高的情况。为了简化,我们只关注load average
和%Cpu(s)
部分,并解释每个值的含义。
3.2.2.1 初始低负载状态
load average: 0.75, 0.50, 0.25
%Cpu(s): 10.0 us, 5.0 sy, 0.0 ni, 85.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
- load average:
0.75, 0.50, 0.25
分别代表过去1分钟、5分钟和15分钟的平均系统负载。这些值低于CPU核心总数,表明系统处于相对空闲状态,大部分时间CPU资源充足。 - %Cpu(s):
10.0 us
:用户空间占用CPU的百分比为10%,表示用户进程占用了一小部分CPU时间。5.0 sy
:系统空间占用CPU的百分比为5%,表示内核进程占用了较少的CPU时间。0.0 ni
:改变过优先级的进程占用CPU的百分比为0%。85.0 id
:空闲CPU百分比为85%,表示大部分时间CPU处于空闲状态。0.0 wa
:等待I/O的CPU时间百分比为0%,表示I/O不是瓶颈。0.0 hi
:硬件中断占用CPU的百分比为0%。0.0 si
:软件中断占用CPU的百分比为0%。0.0 st
:被偷走的时间(在虚拟化环境中其他虚拟机占用的CPU时间)为0%。
3.2.2.2 负载逐渐升高
随着时间的推移,如果开始运行更多的进程或现有进程需要更多的CPU资源,系统负载将开始上升。一段时间后,top
命令可能显示如下信息:
load average: 2.00, 1.50, 1.00
%Cpu(s): 50.0 us, 20.0 sy, 0.0 ni, 30.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
- load average:
2.00, 1.50, 1.00
分别代表过去1分钟、5分钟和15分钟的平均系统负载。负载平均值的上升表明系统负载正在增加,CPU资源的竞争开始加剧。 - %Cpu(s):
50.0 us
:用户空间占用CPU的百分比上升到50%,表示用户进程的CPU使用增加。20.0 sy
:系统空间占用CPU的百分比上升到20%,内核进程的CPU使用也增加。30.0 id
:空闲CPU百分比下降到30%,表示CPU资源开始变得紧张。
3.2.2.3 小结
通过观察top
命令的load average
和%Cpu(s)
部分,我们可以了解到系统负载和CPU使用情况。load average
提供了系统负载的直观指标,而%Cpu(s)
详细展示了CPU时间的分配情况。当系统从低负载状态逐渐过渡到高负载状态时,load average
会上升,%Cpu(s)
中的id
(空闲)比例会下降,反映出系统负载的增加和CPU资源的紧张。这种情况下,可能需要关注运行的进程和资源使用情况,以避免潜在的性能问题。