NNetpath
原理入门预计 25 分钟

带宽、延迟、PPS:三个指标与必背换算

Gbps 与 GB/s 差 8 倍,小包场景真正的瓶颈是 PPS 不是带宽。这节把口径统一。

学完这节你能做到

  • 在 Gbps、GB/s、PPS 之间快速换算,并算出线速下的理论 PPS
  • 判断一个场景到底受带宽限制还是受 PPS / 延迟限制
  • 用带宽延迟积(BDP)解释为什么长肥管道跑不满

建议先学跳过这几节会看不懂本节的部分推导

三个指标,回答三个不同的问题

指标单位回答什么受什么限制
带宽Gbps / GB/s单位时间能搬多少字节线速、收敛比
PPS包每秒单位时间能处理多少个包CPU、中断、协议栈开销
延迟微秒 / 毫秒一次往返要等多久距离、排队、处理

三者互不替代。一台机器可以带宽只用了 30% 却已经因为 PPS 撞墙而丢包;也可以带宽跑满而延迟完全正常。 先问清报障说的是哪一个,这是所有网络分析的起点。

必背换算:bit 与 Byte

网络速率用 bit 计,数据量用 Byte 计,差 8 倍。这个换算每天都要用:

25 Gbps  ÷ 8 = 3.125 GB/s   ← 理论线速
                ×0.9 ≈ 2.8 GB/s   ← 实际可用
100 Gbps ÷ 8 = 12.5  GB/s   → 约 11.2 GB/s 实际
200 Gbps ÷ 8 = 25    GB/s   → 约 22.5 GB/s 实际
400 Gbps ÷ 8 = 50    GB/s   → 约 45   GB/s 实际

那 10% 折扣是协议头、帧间隙与前导码的开销。做规划时用打折后的数,做验收时用打折后的数当合格线, 别拿理论线速去要求实测值。

一个快捷心算

Gbps 除以 8 得 GB/s。想快一点:除以 10 再加四分之一。 100 Gbps → 10 + 2.5 = 12.5 GB/s。400 Gbps → 40 + 10 = 50 GB/s。

PPS:小包场景真正的墙

每个以太网帧除了自身长度,还固定要占 20 字节的开销(前导码 7 + SFD 1 + 帧间隙 12)。 所以线速下能发多少包,取决于帧有多大:

理论 PPS = 线速(bit/s) ÷ ((帧长 + 20) × 8)

以 25 Gbps 为例:

帧长理论 PPS有效带宽
64 B(最小帧)≈ 37.2 Mpps≈ 1.9 GB/s
512 B≈ 5.87 Mpps≈ 3.0 GB/s
1500 B(默认 MTU)≈ 2.05 Mpps≈ 3.08 GB/s
9000 B(巨帧)≈ 0.35 Mpps≈ 3.12 GB/s

看最后一列:帧越大,有效带宽越接近线速。看第二列:帧越小,要处理的包越多

这里才是关键——普通 Linux 内核协议栈处理一个包大概要几微秒的 CPU 时间, 单核撑住 1~2 Mpps 就很吃力了。所以 64 字节小包场景下,先撞墙的一定是 CPU 和 PPS,不是带宽。 这时候加带宽没用,要做的是:

  • 开巨帧(如果场景允许攒大包)
  • 把包散到多核(RSS/RPS)
  • 换路线:XDP、DPDK 或 RDMA
×用 iperf3 默认参数测不出 PPS 瓶颈

iperf3 默认跑大块 TCP 流,会自动攒成大包,测出来的是带宽上限。 要测 PPS 得显式发小包(比如 iperf3 -u -l 64 -b 0)或者用专门的打包工具。 两种测试的合格线完全不同,别拿一个的结果去解释另一个。

延迟由四部分组成

总延迟 = 串行化 + 传播 + 排队 + 处理
  • 串行化:把比特推上线路要花的时间。25 Gbps 下一个 1500 字节的帧约 0.5 μs。速率越高越可忽略。
  • 传播:光在纤里跑,约 5 μs / 公里。同机房可忽略,跨城市(100 km)就是单向 500 μs。
  • 排队:交换机和主机队列里的等待。这是唯一会剧烈波动的部分,也是抖动的来源。
  • 处理:协议栈、转发查表、应用自己的耗时。

实践含义:同机房里延迟波动一定来自排队(拥塞、收敛比不足、队列太深)。 延迟从 50 μs 涨到 5 ms 而带宽没变,那就是在某处排队,去找那个队列。

BDP:为什么长肥管道跑不满

一条 TCP 连接要跑满带宽,"在途"的数据量必须能填满整条管道:

BDP(字节)= 带宽(bit/s) × RTT(s) ÷ 8
场景带宽RTTBDP含义
同机房25 Gbps0.1 ms≈ 312 KB默认参数够用
同城10 Gbps2 ms≈ 2.5 MB需要窗口缩放
跨地域10 Gbps30 ms≈ 37.5 MB单条连接基本不可能跑满

窗口比 BDP 小,发送方就得停下来等 ACK,带宽白白闲置。这解释了一个常见现象: 跨地域传大文件,单条连接只有几十 MB/s,开 16 条并发却能跑满——因为每条连接各自受窗口限制, 并发是在绕开这个限制。

i先看 RTT 再判断

遇到"带宽跑不满",第一步先量 RTT 算 BDP。如果 BDP 远大于实际窗口 (ss -tim 能看到 cwndwscale), 那问题在窗口而不在链路,加带宽解决不了。

检查点

检查点单选

一套集群要支撑 4 GB/s 的持续写入,单节点接入 25GbE。至少需要几个节点的接入带宽才够(只看网络)?

检查点单选

一台机器带宽只用到 25%,但已经开始丢包,且某个 CPU 核的 %soft 接近 100%。最可能的原因?

检查点单选

10 Gbps、RTT 30 ms 的跨地域链路,单条 TCP 连接只跑到 60 MB/s。下面哪个判断是对的?

这节课的落点

  • 带宽、PPS、延迟回答三个不同的问题,报障先问清是哪一个
  • Gbps ÷ 8 = GB/s,实际按 90% 线速折算
  • 小包场景 PPS 先撞墙:25G 线速下 64B 小包有 37 Mpps,而单核内核协议栈只能撑 1~2 Mpps
  • 同机房的延迟波动一定来自排队,去找那个队列
  • BDP = 带宽 × RTT ÷ 8;窗口小于 BDP 时单连接必然跑不满

延伸资料

  • ·Systems Performance, 2nd Edition — Brendan Gregg