专栏首页LINUX阅码场Linux网络数据转发平面的变迁-从内核协议栈到DPDK/XDP

Linux网络数据转发平面的变迁-从内核协议栈到DPDK/XDP

昨晚读了一篇Paper:https://penberg.org/parakernel-hotos19.pdf

大意是说,随着IO设备的进化,它们的存取/传输速率已经超过了CPU到内存的存储/传输速率,再也不再是慢速 外设 了,所以,对这些快速设备的管理和操作要发生改变才能适应,从这个意义上讲,几乎一成不变的Linux kernel在很多方面确实阻滞了性能的优化。

这可能是现如今人们纷纷转向DPDK/netmap或者XDP的本质原因了。怎么说呢?周末回上海前,发一篇感想。

在人们的印象中,一台标准的计算机包含三大件:

  • CPU,即中央处理器。
  • 内存,悬挂在类似叫做北桥的芯片上。
  • 外设,慢速IO设备,悬挂在类似叫做南桥的芯片上。

这也是我们在《计算机组成原理》这门课中学到的。其实这就是现实中的计算机,就这样子,如果按照抽象的冯诺伊曼计算机来看,计算机是不包含外设的,它只有CPU和内存,强调存储和执行,是为 存储执行计算机。

有了现实中的计算机组成后,下一步就是设计操作系统来管理这些东西,事实上,几乎任何操作系统都可以按照这堆东西划分为不同的模块:

  • 进程管理,管理CPU分时和调度。
  • 内存管理,管理内存分配。
  • 文件系统,管理文件组织。
  • 网络协议栈,管理网络IO。
  • 磁盘驱动,...
  • ...

其实一开始从名字上将除CPU,内存之外的物件叫做 外设 (某种意义上磁盘也是),并且将其连接到相对慢速的桥片上,背后的假设就是 相对于CPU和内存,这些IO设备是慢速的。

于是操作系统为了管理这些慢速设备,不得不设计出复杂的机制来进行速率的适配,数据的缓存等,无论是Unix/Linux还是Windows,均是在这个假设下设计出来的。

但是,事情在悄悄地起变化,外设也逐渐高速化,智能化,变得和CPU差不多了,越来越多的外设自带了存储芯片,俨然另一组CPU/内存挂在同一块主板上...

这个时候,操作系统应该作为一个协调者更合适,而不再适合继续作为管理者了,但是那些旧时代复杂的管理机制依然存在。以网络协议栈为例:

  • 各类链表在多CPU环境下的同步开销。
  • 不可睡眠的软中断路径过长。
  • sk_buff的分配和释放。
  • 内存拷贝的开销。
  • 上下文切换造成的cache miss。
  • ...

显然这些机制在10Mbps/100Mbps网卡的慢速时代是没有任何问题的,那个时候 应用程序大部分时间在等网卡送上来数据。 现在到了1000Mbps/10Gbps/40Gbps网卡的时代,竟然反过来了,数据被很快地收入,却全部堵在内核里。

于是,各种优化措施应着需求而来:

  • 网卡RSS,多队列。
  • 中断线程化。
  • 分割锁粒度。
  • Busypoll。
  • ...

但却都是见招拆招,治标不治本。问题的根源不是这些机制需要优化,而是这些机制需要推倒重构。蒸汽机车刚出来的时候,马车夫为了保持竞争优势,不是去换一匹昂贵的快马,而是卖掉马去买一台蒸汽机装上。 基本就是这个意思。

重构的思路很显然有两个:

  • upload方法:别让应用程序等内核了,让应用程序自己去网卡直接拉数据。
  • offload方法:别让内核处理网络逻辑了,让网卡自己处理。

总之,绕过内核就对了。

人们肯定知道如何处理这种高速的网络流,但是内核代码是写死的,版本迭代周期漫长,很难重构,那么如何让懂行的人自己的代码处理高速流就是唯一要解决的问题,很显然就有upload和offload两种方法了。

  • DPDK让用户态程序直接处理网络流,bypass掉内核,使用独立的CPU专门干这个事。
  • XDP让灌入网卡的eBPF程序直接处理网络流,bypass掉内核,使用网卡NPU专门干这个事。

