top
命令是Linux和Unix系统中广泛使用的性能监控工具,它提供了一个实时更新的视图,展示系统中各个进程的活动及统计信息,包括CPU使用率、内存使用情况、进程状态等。top
命令对于系统管理员和性能分析师来说是一个非常有用的工具,因为它可以快速地提供系统当前的性能概览。
作用与使用场景
top命令的主要作用和使用场景包括:
- 性能监控:实时监控系统的CPU和内存使用情况。
- 进程管理:查看哪些进程正在运行,以及它们的资源占用情况。
- 问题诊断:帮助诊断系统的性能瓶颈,如CPU过载、内存泄漏等。
例如:
- 高CPU使用率:哪个进程或服务占用了过多的CPU资源。
- 内存泄漏:哪个进程占用了过多的内存资源,特别是长时间运行的进程。
- 系统负载:系统当前的负载情况,是否有过多的进程等待CPU资源
基本用法
直接在终端中输入top
命令,然后按回车键,即可启动top
监控界面。
主要显示区域
top
命令的输出可以分为几个部分:
- 系统概览:显示当前时间、系统运行时间、登录用户数、平均负载等信息。
- 任务(进程)概览:显示当前系统中进程的总数、运行中的进程数、睡眠中的进程数、停止的进程数和僵尸进程数。
- CPU使用情况:显示用户空间占用的CPU百分比、系统空间占用的CPU百分比、空闲CPU百分比等。
- 内存使用情况:显示物理内存和交换空间的总量、使用量、空闲量和缓存量。
- 进程列表:显示系统中各个进程的详细信息,包括进程ID、用户、优先级、虚拟内存使用量、物理内存使用量、共享内存使用量、CPU使用率、内存使用率等。
交互命令
在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
。
注意:带有.
的命令需要任务显示窗口可见才能使用。
系统概览部分
- top - 显示当前时间、系统运行时间、当前登录用户数、系统平均负载(1分钟、5分钟、15分钟平均值)。
任务(进程)概览部分
- Tasks - 显示进程的总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵尸进程数。
CPU使用情况部分
- %Cpu(s) - 显示CPU使用的细分:
- us - 用户空间占用CPU的百分比。
- sy - 内核空间占用CPU的百分比。
- ni - 改变过优先级的进程占用CPU的百分比。
- id - 空闲CPU百分比。
- wa - 等待输入输出的CPU时间百分比。
- hi - 处理硬件中断的CPU时间百分比。
- si - 处理软件中断的CPU时间百分比。
- st - 被虚拟机偷去的CPU时间百分比。
内存使用情况部分
- KiB Mem 和 KiB Swap - 显示物理内存和交换空间的使用情况:
- total - 总量。
- used - 已使用量。
- free - 空闲量。
- buff/cache - 用作缓冲和缓存的内存量。
进程列表部分
- PID - 进程ID。
- USER - 运行此进程的用户。
- PR - 进程的优先级。
- NI - nice值,影响进程的优先级。
- VIRT - 进程占用的虚拟内存总量。
- RES - 进程占用的物理内存量。
- SHR - 进程使用的共享内存量。
- S - 进程状态(D不可中断的睡眠状态、R运行、S睡眠、T停止、Z僵尸)。
- %CPU - 进程占用的CPU百分比。
- %MEM - 进程占用的物理内存百分比。
- TIME+ - 进程占用CPU的时间总量。
- COMMAND - 启动进程的命令。
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
问题示例:
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个僵尸进程。
说明的问题
总进程数(50 total):系统中当前有50个进程,这个数字包括所有状态的进程。
运行中的进程(1 running):只有1个进程正在运行,这通常是正常的,因为在多任务操作系统中,CPU会在多个进程之间快速切换,通常只有少数进程在任何时刻实际占用CPU。
睡眠中的进程(48 sleeping):大多数进程处于睡眠状态,这也是正常的,因为许多进程在等待I/O操作、用户输入或其他事件时会进入睡眠状态。
停止的进程(0 stopped):没有进程处于停止状态,这意味着没有进程被暂停或停止。
僵尸进程(1 zombie):有1个僵尸进程,这通常是一个需要注意的问题。
僵尸进程的说明
僵尸进程(Zombie Process)是已经终止但其父进程尚未读取其退出状态的进程。僵尸进程占用系统的进程表项,但不占用其他资源。僵尸进程的存在通常是因为父进程没有正确处理子进程的退出状态。
处理僵尸进程
检查父进程:找出僵尸进程的父进程ID(PPID),可以使用
ps
命令来查看:ps -ef | grep Z
当你运行ps -ef | grep Z
命令来查找僵尸进程时,ps -ef
命令会列出系统中所有进程的详细信息,然后通过grep Z
过滤出状态为Z
(僵尸状态)的进程。这里是ps -ef
命令输出的各列信息的含义:
- 1. UID:用户ID,显示进程拥有者的用户名称。
- 2. PID:进程ID,唯一标识一个进程。
- 3. PPID:父进程ID,即创建这个进程的进程的ID。
- 4. C:CPU利用率,用于调度。
- 5. STIME:进程启动时间。
- 6. TTY:进程终端类型,如果进程没有终端,则显示为?
。
- 7. TIME:进程占用的CPU时间。
- 8. 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
命令显示的这些信息帮助你了解系统中进程的状态,并识别出潜在的问题,如僵尸进程。通过适当的措施,可以确保系统的稳定性和性能。