Linux kernel 协议栈与高速网络

都知道 linux kernel 无力处理高速网络,但各种 offloading 方案也不全对,所以到底为什么 linux kernel 对高速网络无力。

中断,锁,上下文切换,内存拷贝这些经理都够得着的视野就别烦世人皆俯视了。本文给出另一个视角。

linux kernel 是个 ms 级系统,而高速网络是个 us 级系统,用 ms 级系统调度 us 级系统,到底谁在调度谁,这不是任何 bypass/offloading 技术能解决的。

作为 IO 的网络与众不同,不光因为它是进化的,还因对端是对等的,网络吞吐同时受技术世代和对端驱动。与此相对的其它 IO 更稳定。键盘鼠标速度受制于人的操作速度,显示输出只需满足人眼分辨上限就够,高速存储虽快,但作为 slave 只受不攻,或者作为对等架构的网络存储则可归到网络范畴。

结论是,作为外设,只有网络越来越快。这对主机系统的处理方式提出了新的要求。网络发展快于 cpu 发展经理都知道,自不必多说(深层次原因看这篇:带宽和 cpu 发展),linux kernel 无法应对高速网络更重要的是系统内因。

我以 tcp 为例描述,因为 tcp 在系统缩放问题上最为典型,主要表现为,tcp 同时受到网络和对端制约,从 snd_win = min(cwnd, rwnd) 可见 tcp 性能 = min(网络性能, 对端性能)。sender 可从 tcp ack 自时钟中直接体验它的性能反馈,tcp 又攻又受。

需要澄清的是,tcp 只做一个例子描述问题,现实中 tcp 作为流式可靠传输协议,本身就无法适配高速网络,这不是 linux kernel 的问题,而是 tcp 自身的问题,经理都知道的事实,就不必再赘述。

我选择 hz = 1000 配置 linux kernel,1ms 一个滴答,再小的话 “调度器指令数/调度区间指令数” 将大到不划算 。1ms 作为理论最小的调度粒度,每个 task 最少运行 1ms,因为 granularity 如果小于 1ms,不光更不划算,调度系统还将倾斜(下面讲为什么倾斜以及倾斜到哪边),无法兑现 cfs 承诺。

100mbps 网络跑 tcp,receiver 开启 delayed ack,250us 一个 ack 确认 2 个约 1.5k 的报文,最短运行期间收到 4 次 ack,被中断 4 次,1gbps 网络约 10us 发包一个,100mbps 则 100us 发包一个,250us 间隔对整体调度影响微乎其微,因为有 (250 - 100 = 150)us 的时间执行 task 指令。1000mbps 网络的 40 次中断已经开始影响系统平衡,但也不很,大致算一下,10us 发包一个,25us 一次 ack 中断,有效无干扰指令占调度粒度的比率 (25 - 10 = 15)us / 1000us 更小,简单解释就是,这个比率越小,tcp 对系统调度越不信任。

带宽再往上,系统显然更吃力。

当一个 task 在单 cpu 上发 tcp,系统总趋向平衡,task 占 1/2 cpu,网络收发占 1/2 cpu。如果 task 发包过快,tcp ack 回复将同步加快,cpu 被中断加快,最终吃掉部分 task 的 cpu,反之,如果 tcp ack 过快中断 cpu,它将减缓 task 运行,进而降低 task 发包速度,最终吃掉部分网络收发的 cpu,这是个负反馈环,二者都将平衡。

当多个 task 在单 cpu 上发 tcp,系统会在所有 task 和所有 task 的网络收发之间平均分配 cpu,理由同上述负反馈,但 task 间将失衡。如果调度系统 granularity = 1ms,吞吐越大的 task 越被拖累,因为它得不到及时调度,如果 granularity = 1us(系统承受不起,这不可能,只是假设),吞吐越大的 task 倾向于吃掉更多 cpu,因为它总中断其它 task。

结论是,granularity 越大对大吞吐 task 越不利,而 granularity 越小对小吞吐 task 越不公平。

这就是前面提到的系统在高速网络场景的调度倾斜。granularity 很小时,高吞吐 task 将在系统调度器(比如 cfs)察觉前蚕食 cpu。换句话说,调度失效了。你以为调度失效只影响公平性,实际上你的 task 会在不同时间被映射到不同的吞吐类别,哪个都不是你想要的。