如此一来,内核协议栈就不再参与数据平面的事了,留下来专门处理诸如路由协议,远程登录等控制平面和管理平面的数据流,妥妥的。

自2012年开始我就一直在关注Linux网络协议栈转发平面的性能优化,那个时代所谓的网络优化几乎都是基于Linux内核协议栈的优化,在还没有智能网卡,DPDK也不火爆的时代,能做的只是优化协议栈,当时除了华为等大厂也很少有做这块工作的,像BAT这种互联网公司开始迭代的第一代云网络也都是从内核协议栈起步的,即便如此也很少有人专门做这块。

互联网应用在云计算的大环境下开始大爆发,互联网流量也开始指数级暴涨,数据中心开始成为网络的核心,拥有通用处理器和万兆网卡生态的Intel率先研发并大规模推广DPDK显然只是时间问题,这是时代的产物。

时光流逝,不禁感慨,到了2016年,2017年至今,几乎相关公司招聘网络方面研发人员的任何JD上都会要求类似DPDK/eBPF,从而几乎人人的简历上都会写上相关的经验,显然,时代发生了变化。

不变的态度则是拥抱变化。

版权声明:本文为CSDN博主「dog250」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/dog250/java/article/details/107243696

(END)

本文分享自微信公众号 - Linux阅码场(LinuxDev),作者:dog250

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 定位并行应用程序中的可伸缩性问题(最透彻一篇)

    本文由西邮陈莉君教授研一学生梁金荣、戴君毅、马明慧翻译,宋宝华老师指导和审核。译者梁金荣、戴君毅、马明慧同学热爱开源,践行开放、自由和分享。

    Linux阅码场
  • 用CPI火焰图分析Linux性能问题

    本文中若有任何疏漏错误,有任何建议和意见,请回复内核月谈微信公众号,或通过 oliver.yang at linux.alibaba.com 反馈。

    Linux阅码场
  • 廖威雄: 学习Linux必备的硬件基础一网打尽

    廖威雄,目前就职于珠海全志科技股份有限公司从事linux嵌入式系统(Tina Linux)的开发,主要负责文件系统和存储的开发和维护,兼顾linux测试...

    Linux阅码场
  • Machine Learning 硬件投入调研GPU分布式云硬件投入的建议参考服务器SpecReference

    zhwhong
  • 物联网云智能开发—EMQ X云服务器搭建及测试教程

    最近在做物联网相关开发的时候有用到EMQ服务器进行MQTT协议信息传输,今天在这里和大家记录一下EMQ服务器在Windows环境下的搭建以及简单的使用教程。

    灰小猿
  • Java--JDBC连接数据库(二)

         本篇文章接着上篇文章,还剩下一个知识点是,可滚动的结果接集和可更新的结果集。一般默认情况之下,多结果集是不可以显式滚动,移动选择的。如果想要做到,需要...

    Single
  • 【SAP HANA系列】SAP HANA XS使用JavaScript(JS)调用存储过程(Procedures)

    前面几篇讲了SAP HANA XS JavaScript(JS)的基础内容和相应API,这篇讲一下JavaScript如何与后台交互,此篇讲存储过程(Proce...

    matinal
  • 白硕:区块链技术与数据隐私(附视频)

    数据派THU
  • C语言经典100例001-将一个数字字符串转换为一个整数

    例如:字符 '0'-'9' 对应的十进制整数是48~57,那么,将对应的整数减去48就得到了对应的整数

    计算广告生态
  • Flutter 1.20 下的 Hybrid Composition 深度解析

    在以前的 《Android PlatformView 和键盘问题》 一文中介绍过混合开发上 Android PlatformView 的实现和问题,原本 And...

    恋猫

扫码关注云+社区

领取腾讯云代金券