0. 概述

在 Linux 下稍微定位过性能问题的同学应该对 Top 命令都是了解的,但是,不知道你对 Top 命令的了解有多少,本文就个人的理解进行一个总结。

1. 总览

第一步还是快速看一个最平凡的例子,那就是什么参数都不加执行执行 top 命令的时候的输出是什么:

图 1:平凡的 Top 命令

这里可以看到整体的结构为:

上面有 5 行的 summary,每行对应的为:

  • 系统 Summary:(其实就是 uptime 的信息)
    • 系统当前时间
    • 系统运行了多久
    • 有多少个登陆 Session
    • 最近 5、10 和 15 分钟内的平均负载
  • 进程 Summary
    • 运行中
    • 睡眠中
    • 停止
    • Zombie 进程
  • CPU Summary
    • us:用户态(未调整优先级)百分比
    • sy:系统(内核)百分比
    • ni:用户态(调整优先级)百分比
    • id:空闲百分比
    • wa:IO 等待百分比
    • hi:硬件中断处理百分比
    • si:软件中断处理百分比
    • st:被 hypervisor 偷窃的百分比
  • 2 行的 Memory Summary
    • 真实内存占用
    • 虚拟内存占用

然后下面就是具体的进程信息,默认为 CPU Usage 排序。这里默认显示的字段分别为:

  • PID:进程 ID
  • USER:进程运行用户
  • PR:进程优先级
  • NI:进程 Nice 值(用于调整优先级)
  • VIRT:占用的虚拟内存
  • RES:真实使用物理内存大小
  • SHR:共享内存大小
  • s:进程状态
  • CPU:CPU 使用率
  • MEM:内存使用率
  • TIME:任务启动后到现在所使用的全部 CPU 时间,精确到百分之一秒。
  • COMMAND:启动进程的时间

这些都是默认的输出,已经可以帮助我们很多了,但是,很多时候,我们需要的信息更加具体,所以需要看一些额外的信息。下面就列举一些常见的场景。

2. 查看特定的进程

因为下半部分的进程列表是动态的,我们很可能只想看某个具体的进程,那么可以这么看:

  1. [root@liqiang.io]# top -p 2140
图 2:查看具体的进程

3. 查看更多的字段

  1. [root@liqiang.io]# top -p 2140

使用 top 命令,然后按 ‘f’ 键,就进入了字段选择页面,按 ‘d’ 选择/取消对应的字段:

图 3:查看对应的字段

3.1 内存排序

Shift + M

3.2 CPU 排序

Shift + P

查看进程的线程数

  1. [root@liqiang.io]# top -Hp 460643
  2. top - 17:08:31 up 44 days, 23 min, 1 user, load average: 0.00, 0.01, 0.04
  3. Threads: 9 total, 0 running, 9 sleeping, 0 stopped, 0 zombie
  4. %Cpu(s): 1.1 us, 0.5 sy, 0.0 ni, 98.2 id, 0.1 wa, 0.0 hi, 0.0 si, 0.1 st
  5. MiB Mem : 3731.2 total, 483.4 free, 1014.9 used, 2233.0 buff/cache
  6. MiB Swap: 0.0 total, 0.0 free, 0.0 used. 2228.9 avail Mem
  7. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  8. 460643 root 20 0 1311756 38284 11260 S 0.0 1.0 9:14.31 http-server
  9. 460704 root 20 0 1311756 38284 11260 S 0.0 1.0 8:04.01 http-server
  10. 460705 root 20 0 1311756 38284 11260 S 0.0 1.0 6:35.95 http-server
  11. 460706 root 20 0 1311756 38284 11260 S 0.0 1.0 9:23.04 http-server
  12. 460707 root 20 0 1311756 38284 11260 S 0.0 1.0 9:16.96 http-server
  13. 460708 root 20 0 1311756 38284 11260 S 0.0 1.0 0:00.00 http-server
  14. 460710 root 20 0 1311756 38284 11260 S 0.0 1.0 5:47.84 http-server
  15. 460878 root 20 0 1311756 38284 11260 S 0.0 1.0 9:13.93 http-server
  16. 461863 root 20 0 1311756 38284 11260 S 0.0 1.0 6:07.49 http-server

这里的 Threads: 9 total 就是进程开启的线程数量

4. Zombie 进程是什么

  • Zombie 进程:子进程退出了,但是父进程没有接收退出状态,导致子进程的 Zombie 数据结构一直在内存中,会导致内存泄露;
  • 孤儿进程:子进程还没结束,但是父进程退出了,子进程就自动归给 init 进程作为子进程,当子进程退出后,init 进程会接收子进程的退出状态,没有什么负面影响;

5. 为什么有 Priority 和 Nice 两个优先级

这两个值都能影响系统对进程的调度优先级,数值越低,优先级越高,区别在于:

  • Priority:内核指定的优先级,用户无法修改
  • Nice:用户可以修改的优先级,Nice 值的设定范围区分用户
    • root 用户的设置范围为:-20 ~ 19
    • 普通用户的设置范围为:0~19

真实调度的时候的优先级 Real Priority = Priority + Nice,所以用户可以根据设置 Nice 值在一定程度上影响对应进程的调度优先级。

6. Ref