Cilium系列-10-启用 IPv6 BIG TCP和启用巨帧
系列文章
前言
将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提升 Cilium 的网络性能. 具体调优项包括不限于:
- 启用本地路由(Native Routing)
- 完全替换 KubeProxy
- IP 地址伪装(Masquerading)切换为基于 eBPF 的模式
- Kubernetes NodePort 实现在 DSR(Direct Server Return) 模式下运行
- 绕过 iptables 连接跟踪(Bypass iptables Connection Tracking)
- 主机路由(Host Routing)切换为基于 BPF 的模式 (需要 Linux Kernel >= 5.10)
- 启用 IPv6 BIG TCP (需要 Linux Kernel >= 5.19)
- 禁用 Hubble(但是不建议, 可观察性比一点点的性能提升更重要)
- 修改 MTU 为巨型帧(jumbo frames) (需要网络条件允许)
- 启用带宽管理器(Bandwidth Manager) (需要 Kernel >= 5.1)
- 启用 Pod 的 BBR 拥塞控制 (需要 Kernel >= 5.18)
- 启用 XDP 加速 (需要 支持本地 XDP 驱动程序)
- (高级用户可选)调整 eBPF Map Size
- Linux Kernel 优化和升级
CONFIG_PREEMPT_NONE=y
- 其他:
- tuned network-* profiles, 如:
tuned-adm profile network-latency或network-throughput - CPU 调为性能模式
- 停止
irqbalance,将网卡中断引脚指向特定 CPU
- tuned network-* profiles, 如:
在网络/网卡设备/OS等条件满足的情况下, 我们尽可能多地启用这些调优选项, 相关优化项会在后续文章逐一更新. 敬请期待.
今天我们来调优 Cilium, 启用 IPv6 BIG TCP 允许网络协议栈准备更大的 GSO(发送)和 GRO(接收)数据包,以减少协议栈的遍历次数,从而提高性能和延迟.
测试环境
- Cilium 1.13.4
- K3s v1.26.6+k3s1
- OS
- 3 台 Ubuntu 23.04 VM, Kernel 6.2, x86
IPv6 BIG TCP
IPv6 BIG TCP 允许网络协议栈准备更大的 GSO(发送)和 GRO(接收)数据包,以减少协议栈的遍历次数,从而提高性能和延迟。它可减少 CPU 负载,有助于实现更高的速度(即 100Gbit/s 及以上)。为了让这些数据包通过协议栈,BIG TCP 在 IPv6 头之后添加了一个临时的 "逐跳"(Hop-By-Hop)头,并在通过线路传输数据包之前将其剥离。BIG TCP 可在双协议栈设置中运行,IPv4 数据包将使用旧的下限(64k),IPv6 数据包将使用新的较大下限(192k)。请注意,Cilium 假定 GSO 和 GRO 的默认内核值为 64k,只有在必要时才会进行调整,也就是说,如果启用了 BIG TCP,而当前的 GSO/GRO 最大值小于 192k,那么 Cilium 会尝试增加这些值;如果禁用了 BIG TCP,而当前的最大值大于 64k,那么 Cilium 会尝试减少这些值。BIG TCP 不需要更改网络接口 MTU。
需求
- ️ Kernel >= 5.19
- ️ eBPF Host-Routing(主机路由)
- ️ 基于 eBPF 的 kube-proxy 替换
- ️ 基于 eBPF masquerading(伪装)
- ️ 禁用隧道(Tunnel)和加密
- 支持的 NICs: mlx4, mlx5
由于我这里没有 mlx4, mlx5 型号的网卡, 所以本次无法实战测试了.
要启用 IPv6 BIG TCP:
helm install cilium cilium/cilium --version 1.13.4 \
--namespace kube-system \
--set tunnel=disabled \
--set bpf.masquerade=true \
--set ipv6.enabled=true \
--set enableIPv6Masquerade=false \
--set enableIPv6BIGTCP=true \
--set kubeProxyReplacement=strict
请注意,切换 IPv6 BIG TCP 选项后,必须重新启动 Kubernetes Pod 才能使更改生效。
要验证您的安装是否使用 IPv6 BIG TCP 运行,请在任何一个 Cilium pod 中运行 cilium status,并查找报告 "IPv6 BIG TCP "状态的行,其状态应为 "enabled"。
修改 MTU 为巨型帧
这里也顺便提一下"修改 MTU 为巨型帧".
最大传输单位(MTU)会对配置的网络吞吐量产生重大影响。Cilium 将自动检测底层网络设备的 MTU。因此,如果系统配置为使用巨型帧,Cilium 将自动使用巨型帧。
要从中受益,请确保您的系统配置为使用巨型帧(如果您的网络允许)。
因为我的网络设备无法修改为巨型帧, 所以本次也无法实战测试.
总结
本文调优 Cilium, 启用 IPv6 BIG TCP 允许网络协议栈准备更大的 GSO(发送)和 GRO(接收)数据包,以减少协议栈的遍历次数,从而提高性能和延迟.
但是前提条件是 Kernel >= 5.19, 且需要特定网卡支持. 所以本次无法实际验证.
另一项调优为: 修改 MTU 为巨型帧, 以提升网络吞吐量. 但是前提条件是网络允许.
至此,性能调优已完成实战验证:
- ️ 启用本地路由 (Native Routing)
- ️ 完全替换 KubeProxy
- ️ IP 地址伪装 (Masquerading) 切换为基于 eBPF 的模式
- ️ Kubernetes NodePort 实现在 DSR(Direct Server Return) 模式下运行
- ️ 绕过 iptables 连接跟踪 (Bypass iptables Connection Tracking)
- ️ 主机路由 (Host Routing) 切换为基于 BPF 的模式 (需要 Linux Kernel >= 5.10)
- 启用 IPv6 BIG TCP (需要 Linux Kernel >= 5.19, 支持的 NICs: mlx4, mlx5)
- 由于没有支持的网卡, 无法完成验证
- 修改 MTU 为巨型帧 (jumbo frames) (需要网络条件允许)
- 启用带宽管理器 (Bandwidth Manager) (需要 Kernel >= 5.1)
- 启用 Pod 的 BBR 拥塞控制 (需要 Kernel >= 5.18)
- 启用 XDP 加速 (需要 支持本地 XDP 驱动程序)
️参考文档
三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.
Cilium系列-10-启用 IPv6 BIG TCP和启用巨帧的更多相关文章
- TCP系列10—连接管理—9、syncookie、fastopen与backlog
这部分内容涉及较多linux实现,可以跳过. 一.listen系统调用对backlog的处理 当socket处于LISTEN或者CLOSED状态时,fastopen队列的长度可以通过TCP_FASTO ...
- 二进制安装Kubernetes(k8s) v1.22.10 IPv4/IPv6双栈
二进制安装Kubernetes(k8s) v1.22.10 IPv4/IPv6双栈 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes二进制安装 后续尽可能第一时间更 ...
- windows 启用ipv6(for XX-net)补充“Ping请求找不到主机”问题
ipv6.google.com 有点地方直接能启用,有的时候不行. 导致在xx - net 里无法启用ipv6 这样搞试试 netsh int ipv6 isatap set state enable ...
- Ubuntu启用IPv6上google的方法
Pv6就是我们通常所说的互联网协议,是TCP/IP的核心协议,那么在Linux下如何开启IPv6呢?下面以Ubuntu为例,给大家介绍下Ubuntu启用IPv6的方法. 方法: $sudo apt-g ...
- Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例
概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMa ...
- 网游中的网络编程系列1:UDP vs. TCP
原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...
- Java 集合系列 10 Hashtable详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- 封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类
快速开发系列 10个常用工具类 http://blog.csdn.net/lmj623565791/article/details/38965311 ------------------------- ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ( ...
- TCP系列11—重传—1、TCP重传概述
在最开始介绍TCP的时候,我们就介绍了TCP的三个特点,分别是面向连接.可靠.字节流式.前面内容我们已经介绍过了TCP的连接管理,接下来的这部分内容将会介绍与TCP可靠性强关联的TCP重传. 很多网络 ...
随机推荐
- 2022CSP游记
目录 CSP-J2022 7:45 8:15 8:27 8:38 9:12 9:23 10:34 11:57 中午 CSP-S2022 2:27 4:15 6:12 估分 普及 提高 自查 出分 废物 ...
- 微服务 - Nginx网关 · 进程机制 · 限流熔断 · 性能优化 · 动态负载 · 高可用
系列目录: 微服务 - 概念 · 应用 · 通讯 · 授权 · 跨域 · 限流 微服务 - 集群化 · 服务注册 · 健康检测 · 服务发现 · 负载均衡 微服务 - Redis缓存 · 数据结构 · ...
- IDP中的黄金路径究竟是什么?
在云原生时代,开发人员面临着越来越多的工具.技术.思维方式的选择,给他们带来了极大的认知负担和工作量.为了提高开发人员的开发效率与开发体验,一些头部科技公司开始建立自己的内部开发者平台(IDP).在之 ...
- 如何通过C#/VB.NET代码将PowerPoint转换为HTML
利用PowerPoint可以很方便的呈现多媒体信息,且信息形式多媒体化,表现力强.但难免在某些情况下我们会需要将PowerPoint转换为HTML格式.因为HTML文档能独立于各种操作系统平台(如Un ...
- C#异步有多少种实现方式?
前言 微信群里的一个提问引发的这个问题,C#异步有多少种实现方式?首先想要知道C#异步有多少中实现方式,首先我们要知道.NET提供的执行异步操作的三种模式,然后再去了解C#异步实现的方式. .NET异 ...
- 【Python基础】 什么是函数
函数是一段可重用的代码块,它接受输入参数并返回输出.函数在程序设计中具有很多优点,如: 代码重用:在程序中可以重复调用相同的代码块,使程序更加简洁.高效. 模块化设计:函数是模块化设计的基本单元,可以 ...
- 2022-12-13:游戏玩法分析 I。写一条 SQL 查询语句获取每位玩家 第一次登陆平台的日期。 +-----------+-------------+ | player_id | first_l
2022-12-13:游戏玩法分析 I.写一条 SQL 查询语句获取每位玩家 第一次登陆平台的日期. ±----------±------------+ | player_id | first_log ...
- 2022-08-27:以下go语言代码输出什么?A:[0];B:panic;C:7;D:不清楚。 package main import ( “fmt“ ) func main() { a
2022-08-27:以下go语言代码输出什么?A:[0]:B:panic:C:7:D:不清楚. package main import ( "fmt" ) func main() ...
- 2022-08-03:以下go语言代码输出什么?A:2;B:3;C:1;D:0。 package main import “fmt“ func main() { slice := []i
2022-08-03:以下go语言代码输出什么?A:2:B:3:C:1:D:0. package main import "fmt" func main() { slice := ...
- 【重学C++】03 | 手撸C++智能指针实战教程
文章首发 [重学C++]03 | 手撸C++智能指针实战教程 前言 大家好,今天是[重学C++]的第三讲,书接上回,第二讲<02 脱离指针陷阱:深入浅出 C++ 智能指针>介绍了C++智能 ...