用极值简单理解一下,假设带宽无限,存在 3 个 cfs 调度系统,简单起见均禁用抢占,系统 1 hz = 1000000,系统 2 hz = 1000,系统 3 hz = 250,很容易想象,系统 1 所有 task 将获得完全一样的吞吐,系统 2 高吞吐 task 将剧烈抖动,系统 3 高吞吐 task 更剧烈抖动,低吞吐 task 被压制。我们知道 ns 级别的调度几乎是不可能的,从系统 3 接近系统 1 的过程难度越来越大,现实停留在系统 2 附近。

100mbps,1000mbps 带宽的网络场景,linux kernel tcp 也抖,只不过由于抖幅与带宽之比以单位时间获得的吞吐为增益,从 1us 到 10us 这么小的时间区间可夺 10gbps - 1gbmps = 9gbps 吞吐,而从 100us 到 1ms 这么大的时间区间只能夺 100mbps - 10mbps = 90mbps 吞吐,请问 1us 到 10us 区间和 100us 到 1ms 区间哪个更容易命中,抖动在低速网络下被不成比例缩放平滑到不明显罢了。

抛开 tcp 特例谈一般性,这就是本质,高速网络对时间更敏感,而 linux kernel 调度只能工作在 ms 粒度,对高速网络太粗糙了。

tcp 足够幸运,由于其 32 位序列号,为满足 msl 内避免回绕,它恰恰工作在 1ms 级,与 linux kernel 调度时间粒度完全一致, 这意味着在 1ms 级别的粒度,linux kernel 可相当公平高效地调度 10gbps 内的多个 tcp task,但蜜月即将结束,15 年前就有 hz1000,现在还在 hz250,然而这些年间网络带宽持续以 4 倍速增长,超过 10gbps,每 1ms 超过 40 次到达 100 次的中断,由上所述,调度可信度就快速崩塌了。

应对高速网络,不管是 tcp 还是非 tcp task,一定要直接轮询调度网络收发本身,而不是调度 task,在 task 中经中断调度网络收发,系统主动调度和中断被动调度本虽互补,实际上并不相容,二者对同一事件达成共识需要的同步过程就是造成它们无法协作调度高速网络的根源。

将所有 task 待发送的数据放在发送 queue 中,将所有收到的数据放在接收 queue 中,用一个 task 轮询调度这两个 queue,这是一种原始方式,但显然比多 task + 中断调度多 queue 这种现代并发方式要高效。

so? 这不是 linux kernel 单独的问题,这是任何想应对高速网络都要注意的问题,还是我最近不断强调的缩放比例的问题,时间缩放 10 倍,某些量变化远超 10 倍,就要注意它们了。随着带宽继续提高,系统规模继续扩大,随着经理们青睐的 hw-offloading,(x)pu 方案被塞入更多的创新,早晚会碰到同样的问题,只是 linux kernel 在 1ms 祭天,而他们可能在 10us 祭天,若出卖伸缩性换高性能,便更时不我待。

不过也没人关注比例伸缩性,这和他们经常提到的可扩展性可不是一个东西。

浙江温州皮鞋湿,下雨进水不会胖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/222867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL进阶理论篇(四):索引的结构原理(B树与B+树)

文章目录 简介如何评价索引的数据结构设计好坏二叉树的局限性什么是B树什么是B树总结参考文献 简介 我们在上一节中说过,索引其实是一种数据结构,那它到底是一种什么样的数据结构呢?本节将简单介绍一下几个问题: 什么样的数据结…

<JavaEE> 网络编程 -- 网络通信基础(协议和协议分层、数据封装和分用)

目录 一、IP地址 1)IP地址的概念 2)IP地址的格式 二、端口号 1)端口号的概念 2)端口号的格式 3)什么是知名端口号? 三、协议 1)协议的概念 2)协议的作用 3)TC…

[笔记] iperf3.1.3源码下载与交叉编译

由于需要测试一款40G网卡,下载了 iperf3.1.3 用于性能测试。 iperf3.1.3 源码下载 可以在 iperf 官网 下载源代码: 交叉编译 需要运行在 aarch64 linux 环境下,所以需要交叉编译。 进入iperf3 目录下,运行 ./configure 脚本…

ssm基于HTML5的OA办公系统论文

基于HTML5的OA办公系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,作为一个一般的企业都开始注重与自己的信息展示平台,实现基于HTML5的OA办公系统在技术上已成熟。本文介绍了基于HTML5的OA办公系统的开发全过程。通过分析企业对于博客网站的需…

打工人副业变现秘籍,某多/某手变现底层引擎-Stable Diffusion 模特假人换服装、换背景、换真人

给固定人物换背景或者换服装,需要用到一个Stable Diffusion扩展插件,就是sd-webui-segment-anything。 sd-webui-segment-anything 不仅可以做到抠图的效果,也能实现之多蒙版的效果。 什么是蒙版 图片蒙版是一种用于调节图像修改程度以及进行局部调整的工具。它通常分为四种…

