暗色模式

Linux 系统实时监控:从 htop 到 iostat、mpstat 与 ss 的性能观测工具

技术教程
2026-08-21
12
0

Linux 系统实时监控:从 htop 到 iostat、mpstat 与 ss 的性能观测工具

本文要点
  • uptimefree -h 快速总览负载与内存,判断系统是否"健康"。
  • vmstat 1 3 是每 1 秒采样 3 次的实时看板,重点看 r 运行队列与 si/so 交换。
  • iostat -x 定位磁盘 I/O 瓶颈,关注 %utilawait 是否长期偏高。
  • mpstat -P ALL 看单个 CPU 核心,排查是否只有个别核心被打满。
  • ss / netstat 查看端口监听与连接状态,是网络排查的第一手工具。

CPU 飙到 100%、内存吃紧、磁盘读写慢、端口连不上——服务器出问题时,运维第一件事就是"看监控"。本文用真实服务器环境,逐条实测 Linux 上最常用的实时监控命令,从最上层的总览到底层的单核、磁盘、网络逐层下钻,帮你快速定位瓶颈在哪。

先来一张总览:uptime 与 free

监控的第一步不是背参数,而是先回答两个问题:系统有多忙(负载)和内存还够不够(剩余量)。两条命令就能给出答案。

uptime && free -h

Linux 系统负载与内存总览

图中的 load average: 0.00, 0.00, 0.00 是 1 分钟、5 分钟、15 分钟三个时间窗口的平均负载。这台演示机是 2 核 CPU,负载低于 2 说明队列基本空闲;如果长期接近或超过核心数(2),说明 CPU 已经排满队了。负载是瞬时快照,更准确的看 5 分钟和 15 分钟两条曲线的趋势。

free -h 里要注意的不是 free 那一列,而是 available 这一列。Linux 会用空闲内存做缓存(buff/cache 那一列 1.0Gi),所以"真实可用"要看 available(1.3Gi),而不是裸的 free(506Mi)。Swap: 2.5Gi 表示交换分区总量,used 105Mi 说明有少量内存被换出,暂时不紧张。

实时看板:vmstat

如果你只能记住一个实时监控命令,那就是 vmstat。它用一行列出进程、内存、交换、IO、系统、CPU 六类指标,1 3 表示每 1 秒采集一次、共采集 3 次。

vmstat 1 3

vmstat 实时 CPU 与内存统计

看到这行输出,逐个字段排查:

字段含义重点关注
r运行队列长度(等待 CPU 的进程数)持续 > 核心数,CPU 是瓶颈
b不可中断睡眠进程(阻塞在 IO)大于 0 说明有进程卡在磁盘/网络
si / so每秒从磁盘换入 / 换出到磁盘的 KB持续非 0,内存不足频繁换页
bi / bo块设备读写速率(块/秒)反映磁盘 IO 压力
in / cs每秒中断数 / 上下文切换数过大说明系统繁忙
us / sy用户态 / 内核态 CPU 占用sy 高说明内核在忙(IO 或系统调用多)
id空闲 CPU 占比图中 100,极健康
wa等待 IO 的时间占比持续升高,磁盘是瓶颈
st被虚拟机管理程序抢占的时间云服务器较高,说明宿主机资源被分走

图中前两列 r 为 0、id 为 100,说明当前几乎空闲。运算规则:先看 wa 是不是高——高则磁盘瓶颈;再看 r 是不是接近核心数——是则 CPU 瓶颈;最后看 si/so 是否频繁硬交换——是则内存不足。

磁盘 I/O 下钻:iostat

vmstat 只能告诉你"磁盘可能在忙",具体是哪个磁盘、读写多快、队排多长,要靠 iostat。它是 sysstat 工具包的一员,-x 输出扩展(详细)统计。

iostat -x 1 2

iostat 块设备 I/O 详细统计

