Linux命令-top

简介

top 是 Linux 下最常用的进程监控工具,相当于任务管理器,能够实时显示系统中各个进程的资源占用状况。MAN 手册中的解释如下图。top 是一个动态显示过程,可以通过按键不断刷新当前状态,也可以配合命令行参数做批处理或脚本输出。

Linux MAN手册对top命令的描述

用法

在终端输入 top 命令,即出现如下效果:

top命令运行效果

q 退出。

常用命令行参数

除了直接运行 top,以下参数在排查问题时也很常用:

参数 说明
-d <秒> 设置刷新间隔,默认 3 秒
-n <次数> 刷新指定次数后自动退出,常与 -b 配合
-b 批处理模式,适合重定向到文件或管道
-p <PID> 只监控指定进程,可多次指定
-u <用户> 只显示指定用户的进程
-H 显示线程而非进程(每个线程单独一行)
-c 启动时即显示完整命令行

示例:每 2 秒采样一次,共输出 5 次,写入文件:

1
top -b -d 2 -n 5 > top.log

只观察某个进程:

1
top -p 1234

查看进程的线程信息:

1
top -H -p 1234

界面说明

top 命令执行后主要由四个信息区域组成,从上至下分别表示系统运行时间和平均负载、任务和 CPU 状态、内存使用情况以及进程详细信息。

系统运行时间和平均负载

  • 第一行示例:14:03:03 up 5:46, 4 users, load average: 0.00, 0.01, 0.05
  • 14:03:03:当前系统时间
  • up 5:46:系统自上次启动以来已运行 5 小时 46 分钟
  • 4 users:当前 4 个用户在线
  • load average: 0.00, 0.01, 0.05:最近 1 分钟、5 分钟和 15 分钟的平均负载

平均负载(load average)表示处于可运行态或不可中断睡眠态(等待 I/O)的进程平均数量,不是 CPU 使用率。具体原理后面再写一篇文章介绍吧,现在还不是很了解。

任务和 CPU 状态

任务和 CPU 状态由两行构成,显示系统任务运行情况和 CPU 的状态。

  • 第一行示例:Tasks: 246 total, 2 running, 244 sleeping, 0 stopped, 0 zombie

  • 246 total:当前进程总数(在较新版本中,thread 模式下可能显示线程数)

  • 2 running:正在 CPU 上运行或等待调度的进程数

  • 244 sleeping:处于可中断睡眠态,等待事件或 I/O

  • 0 stopped:被信号停止(如 SIGSTOP

  • 0 zombie:僵尸进程,已退出但父进程尚未回收

  • 第二行展示两次刷新间各类 CPU 时间占比(多核时可能为所有核心的汇总或均值):

  • us:用户态进程占用的时间

  • sy:内核态占用的时间

  • ni:调整了 nice 值的用户态进程占用的时间

  • id:CPU 空闲时间

  • wa:等待 I/O 完成的时间(CPU 空闲但进程在等磁盘/网络)

  • hi:硬件中断花费的时间

  • si:软中断花费的时间

  • st:虚拟机被宿主机「偷走」的 CPU 时间(仅虚拟化环境有意义)

wa 持续偏高,优先怀疑磁盘或网络 I/O 瓶颈,而不是 CPU 算力不足。

内存使用情况

内存使用情况由两行构成,描述物理内存及交换空间(swap)的使用情况。

  • 第一行(物理内存)示例:MiB Mem : 4026224 total, 2080500 free, 1021168 used, 924556 buff/cache

  • total:物理内存总量

  • free:完全未被使用的内存

  • used:已被进程占用的内存

  • buff/cache:用作页缓存和内核缓冲的内存,在需要时可被回收

  • 第二行(交换空间)示例:MiB Swap: 4063228 total, 4063228 free, 0 used. 2747656 avail Mem

  • total / free / used:swap 总量、空闲、已用

  • avail Mem:估算的可用内存,约等于 free + 可回收的 buff/cache,比单独看 free 更能反映实际还能分配多少

Linux 会积极使用空闲内存做缓存,因此 free 偏小、buff/cache 偏大是正常现象,不必一看到「已用内存高」就紧张。

其中单位换算方式如下:

1
2
3
4
5
6
KiB = kibibyte = 1024 bytes
MiB = mebibyte = 1024 KiB = 1,048,576 bytes
GiB = gibibyte = 1024 MiB = 1,073,741,824 bytes
TiB = tebibyte = 1024 GiB = 1,099,511,627,776 bytes
PiB = pebibyte = 1024 TiB = 1,125,899,906,842,624 bytes
EiB = exbibyte = 1024 PiB = 1,152,921,504,606,846,976 bytes

进程信息

进程列表默认按 %CPU 降序排列,各列含义如下:

列名 含义
PID 进程 ID
USER 进程所有者
PR 优先级,数值越小越优先被调度
NI nice 值,范围 -20(高优先级)到 19(低优先级)
VIRT 进程占用的虚拟内存总量
RES 进程实际占用的物理内存(常驻集)
SHR 与其他进程共享的内存部分
S 进程状态,见下表
%CPU 自上次刷新以来 CPU 使用率
%MEM 物理内存占用占总内存的百分比
TIME+ 进程累计占用的 CPU 时间
COMMAND 启动命令或程序名

常见进程状态:

状态 含义
R Running,正在运行或等待 CPU
S Sleeping,可中断睡眠
D Disk sleep,不可中断睡眠,通常等待 I/O
T Stopped,被作业控制或信号停止
Z Zombie,僵尸进程
I Idle,空闲内核线程(部分版本)

f 可以进入字段管理界面,勾选或取消 DATASWAPP 等更多列。

交互操作指令

top 运行过程中,常用交互键如下:

按键 作用
q 退出
空格 立即刷新
s 修改刷新时间间隔
c 切换是否显示完整命令行
t 切换 CPU 状态行的显示样式
m 切换内存/交换区信息行的显示样式
l 显示或隐藏平均负载行
f 选择进程列表显示的字段
S 累计模式:子进程 CPU 时间累计到父进程
P %CPU 排序
T TIME+ 排序
M %MEM 排序
u 只显示指定用户的进程
r 修改选中进程的 nice 值(需权限)
k 向选中进程发送信号,默认 SIGTERM(需权限)
i 切换是否只显示活跃进程
1 在多核 CPU 上展开每个核心的使用率
W 将当前设置保存到 ~/.toprc,下次启动自动加载
e 循环切换进程列表中 VIRT、RES、SHR 等内存列的显示单位(KiB → MiB → GiB …)
E 循环切换顶部内存/交换区摘要行的显示单位
h 显示帮助

实用技巧

快速定位高 CPU 进程:启动后默认已按 %CPU 排序,也可按 P 重新排序。

观察内存大户:按 M%MEM 排序;结合 RES 看实际物理内存,不要被 VIRT 的虚高数值误导。

批处理留证:线上偶发卡顿时可定时采样:

1
top -b -d 5 -n 12 >> /tmp/top-$(date +%F-%H%M).log

只看某个服务:先用 pgreppidof 拿到 PID,再 top -p <PID>

线程级排查:Java、数据库等多线程程序可用 top -H -p <PID> 查看哪个线程在吃 CPU。

top 几乎是每台 Linux 服务器上都有的工具,掌握界面含义和 -b-p-H 等参数,足以应对大多数性能排查场景。