top 命令详解
更新时间:2026-08-29。本文是「一个命令一个文档」系列,属于进程管理命令。ps 看快照,
top看实时——服务器一卡,第一反应是开top看谁在作妖。
为什么写 top?因为它是个交互式程序,进去后一堆按键(P/M/k/r)新手不知道;而且顶部的 load average 三数字、%Cpu(s) 那行被很多人误读(%Cpu(s): 3.0 us, 1.0 sy, 96.7 id 里 id 高的意思其实是闲)。读懂这两块,监控就入门了。
top 实时刷新(默认 3 秒)显示系统概要 + 进程列表,按 CPU 占用降序排。
一、最该懂的顶部概要
进 top 先看前两行:
top - 10:23:45 up 32 days, 1:12, 2 users, load average: 0.50, 0.30, 0.20
Tasks: 210 total, 1 running, 209 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.0 us, 1.0 sy, 0.0 ni, 96.7 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st
MiB Mem : 15988.4 total, 1024.3 free, 8812.5 used, 6151.6 buff/cache- load average:1/5/15 分钟平均负载。数值含义≈运行队列长度(含运行+等待CPU的进程数)。单核满载约 1.0;4 核机器 load 4 才满。长期 >核数说明排队。
- %Cpu(s) 那行:
us用户态、sy内核态、id空闲(高=闲)、wa等IO(高=存储瓶颈)、st被虚拟机偷走(云主机抢资源)。 - Mem:
buff/cache是缓存,真"可用"≈ free+buff/cache,别被 used 吓到。
关键纠偏:
load average不是 CPU 使用率!它是"平均有几个进程在跑或等跑"。CPU 100% 时单核 load≈1;但 IO 卡住也会推高 load(进程等磁盘),此时 CPU id 可能还高——这就是"load 高但 CPU 不忙",得看wa。
二、进程列表字段含义
| 列 | 含义 |
|---|---|
PID | 进程号 |
USER | 属主 |
PR/NI | 优先级 / nice 值 |
%CPU | 该进程 CPU 占用(多核可超 100%) |
%MEM | 物理内存占比 |
RES | 实际物理占用(KB) |
SHR | 共享内存 |
S | 状态(同 ps 的 STAT) |
TIME+ | 累计 CPU 时间 |
COMMAND | 命令 |
三、交互按键一张表(覆盖九成操作)
| 按键 | 作用 |
|---|---|
P | 按 %CPU 排序(默认) |
M | 按 %MEM 排序 |
T | 按 TIME+(累计CPU时间)排序 |
N | 按 PID 排序 |
k | 杀进程:输入 PID 再输信号(默认 15,强杀用 9) |
r | renice:改某 PID 的 nice 值 |
u | 只看某用户 |
c | 切换显示完整命令 vs 仅程序名 |
1 | 展开显示每个核心的 CPU 使用(看多核均衡) |
h | 帮助 |
q | 退出 |
< / > | 左右移动排序字段 |
z | 彩色高亮 |
f | 字段管理(增删显示列) |
日常三连:
P找 CPU 热点、M找内存大户、k干掉异常进程。按1看多核——单看总的%Cpu(s)在多核机器上会"平均掉",掩盖单核打满。
四、实战 demo
demo 1:进去先按 P 找 CPU 杀手
top
# 进去默认就按 CPU 排,直接看前几行
# 若被打乱,按 P 恢复;按 1 确认是不是单核跑满demo 2:只盯某个用户(多用户服务器)
top
# 按 u,输入 www,回车 → 只剩 www 的进程demo 3:直接在 top 里杀掉失控进程
top
# 按 k,提示输入 PID → 输入 1234 → 提示信号 → 输入 9(强杀)
# 比退出再 kill 快,适合紧急止损demo 4:非交互模式(脚本/一次性快照)
top -b -n 1 > snapshot.txt # -b 批处理模式,-n 1 只取一帧
top -b -n 1 | head -20 # 取前 20 行做报警采集demo 5:看多核是否均衡(排查单核瓶颈)
top
# 按 1 → 显示 %Cpu0 %Cpu1 ... 各核占用
# 若某核长期 100% 其他闲,可能是单线程程序瓶颈五、和 htop / ps / atop 的对照
- htop:
top的现代化版,鼠标操作、彩色、树状、横向滚动,默认可能没装但体验好,见 htop(若站点有)。 - ps:
top的静态版,写脚本取数用 ps。 - atop:记录历史,事后回溯"昨天三点谁吃的 CPU"。
htop # 更友好的实时视图(若已安装)
ps aux --sort=-%cpu | head # 不要交互、只要快照时用 ps六、常见坑
load average高 ≠ CPU 满,先看wa(IO)和st(虚拟化抢占)。- 多核机器看单核要按
1,否则被平均掩盖。 %CPU多核可超 100%(4 核进程吃满 2 核显示 200%)。top里k杀不掉D状态(不可中断睡眠)进程,得解决底层 IO。- 容器里
top看到的是宿主机视角(除非正确隔离),看容器真实占用用docker stats或 cgroup 工具。
七、关键字段逐行解读(别只看个大概)
顶部摘要区每个数都对应一种瓶颈方向,单独拎出来看:
load average: 0.50, 0.30, 0.10:1/5/15 分钟平均运行队列长度(正在跑+等CPU的进程数),不是 CPU 使用率。经验线:单核满载≈1,4 核满载≈4;持续高于核数说明排队。15 分钟线比 1 分钟线更能看趋势。%Cpu(s): us ni sy id wa hi si st:us用户态、sy内核态、id 空闲、waIO 等待(高=磁盘/网络瓶颈)、st被虚拟化层抢占(云主机被邻座挤占)。CPU 满先看wa还是us再下结论。KiB Mem : total free used buff/cache:buff/cache是页缓存,看起来 free 小别慌,真正紧张看available(top 后续版本或 free 命令有)。- 进程行
RESvsVIRT:VIRT含虚拟映射(含已 mmap 没实际占的),RES才是物理常驻内存,比内存看RES。
这张图把 top 顶部三个信息块指向各自该回答的问题:队列是否排队、CPU 卡在用户还是 IO、内存是真紧还是只是缓存占着。
八、和脚本取数的衔接
top -b -n 1 是给脚本用的快照,但列不稳(不同版本列数不同),生产报警更推荐用 ps 固定格式取数:
# 比 top 批处理更稳的报警采集
ps -eo pid,pcpu,pmem,comm --sort=-pcpu | head -6
# 只看某进程累计 CPU 时间(找"跑了很久"的隐患)
ps -o pid,etime,time,cmd -C nginx相关命令
一句话总结
top = 实时进程监控:顶部 load average(1/5/15分钟平均运行队列,≠CPU使用率) 和 %Cpu(s)(id高=闲、wa高=IO瓶颈) 是核心;列表按 P(CPU)/M(内存)/T(时间) 排序,按 1 看每核均衡,按 k 现场杀进程;多核别被总 %Cpu 平均掩盖,单核瓶颈按 1 现形。