先看顶部的 avg-cpu 一行,%idle 为 100,CPU 不忙。重点看下面的 Device 设备表,每个块设备一行(loop0~loop13 是镜像设备,可忽略,真正的数据盘看 vdazram0)。看 vda 那一行的关键列:

  • r/s w/s:每秒读/写请求次数(图中 vda 为 2.76,很低)
  • rkB/s wkB/s:每秒读/写吞吐,反应实际流量
  • r_await w_await:单次读/写请求的平均等待时间(毫秒)
  • %util:设备忙碌时间占比,> 70% 通常意味着磁盘饱和

判断规矩:%util 高且 await 高,说明磁盘确实忙不过来;%util 高但 await 低,说明磁盘吞吐够、只是请求密——两者处理方向完全不同(前者考虑加盘或换 SSD,后者考虑优化应用批量读写)。

单核视角:mpstat

vmstat 是"所有 CPU 平均"的视角。但多核机器上常常只有个别核心被打满,平均数一平均就看不出问题了。这时用 mpstat -P ALL 逐个核心看。

mpstat -P ALL 1 2

-P ALL 会列出每个 CPU 核心(CPU 0CPU 1 …)各自的占用率,all 行是所有核心平均。如果看到某几个核心 %usr 持续 100 而其他核心空闲,说明是单线程热点或进程没用好多核,而不是整机过载。日常不带 -P 运行 mpstat 1 2 只看平均,和 vmstat 的 CPU 列类似,用来确认"整体有没有瓶颈"。

内存与交换:free 的完整解读

前面 uptime && free -h 只是快照,Linux 内存判读有几个容易误解的点:

free -m          # 以 MB 显示,避免 h 取整误差
cat /proc/meminfo | head -5

第一张图里 buff/cache 占了 1.0Gi,这是 Linux 用空闲内存预读磁盘/文件缓存,可随时被回收,所以 available = free + 大部分 buff/cache。判断内存是否吃紧,主要看两处:available 是否长时间接近 0,以及 Swapsi/so(见 vmstat)是否频繁换页。只要 available 还有余量、没有大量硬交换,就还不能说内存不够。

端口与连接:ss 与 netstat

前面全是 CPU / 内存 / 磁盘,网络维度的第一手工具是 ss(新版推荐,替代老牌的 netstat)。服务"连不上、起了没"先从端口查起。

ss -s      # 汇总各种连接状态数量
ss -tlnp   # 列出当前监听的 TCP 端口及对应进程

ss -sTCP: 14 (estab 4, …) 表示 14 条 TCP 中 4 条已建立连接;ss -tlnpState=LISTEN 条目就是正在监听的端口,Process 一列能看到是谁(如 sshdnginx)占用的。旧系统没有 ss 时用等价的 netstat -tulnp,输出大同小异。判断规则:服务端口没出现在 LISTEN 里 → 进程没起或没绑定;出现了但连不上 → 问题在防火墙(nftables/iptables)而非服务本身。

sysstat 全家桶:sar 的历史数据

上面的命令都只能看"当下"或"接下来几秒"。要回看昨天某一时刻的 CPU 占满是因为什么,需要 sar(History 历史回放)。sysstat 默认每 10 分钟自动记录一份系统快照到 /var/log/sysstat

sar -u                       # 历史 CPU 使用率
sar -r                       # 历史内存、交换
sar -b                       # 历史磁盘 IO

这些命令在故障已经过去之后特别有用:出问题时现场没盯着,事后靠 sar 回放定位是几点、哪个指标先异常。sar -u 的输出列(%user%system%idle 等)和前面 vmstatiostat 的字段一一对应,掌握了实时命令,回看历史数据零上手成本。

组合一套排查流程

把上面的命令串起来,就是一个完整的"从外到内"排查链:

uptime            # ① 负载高不高
free -h           # ② 内存 / 交换余量
vmstat 1 5        # ③ r 队列 / wa / si so,判断瓶颈大类
iostat -x 1 3     # ④ 确认是不是磁盘
mpstat -P ALL 1 3 # ⑤ 确认是不是单核热点
ss -tlnp          # ⑥ 网络层,服务端口与连接

每次 top/ps 定位出"具体是哪个进程"(可参考本博客的进程与性能排查,再用组合监控确认"整体影响面",这样定位问题既不盲人摸象,也不漏掉波及范围。

参考资料

发表评论

暂无评论,快来抢沙发吧!