linux top

top命令是Linux和Unix系统中广泛使用的性能监控工具,它提供了一个实时更新的视图,展示系统中各个进程的活动及统计信息,包括CPU使用率、内存使用情况、进程状态等。top命令对于系统管理员和性能分析师来说是一个非常有用的工具,因为它可以快速地提供系统当前的性能概览。

1. 作用与使用场景

top命令的主要作用和使用场景包括:

  • 性能监控:实时监控系统的CPU和内存使用情况。
  • 进程管理:查看哪些进程正在运行,以及它们的资源占用情况。
  • 问题诊断:帮助诊断系统的性能瓶颈,如CPU过载、内存泄漏等。

例如:

  • 高CPU使用率:哪个进程或服务占用了过多的CPU资源。
  • 内存泄漏:哪个进程占用了过多的内存资源,特别是长时间运行的进程。
  • 系统负载:系统当前的负载情况,是否有过多的进程等待CPU资源

2.1 基本用法

直接在终端中输入top命令,然后按回车键,即可启动top监控界面。

2.1.1 主要显示区域

top命令的输出可以分为几个部分:

  1. 系统概览:显示当前时间、系统运行时间、登录用户数、平均负载等信息。
  2. 任务(进程)概览:显示当前系统中进程的总数、运行中的进程数、睡眠中的进程数、停止的进程数和僵尸进程数。
  3. CPU使用情况:显示用户空间占用的CPU百分比、系统空间占用的CPU百分比、空闲CPU百分比等。
  4. 内存使用情况:显示物理内存和交换空间的总量、使用量、空闲量和缓存量。
  5. 进程列表:显示系统中各个进程的详细信息,包括进程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粗体/反向(仅当xy被激活时)。

  • 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 MemKiB 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 说明的问题

  1. 总进程数(50 total):系统中当前有50个进程,这个数字包括所有状态的进程。

  2. 运行中的进程(1 running):只有1个进程正在运行,这通常是正常的,因为在多任务操作系统中,CPU会在多个进程之间快速切换,通常只有少数进程在任何时刻实际占用CPU。

  3. 睡眠中的进程(48 sleeping):大多数进程处于睡眠状态,这也是正常的,因为许多进程在等待I/O操作、用户输入或其他事件时会进入睡眠状态。

  4. 停止的进程(0 stopped):没有进程处于停止状态,这意味着没有进程被暂停或停止。

  5. 僵尸进程(1 zombie):有1个僵尸进程,这通常是一个需要注意的问题。

3.1.2 僵尸进程的说明

僵尸进程(Zombie Process)是已经终止但其父进程尚未读取其退出状态的进程。僵尸进程占用系统的进程表项,但不占用其他资源。僵尸进程的存在通常是因为父进程没有正确处理子进程的退出状态。

3.1.3 处理僵尸进程

  1. 检查父进程:找出僵尸进程的父进程ID(PPID),可以使用ps命令来查看:

    ps -ef | grep Z
    

当你运行ps -ef | grep Z命令来查找僵尸进程时,ps -ef命令会列出系统中所有进程的详细信息,然后通过grep Z过滤出状态为Z(僵尸状态)的进程。这里是ps -ef命令输出的各列信息的含义:

    1. UID:用户ID,显示进程拥有者的用户名称。
    1. PID:进程ID,唯一标识一个进程。
    1. PPID:父进程ID,即创建这个进程的进程的ID。
    1. C:CPU利用率,用于调度。
    1. STIME:进程启动时间。
    1. TTY:进程终端类型,如果进程没有终端,则显示为?
    1. TIME:进程占用的CPU时间。
    1. 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()系统调用来读取其退出状态,导致它成为僵尸进程。

处理僵尸进程通常需要从其父进程入手,确保父进程能够正确地回收子进程的状态信息。如果父进程是由于错误而未能回收子进程,可能需要修复父进程的代码。在极端情况下,如果父进程无法修复,可能需要重启父进程或系统来清理僵尸进程。

  1. 终止父进程:如果父进程没有正确处理子进程的退出状态,可以考虑终止父进程。终止父进程后,僵尸进程会被init进程(PID 1)接管,并清理掉:

    kill -9 <父进程ID>
    
  2. 修复代码:如果你是开发者,应该检查和修复父进程的代码,确保它能够正确处理子进程的退出状态。通常可以通过在父进程中捕获SIGCHLD信号并调用waitwaitpid函数来实现。

当一个进程结束时,它的进程描述符(PID)和最终的退出状态需要被其父进程读取。在父进程读取这些信息之前,已结束的进程会保留在系统中作为一个僵尸进程(Zombie Process)。僵尸进程占用系统资源(尽管非常少),如果大量积累,可能会耗尽系统的PID资源,导致新的进程无法创建。

为了预防僵尸进程的产生,可以在父进程中捕获SIGCHLD信号并调用waitwaitpid函数。下面解释这是如何工作的:

    1. SIGCHLD信号:这是一个由子进程结束时向其父进程发送的信号。默认情况下,SIGCHLD信号可能会被忽略,但父进程可以通过设置信号处理函数来捕获这个信号。
    1. waitwaitpid函数:这些函数用于父进程等待子进程结束,并收集子进程的退出状态。调用waitwaitpid会使父进程阻塞,直到至少有一个子进程结束。如果子进程已经结束,这些调用会立即返回子进程的状态,并清理掉子进程,防止其成为僵尸进程。

通过在父进程中捕获SIGCHLD信号并在信号处理函数中调用waitwaitpid,可以确保:

  • 父进程会被通知到子进程的结束。
  • 父进程可以立即处理子进程的退出,读取其退出状态,并清理系统资源。
  • 避免了僵尸进程的产生,因为父进程及时地处理了子进程的结束。

这种方法既可以保证父进程能够及时响应子进程的结束,又能有效管理系统资源,避免僵尸进程的积累。

总的来说,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资源的紧张。这种情况下,可能需要关注运行的进程和资源使用情况,以避免潜在的性能问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值