一、系统状态概览(Header 部分)
当你打开 top 时,最顶部会显示一段系统概况信息,通常包括以下字段:
1. 1 行:时间、运行时间、用户数、负载
02:24:08 up 7 days, 2:18, 2 users, load average: 0.00, 0.01, 0.05
-
时间:当前系统时间(如
02:24:08)。 -
up:系统运行时间(如
7 days, 2:18),表示系统已经连续运行了多少时间。 -
users:当前登录系统的用户数(如
2 users)。 -
load average:负载平均值(如
0.00, 0.01, 0.05),分别表示过去 1 分钟、5 分钟、15 分钟的系统平均负载(详见“负载”分析)。
2. 2 行:任务(进程)状态
Tasks: 269 total, 1 running, 268 sleeping, 0 stopped, 0 zombie
- total:当前系统中总的进程数(包括所有状态)。
- running:正在运行(使用 CPU)的进程数。
- sleeping:处于休眠(等待 CPU 时间片)的进程数。
- stopped:被停止的进程数(如被调试器暂停)。
- zombie:僵尸进程数(已经结束但父进程未回收)。
3. 3 行:CPU 使用情况(%Cpu(s))
%Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
- us(user):用户空间进程占用 CPU 的时间百分比。
- sy(system):内核空间进程占用 CPU 的时间百分比。
- ni(nice):用户进程改变优先级(nice)的时间百分比。
- id(idle):CPU 空闲时间的百分比(此值越大,CPU 越空闲)。
- wa(iowait):CPU 等待 I/O 完成的时间百分比(高于 20% 通常表明磁盘或网络 I/O 瓶颈)。
- hi(hardware interrupt):硬件中断占用的时间百分比。
- si(software interrupt):软件中断占用的时间百分比。
- st(steal time):虚拟化环境中,被虚拟机监控程序(hypervisor)抢占的时间。
4. 4 行:内存使用情况(KiB Mem)
KiB Mem : 16265712 total, 15250336 used, 1015520 free, 2556420 buffers
- total:物理内存总量。
- used:已使用的内存(包括缓存)。
- free:未使用的内存。
- buffers:系统用于缓冲 I/O 的内存(已被占用,但随时可供应用使用)。
- cache:页面缓存占用的内存。
- available:可以直接用于新进程的内存(较准确的可用内存估算)。
5. 5 行:交换分区使用情况(KiB Swap)
KiB Swap: 8388604 total, 0 used, 8388604 free. 10860936 cached Mem
- total:交换分区总大小。
- used:已使用的交换空间(如果此值很高,说明系统内存不足,正在使用磁盘交换)。
- free:未使用的交换空间。
二、进程列表(Body 部分)
top 的核心部分是中间的进程列表。默认显示前 20 条,占用 CPU 最高的进程。
常见列的含义
| 列名 | 含义 | 备注 |
|---|---|---|
| PID | 进程 ID | 系统唯一标识 |
| USER | 所属用户 | 进程所属的登录用户 |
| PR | 优先级 | 数值越低优先级越高(低数字 = 高优先级) |
| NI | Nice 值 | 调度优先级修正值(-20 为最高优先级,19 为最低) |
| VIRT | 虚拟内存 | 进程可访问的全部虚拟内存(包含磁盘映射、代码段等) |
| RES | 常驻内存 | 实际占用的物理内存(RSS) |
| SHR | 共享内存 | 与其他进程共享的内存(如共享库) |
| S | 状态码 | 进程当前状态(S=休眠, R=运行, Z=僵尸, T=停止, D=不可中断睡眠) |
| %CPU | CPU 占用率 | 当前进程占用 CPU 的百分比 |
| %MEM | 内存占用率 | 当前进程占用物理内存的百分比 |
| TIME+ | 累计 CPU 时间 | 进程从启动至今占用 CPU 的总时间 |
| COMMAND | 进程名/命令行 | 进程的完整命令行或程序名 |
三、如何通过字段进行分析
1. CPU 瓶颈分析
-
观察
%CPU:直接排序看哪个进程占用了最多的 CPU。 -
观察
%Cpu(s)中的us和sy:如果us很高(>70%),说明是用户进程(如计算任务)导致;如果sy很高,说明是系统进程(如中断、内核任务)导致。 -
观察
wa:<font color='red'>如果wa持续高(>20%),说明磁盘 I/O 很慢,可能是磁盘故障或网络延迟</font>。
2. 内存泄漏/不足分析
-
观察
%MEM和RES:哪个进程占用了大量物理内存,可能导致系统卡顿或 OOM(Out Of Memory)。 -
观察
VIRT:如果某进程的 VIRT 非常大,但 RES 只有很小一部分,说明它预留了很多虚拟空间,但未真正使用(如 Java 程序)。 -
观察
free和available:如果available很低(如低于 10%),说明物理内存紧张,系统可能开始频繁换页。
3. 进程状态分析
-
R(Running):正在占用 CPU。 -
S(Sleeping):处于休眠状态,等待调度。 -
D(Uninterruptible Sleep):不可中断的睡眠状态,通常是 I/O 阻塞(如网络请求卡住或磁盘卡死)。 -
Z(Zombie):僵尸进程,表示子进程已经结束但父进程未回收,通常需要手动 kill 父进程或检查父进程代码。
四、常用快捷键(交互操作)
| 键位 | 功能 |
|---|---|
P |
按 CPU 使用率排序(默认)。 |
M |
按内存使用率排序。 |
T |
按运行时间排序。 |
N |
按 PID 排序。 |
k |
发送 kill 信号终止进程(需要输入 PID 和信号编号)。 |
r |
改变进程优先级(Renice)。 |
h 或 ?
|
查看帮助。 |
q |
退出 top。 |
Space |
立即刷新屏幕。 |
d |
修改刷新间隔(默认 3 秒)。 |
五、Load Average分析
示例输出:
top - 14:30:25 up 10 days, 3:15, 2 users, load average: 2.34, 1.78, 1.25
三个数字分别表示:
-
2.34:过去 1 分钟 的平均负载 -
1.78:过去 5 分钟 的平均负载 -
1.25:过去 15 分钟 的平均负载
关键规则:
负载值 / CPU核心数 = 每个核心的平均负载
解读表格:
| 负载值/核心数比 | 状态说明 | 建议操作 |
|---|---|---|
| < 0.7 | 系统空闲,资源充足 | 正常,无需担心 |
| 0.7 - 1.0 | 系统正常,有适当余量 | 监控关注 |
| 1.0 - 1.5 | 系统繁忙,需要关注 | 开始调查原因 |
| 1.5 - 2.0 | 系统过载,性能下降 | 立即排查优化 |
| > 2.0 | 严重过载,服务可能受影响 | 紧急处理 |
经验阈值总结:
| 系统类型 | 正常范围 | 行动阈值 | 紧急阈值 |
|---|---|---|---|
| Web服务器 | < 核心数×0.8 | > 核心数×1.2 | > 核心数×1.8 |
| 数据库 | < 核心数×0.6 | > 核心数×1.0 | > 核心数×1.5 |
| 应用服务器 | < 核心数×0.7 | > 核心数×1.1 | > 核心数×1.6 |
| 缓存服务器 | < 核心数×0.5 | > 核心数×0.8 | > 核心数×1.2 |
| 批处理系统 | < 核心数×1.0 | > 核心数×1.5 | > 核心数×2.0 |
关键结论
- 黄金法则:负载持续超过 核心数×1.0 就需要关注
- 短期峰值:瞬时负载达到 核心数×2.0-3.0 可能正常(如系统启动)
- 长期趋势:持续 15 分钟负载超过 核心数×1.5 必须处理
- 业务影响:根据业务 SLA 要求调整阈值
小结
top 是 Linux 系统中最直观的性能监控工具。通过观察 load average(负载)可以快速判断系统是否繁忙;通过分析 CPU%、Memory%、I/O wait 等指标,可以定位是 CPU 计算瓶颈、内存不足还是磁盘卡死。如果发现异常进程占用了大量资源,可以使用 k(kill)或 r(renice)进行干预。