总体原则:高度可扩展,极致性能。
Cilium 数据平面的核心功能
支持数据中心内的单个 socket 达到 100Gbps+ 带宽。
大数据、AI、机器学习以及其他网络密集型应用。
BIG TCP 并不是一个适应于大部分场景的通用方案,而是针对数据密集型应用的优化,在这些场景下能显著提升网络性能。
文档:
Going big with TCP packets, lwn.net, 2022
来计算一下,如果以 MTU=1538 的配置,要达到 100Gbps 带宽,
100Gbit/s ÷ 1538Byte ÷ 8bit/Byte == 8.15Mpps (123ns/packet)
可以看到,
大包就需要批处理:GRO、TSO。如下图所示:
IPv4 限制:单个包最大 64KB 以 RX 方向的 GRO 为例,GRO 会将重组之后的 total payload 长度更新到 IPv4 头的 tot_len 字段,这是一个 16bit 整数,单位是字节,因此最大只能表示 64KB 的包。
TX 方向的 TSO 也有一样的限制。也就是说,使用 IPv4,我们在 TX/RX 方向最大只能支持 64KB 的大包。
内核能支持更大的 batch 吗?能,使用 IPv6。
解决方式:IPv6 HBH (Hop-By-Hop),单个包最大 4GB BIG TCP 的解决方式是在本地插入一个 Hop-By-Hop (HBH) IPv6 扩展头。“本地”的意思是“在这台 node 上”,也就是说 HBH 头不会发出去,只在本机内使用。
此外,还需要对应调整 MTU 大小。
目前这个上限是 512KB,但是未来需要时,很容易扩展。这个字段是 32bit,因此理论上最大能支持 4GB 的超大包(jumbo packets)。
BIG TCP 合并到了内核 5.19+,
内核 patch:tcp: BIG TCP implementation, from Google, 2022 此外,它还需要网卡驱动的支持。
BIG TCP 的支持将出现在 Cilium 1.13。
文档:Performance: tuning: IPv6 BIG TCP
实现:Add IPv6 BIG TCP support
启用了开关之后,Cilium 将自动为 host/pod devices 设置 IPv6 BIG TCP,过程透明。
延迟:
# Back to back: AMD Ryzen 9 3950X @ 3.5 GHz, 128G RAM @ 3.2 GHz, PCIe 4.0, ConnectX-6 Dx, mlx5 driver 78
$ netperf -t TCP_RR -H <remote pod> -- -r 80000,80000 -O MIN_LATENCY,P90_LATENCY,P99_LATENCY,THROUGHPUT
TPS:
# Back to back: AMD Ryzen 9 3950X @ 3.5 GHz, 128G RAM @ 3.2 GHz, PCIe 4.0, ConnectX-6 Dx, mlx5 driver 79
$ netperf -t TCP_RR -H <remote pod> -- -r 80000,80000 -O MIN_LATENCY,P90_LATENCY,P99_LATENCY,THROUGHPUT
带宽:
iperf3 不支持 mmap()’ed TCP. 在这里的测试中,最大的开销就是 copy from/to userspace,因此最大速度卡在了 60Gbps,
提供的能力:
veth pair default/bpf-host-routing 模式转发路径 常规(默认):物理网卡和容器虚拟网卡之间要经过内核网络栈,
eBPF host routing:物理网卡通过 bpf_redirect_{peer,neigh} 直通 veth pair:
以上 eBPF host routing 双向转发效果:
现在我们正在开发一个称为 meta device 的虚拟设备,替换 veth pair:
为什么引入 meta:将 pod-specific BPF 程序从 tc bpf 移动到 meta layer。对于 meta device 来说,eBPF 程序成为了 pod 内的 device 自身的一部分。但不会由 pod 来修改或 unload eBPF 程序,而仍然由宿主机 namespace 内的 cilium 来统一管理。
延迟更低,pod 的网络延迟已经接近 host network 应用的延迟。
4.3.4 meta device vs. veth pair:实现区别 Internals for veth (today):
veth_xmit()
Internals for meta (new):
meta_xmit()
https://github.com/cilium/linux/commits/pr/dev-meta
# Back to back: AMD Ryzen 9 3950X @ 3.5 GHz, 128G RAM @ 3.2 GHz, PCIe 4.0, ConnectX-6 Dx, mlx5 driver
$ netperf -t TCP_RR -H <remote pod> -- -O MIN_LATENCY,P90_LATENCY,P99_LATENCY,THROUGHPUT
# Back to back: AMD Ryzen 9 3950X @ 3.5 GHz, 128G RAM @ 3.2 GHz, PCIe 4.0, ConnectX-6 Dx, mlx5 driver
$ netperf -t TCP_RR -H <remote pod> -- -O MIN_LATENCY,P90_LATENCY,P99_LATENCY,THROUGHPUT
# Back to back: AMD Ryzen 9 3950X @ 3.5 GHz, 128G RAM @ 3.2 GHz, PCIe 4.0, ConnectX-6 Dx, mlx5 driver
$ netperf -t TCP_STREAM -H <remote pod> -l 60