带宽、延迟、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 默认跑大块 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
| 场景 | 带宽 | RTT | BDP | 含义 |
|---|---|---|---|---|
| 同机房 | 25 Gbps | 0.1 ms | ≈ 312 KB | 默认参数够用 |
| 同城 | 10 Gbps | 2 ms | ≈ 2.5 MB | 需要窗口缩放 |
| 跨地域 | 10 Gbps | 30 ms | ≈ 37.5 MB | 单条连接基本不可能跑满 |
窗口比 BDP 小,发送方就得停下来等 ACK,带宽白白闲置。这解释了一个常见现象: 跨地域传大文件,单条连接只有几十 MB/s,开 16 条并发却能跑满——因为每条连接各自受窗口限制, 并发是在绕开这个限制。
遇到"带宽跑不满",第一步先量 RTT 算 BDP。如果 BDP 远大于实际窗口
(ss -tim 能看到 cwnd 和 wscale),
那问题在窗口而不在链路,加带宽解决不了。
检查点
一套集群要支撑 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