从性能视角读 top
top 分上下两部分:上面的系统摘要行才是判断系统整体状态的主依据,下面的进程列表用于定位具体消耗者。顺序应该反过来看——先在摘要里确认瓶颈类型(CPU 算力、IO 等待、内存压力、虚拟化抢占),再去进程列表找对应的进程。这个顺序能避免「盯着 CPU 排序却查不出问题」的常见困境。
基本信息
| 适用平台 | Linux(procps-ng 的 top);精简容器里的 BusyBox top 字段不完整 |
|---|---|
| 命令语法 | top [选项] |
| 采集相关选项 | -b 批模式(适合重定向)、-n 刷新次数、-d 间隔秒数、-1 单核视图、-o 排序字段、-H 线程模式、-c 完整命令、-p 指定 PID、-u 指定用户 |
| 交互键 | 1 展开每核、M 内存排序、P CPU 排序、T 按运行时间排序、c 完整命令、k 发信号、r 调优先级、z 彩色、W 保存配置 |
| 数据来源 | 采样 /proc/stat、/proc/meminfo 与 /proc/[pid] 的两次差值,因此显示的是区间增量 |
典型使用场景
- 确认瓶颈类型:先看 wa、st 与 us 的组合,判断是算力、IO 还是虚拟化抢占
- 查看内存与交换:核对 available 与 swap 使用,判断是否出现内存压力
- 批量留档:top -b -d 1 -n 5 输出到文件,作为告警期间的现场证据
- 单核热点定位:按 1 展开每核,确认是单线程瓶颈还是整体负载
- 线程级排查:按 H 观察多线程应用的线程分布
- 定期体检:登录机器后先跑一次,与历史基线对比
常用示例
常用示例
top -b -d 1 -n 5 > /tmp/top-$(date +%s).log # 采样五分钟留档
top -o %CPU -b -n 1 | head -n 15 # 单次按 CPU 排序
top -H -b -n 1 -p 1234 # 查看某进程的线程
TERM=xterm top -d 2 # 交互模式,2 秒刷新
# 交互界面里:
# 1 展开每核 M 内存排序 P CPU 排序 c 完整命令 W 保存配置
vmstat 1 5 # top 看全局,vmstat 看趋势
iostat -xz 1 3 # wa 高时转去看磁盘摘要行逐项读法
| 字段 | 含义 | 判读 |
|---|---|---|
| load average | 1、5、15 分钟平均负载 | 与逻辑核数对比,别只看绝对值 |
| Tasks | 进程总数与运行、睡眠、停止、僵尸的数量 | 僵尸数持续不为 0 要处理父进程 |
| %Cpu us / sy | 用户态与内核态占比 | us 高看应用,sy 高看系统调用与网络 |
| %Cpu wa | 等待 IO 的比例,此时 CPU 空闲 | 持续偏高说明存储是瓶颈 |
| %Cpu st | 被虚拟化宿主抢占的比例 | 云主机上偏高属于资源竞争 |
| MiB Mem | total、free、used、buff-cache | 与 free 命令口径对应,used 含缓存差异要留意 |
| MiB Swap | 交换空间总量与已用 | 结合 vmstat 的 si/so 判断是否在换页 |
top 与 vmstat、iostat 的分工:top 给出「现在谁在消耗什么」的快照,适合定位进程;vmstat 适合看趋势与等待类型(r、b、si、so、cs);iostat 负责存储侧细节(await、util、队列深度)。三者配合使用,比在 top 里反复刷新有效得多。
按 W 可以把当前的排序字段、显示列与刷新间隔保存到 ~/.toprc,下次启动直接沿用。批模式的输出是固定宽度纯文本,适合落盘归档与简单解析,但不适合当作长期监控数据源——历史曲线与趋势对比应交给导出到监控平台的指标,top 只负责现场判断。
在容器里运行 top,摘要行的 CPU 与内存数字来自宿主机的 /proc,除非宿主做了 lxcfs 之类的伪装。容器自身的资源压力要看 cgroup 指标(cpu.stat 的 nr_throttled、memory.current 与 memory.max),否则容易把宿主整体负载误判为容器问题。
交互与采样要点
| 操作 | 作用 | 场景 |
|---|---|---|
| 切换排序字段 | 按 CPU 或内存重排 | 先找热点再深挖 |
| 显示完整命令行 | 避免只看进程名 | 确认是哪个实例 |
| 展开线程视图 | 看到内部热点线程 | 定位多线程争用 |
| 批模式采样 | 固定次数后输出 | 留证据与横向对比 |
| 调整刷新间隔 | 改变采样节奏 | 抓瞬时抖动 |
判断趋势不要靠单次快照:用固定间隔的批模式连续采样一段窗口,再结合系统级统计工具交叉验证,才能区分偶发尖峰与持续压力。容器场景里要意识到摘要行反映的是宿主机整体指标,容器自身压力应看用量与限制数据,两者混用会得出相反结论。