安全算法(二):共享密钥加密、公开密钥加密、混合加密和迪菲-赫尔曼密钥交换

安全算法(二):共享密钥加密、公开密钥加密、混合加密和迪菲-赫尔曼密钥交换 本章介绍了共享密钥加密、公开密钥加密,和两种加密方法混合使用的混合加密方法;最后介绍了迪菲-赫尔曼密钥交换。 加密数据的方法可以分为…

16--常用类和基础API--06

1、包装类 1.1 包装类概述 Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作&#xff0c…

Gitlab基础篇: Gitlab docker 安装部署、Gitlab 设置账号密码

文章目录 1、环境准备2、配置1)、初始化2)、修改gitlab配置文件3)、修改docker配置的gitlab默认端口 gitlab进阶配置gitlab 设置账号密码 1、环境准备 安装docker gitlab前确保docker环境,如果没有搭建docker请查阅“Linux docker 安装文档” docker 下载 gitlab容…

STM32 PVD掉电检测功能的使用方法

STM32 PVD掉电检测功能的使用方法 前言 在实际应用场景中,可能会出现设备电源电压异常下降或掉电的情况,因此,有时候需要检测设备是否掉电,或者在设备掉电的瞬间做一些紧急关机处理,比如保存重要的用户数据&#xff…

【C语言】超详解strncpystrncatstrncmpstrerrorperror的使⽤和模拟实现

🌈write in front :🔍个人主页 : 啊森要自信的主页 ✏️真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝>希望看完我的文章对你有小小的帮助&am…

jmeter,跨线程调用cookie

结构目录 一、线程组1 1、创建登录的【HTTP请求】,并配置接口所需参数; 2、创建【正则表达式提取器】,用正则表达式提取cookie字段; 3、创建【调试取样器】,便于观察第2步提取出的数据; 4、创建【BeanSh…

【Jenkins】节点 node、凭据 credentials、任务 job

一、节点 node Jenkins在安装并初始化完成后,会有一个主节点(Master Node),默认情况下主节点可以同时运行的任务数是2,可以在节点配置中修改(系统管理/节点和云管理)。 Jenkins中的节点&#…

Redis Helper封装:静态方法

Redis面试题: 1、什么是事务?2、Redis中有事务吗?3、Redis中的事务可以回滚吗? 答: 1、事务是指一个完整的动作,要么全部执行,要么什么也没有做 2、Redis中有事务,Redis 事务不是严…

nodejs+vue+微信小程序+python+PHP血液中心管理平台的设计与实现-计算机毕业设计推荐

实现采血的完整功能,系统用户主要分为两类,一类是管理员,一类是采血工作人员。管理员主要对采血工作人员以及血库进行管理。派发账号给员工作为采血工作人员,对血库的出库入库进行信息化管理。采血工作人员主要完成采血工作。通过…

日志框架Log4j、JUL、JCL、Slf4j、Logback、Log4j2

为什么程序需要记录日志 我们不可能实时的24小时对系统进行人工监控,那么如果程序出现异常错误时要如何排查呢?并且系统在运行时做了哪些事情我们又从何得知呢?这个时候日志这个概念就出现了,日志的出现对系统监控和异常分析起着…

亿赛通电子文档安全管理系统 SQL注入漏洞复现

0x01 产品简介 亿赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…

C语言第五十弹---模拟使用strcat函数

使用C语言模拟使用strcat函数 strcat 函数是 C 标准库中的字符串拼接函数,它用于将一个字符串追加到另一个字符串的末尾。strcat 函数的定义如下:它接受两个参数,第一个参数 dest 是目标字符串的指针,第二个参数 src 是源字符串的…

DHCP原理与配置

文章目录 DHCP原理与配置一、DHCP概述二、DHCP优势三、DHCP的分配方式四、DHCP工作原理五、DHCP的配置1、DHCP的配置命令2、DHCP的配置步骤 DHCP原理与配置 一、DHCP概述 使用动态主机配置协议DHCP(Dynamic Host Configuration Protocol)来配置IP 地址等…

使用VeryFL【02】python环境安装

新建虚拟环境 conda create --name vfl python3.7激活新建的虚拟环境 conda activate vfl安装pytorch 安装Brownie pip install eth-brownie -i https://pypi.tuna.tsinghua.edu.cn/simple

智能优化算法应用:基于乌燕鸥算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于乌燕鸥算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于乌燕鸥算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.乌燕鸥算法4.实验参数设定5.算法结果6.参考文…