top
top 命令是实时监控系统性能的核心工具,显示CPU、内存、进程等动态信息。
基本启动
top
界面分为三个主要区域:
- 顶部汇总区
- 系统整体状态
- 任务信息区
- 进程详细信息
- 命令输入区
- (底部)可交互操作
按 q 退出,按 h 查看帮助。
顶部汇总区详解
- 系统时间与运行时长
top - 14:30:25 up 45 days, 3:15, 1 user, load average: 0.05, 0.10, 0.15
14:30:25:当前时间up 45 days:系统运行45天1 user:1个用户登录load average:系统负载(1、5、15分钟平均值)- 单核CPU参考值:<1.0 正常,>1.0 有等待进程
- 多核CPU:应除以核心数,如4核CPU负载4.0 = 100%使用率
✅ 关键点:负载高 ≠ CPU 高!可能是 I/O 阻塞(如磁盘慢、数据库锁)
- 任务统计
Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie
total:总进程数running:正在运行或可运行(就绪)的进程sleeping:休眠(等待事件)的进程zombie:僵尸进程(需警惕,可能程序未正确回收子进程)
- CPU使用率
%Cpu(s): 2.3 us, 1.2 sy, 0.0 ni, 96.3 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
- us (user):用户空间CPU占比 → 应用程序消耗
- sy (system):内核空间CPU占比 → 系统调用消耗
- ni (nice):优先级被
nice调整过的用户进程 CPU 占比 - id (idle):空闲CPU百分比 → 越低说明CPU越忙
- wa (wait):I/O等待百分比 → 关键指标,过高说明磁盘瓶颈
- hi (hardware interrupts):硬中断占用CPU
- si (software interrupts):软中断占用CPU
- st (steal):虚拟化环境中被偷走的CPU时间
🔥 重点关注:
us高 → 应用代码消耗 CPU(如死循环、复杂计算)wa高 → 磁盘或数据库 I/O 瓶颈(如大查询未索引)sy异常高 → 可能频繁系统调用或上下文切换
- 内存使用
MiB Mem : 7852.2 total, 1024.5 free, 4096.1 used, 2731.6 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 3500.0 avail Mem
- Mem:物理内存
total:总内存free:完全空闲内存(Linux 会尽量用内存做缓存,所以free小 ≠ 内存不足)used:已使用内存(含缓存)buff/cache:内核缓冲区(buffer)和页缓存(cache),可被回收
- Swap:交换分区(虚拟内存)
used> 0 表示物理内存不足,开始使用磁盘交换(性能急剧下降!)- 生产环境应尽量避免 Swap 被使用
💡真正可用内存 ≈ free + buff/cache
更准确看最后一行的avail Mem(可用内存,考虑了可回收缓存)
进程信息区详解
默认按CPU使用率排序:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 mysql 20 0 12.3g 5.2g 1.3g S 45.2 68.1 100:15.67 mysqld
5678 nginx 20 0 123456 45678 23456 S 2.3 0.6 5:23.45 nginx
- PID:进程ID
- USER:进程所有者
- PR/NI:优先级/谦让值(-20到19,越小优先级越高)
- VIRT:虚拟内存用量(包含共享库、映射文件等)
- RES:实际物理内存用量 → 关键指标
- SHR:共享内存大小
- S:进程状态(R=运行,S=睡眠,D=不可中断睡眠,Z=僵尸等)
- %CPU:CPU使用百分比
- %MEM:内存使用百分比
- TIME+:累计CPU时间
- COMMAND:进程名/命令
交互模式使用操作
在top运行时按以下键:
- q:退出
- h:帮助
- M:按内存使用排序
- P:按CPU使用排序(默认)
- T:按运行时间排序
- N:按PID排序
- k:杀死进程(会提示输入PID)
- r:修改进程优先级(renice)
- 1:显示每个CPU核心的详细使用率
- z:彩色/黑白显示切换
- c:显示完整命令路径
- Shift + >:向右滚动查看完整命令
- u:然后输入用户名,只显示该用户进程
- d:修改刷新间隔(秒),如
d 1表示每秒刷新 - W:保存当前配置到~/.toprc
实用场景技巧
- 只监控某个进程
top -p 12345 # 监控 PID=12345 的进程
top -p $(pgrep java) # 监控所有 Java 进程(若多个会失败,建议单个)
- 批量监控多个进程(需脚本)
# 示例:监控所有 Java 进程
top -p $(jps | awk '{print $1}' | paste -s -d ',' -)
- 非交互式输出(用于日志或脚本)
top -bn1 # 批量模式,输出一次后退出
top -bn1 -o %MEM # 按内存排序,输出一次
- 保存快照用于分析
top -bn3 -d 2 > /tmp/top.log # 每 2 秒采样一次,共 3 次,存入日志
常见误区
| 误区 | 正确理解 |
|---|---|
“free 内存少 = 内存不足” | Linux 会用空闲内存做缓存,看 avail Mem 或 free + buff/cache |
“VIRT 大 = 内存泄漏” | VIRT 包含映射文件和 swap,看 RES 和 %MEM 才真实 |
“%CPU 超过 100% 是 bug” | 多核 CPU 下,100% × 核数。4 核机器最高 400% |
“wa 高是 CPU 问题” | wa 高是 I/O 瓶颈,应查磁盘、数据库、网络 |
总结:top 在生产排查中的定位
- 第一步:用
top看全局资源瓶颈(CPU?内存?I/O?) - 第二步:按
M找内存大户,按P找 CPU 大户 - 第三步:结合
jstat、jmap、iotop、vmstat等深入分析
💡 记住口诀:
OOM 看
M,高 CPU 看P,卡顿查wa,僵尸盯Z