linux top

avatar
作者
猴君
阅读量:0

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

作用与使用场景

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

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

例如:

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

基本用法

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

主要显示区域

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

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

注意:带有.的命令需要任务显示窗口可见才能使用。

系统概览部分
  • 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 MemKiB 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个僵尸进程。
说明的问题
  1. 总进程数(50 total):系统中当前有50个进程,这个数字包括所有状态的进程。

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

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

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

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

僵尸进程的说明

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

处理僵尸进程
  1. 检查父进程:找出僵尸进程的父进程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()系统调用来读取其退出状态,导致它成为僵尸进程。

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

  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命令显示的这些信息帮助你了解系统中进程的状态,并识别出潜在的问题,如僵尸进程。通过适当的措施,可以确保系统的稳定性和性能。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!