linux系统实时吞吐量需分磁盘与网络:磁盘用iostat -x 1(rmb/s/wmb/s为真实吞吐),网络用sar -n dev 1(rxkb/s/txkb/s为真实速率),二者指标不可混用,否则误判瓶颈。

要看 Linux 系统的实时吞吐量,必须分清「磁盘」和「网络」两类——它们用完全不同的工具、指标和解读逻辑,混用就会误判瓶颈。
iostat -x 1 是看磁盘真实吞吐的唯一可靠方式
普通 iostat 输出的 rkB/s 和 wkB/s 是 VFS 层统计值,大量命中 page cache 后数值虚高,跟 SSD 厂商标称带宽对不上。只有加 -x 才能拿到绕过缓存、从块设备驱动直接上报的真实数据:
-
iostat -xh 1:自动换算单位(K/M/G),字段名仍是rMB/s/wMB/s,但数值已适配,人眼友好 -
iostat -xk 1:固定 KB 单位,字段名不变(历史兼容),适合脚本解析 - 只看某盘?加路径:
iostat -xh 1 /dev/sdb - 要看所有分区(含 LVM、mdadm)?用
iostat -xh 1 -p ALL
关键字段不是 r/s 或 w/s(那是逻辑请求数,会被合并/重排),而是:rMB/s(真实读吞吐)、wMB/s(真实写吞吐)、r_ios/w_ios(真实 IOPS)。
sar -n dev 1 是看网络实时吞吐的最小依赖方案
sar 来自 sysstat 包,输出稳定、字段标准,且不依赖 root 权限(只要用户有读取 /proc/net/dev 的权限):
-
sar -n dev 1 5:每秒采样一次,共 5 次,输出rxkb/s(接收 KB/s)和txkb/s(发送 KB/s) - 字段单位固定为 KB/s,不自动缩放;想看 MB/s 需手动除以 1024
- 若需持续盯屏,
sar -n dev 1可无限刷新,首行是“冷启动”平均值,跳过即可 -
sar不显示进程或连接详情,归因要配合iftop -n或ss -tuln
别用 netstat 或 ip——它们查状态,不统计速率;dstat 的 network 列虽快但精度低,字段语义模糊,不适合定位带宽瓶颈。
为什么 iotop 和 nload 不能替代 iostat/sar
iotop 显示的是 DISK WRITE(内核块层统计),含 write-back 缓存未落盘部分;iostat -x 的 wMB/s 是真正发往设备的数据速率。两者差值大,说明缓存堆积严重——这时你看到的不是吞吐瓶颈,而是刷盘延迟问题。
-
nload eth0图形直观,但只显示瞬时速率,无历史趋势、无单位换算控制(-u M可强制 MB/s,但默认是自动缩放) -
iftop -n能定位具体连接,但采样基于 libpcap,开销高,且在高包量下丢包率上升,速率不准 -
/proc/net/dev提供累计字节数,需自行差值计算,容易因采样间隔抖动导致误判峰值
这些工具适合“扫一眼有没有异常”,但一旦要判断是否达到物理极限、是否该扩容或调优,必须切回 iostat -x 和 sar -n dev。
真正卡住人的地方,往往不是命令敲不对,而是把 rkB/s 当吞吐、把 r/s 当 IOPS、用 dstat 结论去调数据库参数——指标没对齐,优化就南辕北辙。











