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重传. 很多网络 ...
随机推荐
- 这个字段我明明传了呀,为什么收不到 - Spring 中首字母小写,第二个字母大写造成的参数问题
问题现象 vSwitchId.uShape.iPhone... 这类字段名,有什么特点?很容易看出来吧,首字母小写,第二个字母大写.它们看起来确实是符合 Java 中对字段所推崇的"小驼峰命 ...
- windows-重启打印服务
@echo off color a net stop spooler net start spooler ping -n 4 localhost >nul
- 从GFS到GPT,AI Infra的激荡20年
导读 最近AIGC和LLM的浪潮层层迭起,大有把AI行业过去十年画的饼,一夜之间完全变现的势头.而 AI Infra (构建AI所需的基础设施),也成了讨论的焦点之一.大众对AI Infra的关注点 ...
- 【Java】Java代码拷贝文件的速度
Java代码拷贝文件的速度究竟有多快? 前言 最近学习Java到了流处理,其中有种流叫FileInputStream和FileOutputStream,简单来说,就是操作文件的,老师给我们示范了一个非 ...
- weex 开发APP 多行文本溢出处理
weex中文字溢出不能使用常规的overflow:hidden 如: .text { overflow: hidden; text-overflow: ellipsis; white-space: n ...
- 【LeetCode双向链表】LRU详解,双向链表实战
LRU缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构. 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity ...
- Python异步编程之web框架 异步vs同步 文件IO任务压测对比
测试基本信息 主题:比较异步框架和同步框架在文件IO操作的性能差异 python版本:python 3.8 压测工具:locust web框架:同步:flask 异步:aiohttp.starlett ...
- 暑期实习开始啦「GitHub 热点速览」
无巧不成书,刚好最近有小伙伴在找实习,而 GitHub 热榜又有收录实习信息的项目在榜.所以,无意外本周特推就收录了这个实习项目,当然还有国内版本.除了应景的实习 repo 之外,还有帮你管理文件的 ...
- 记一次线上问题,Netty接收到的报文一次有数据一次没有数据
最近线上遇到一个问题,客户端发送的tcp报文第一次连接成功后没有数据,第二次连接后正常带数据,第三次又没有数据... 问题排查1:是否有负载均衡,其中有一台机器出现了异常,会出现一次成功一次失败的情况 ...
- Spring事件监听机制使用和原理解析
你好,我是刘牌! 前言 好久没有更新Spring了,今天来分享一下Spring的事件监听机制,之前分享过一篇Spring监听机制的使用,今天从原理上进行解析,Spring的监听机制基于观察者模式,就是 ...