Linux命令-top
简介
top 是 Linux 下最常用的进程监控工具,相当于任务管理器,能够实时显示系统中各个进程的资源占用状况。MAN 手册中的解释如下图。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 zombie246 total:当前进程总数(在较新版本中,thread 模式下可能显示线程数)2 running:正在 CPU 上运行或等待调度的进程数244 sleeping:处于可中断睡眠态,等待事件或 I/O0 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/cachetotal:物理内存总量free:完全未被使用的内存used:已被进程占用的内存buff/cache:用作页缓存和内核缓冲的内存,在需要时可被回收第二行(交换空间)示例:
MiB Swap: 4063228 total, 4063228 free, 0 used. 2747656 avail Memtotal/free/used:swap 总量、空闲、已用avail Mem:估算的可用内存,约等于free + 可回收的 buff/cache,比单独看free更能反映实际还能分配多少
Linux 会积极使用空闲内存做缓存,因此 free 偏小、buff/cache 偏大是正常现象,不必一看到「已用内存高」就紧张。
其中单位换算方式如下:
1 | KiB = kibibyte = 1024 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 可以进入字段管理界面,勾选或取消 DATA、SWAP、P 等更多列。
交互操作指令
在 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 |
只看某个服务:先用 pgrep 或 pidof 拿到 PID,再 top -p <PID>。
线程级排查:Java、数据库等多线程程序可用 top -H -p <PID> 查看哪个线程在吃 CPU。
top 几乎是每台 Linux 服务器上都有的工具,掌握界面含义和 -b、-p、-H 等参数,足以应对大多数性能排查场景。