又是大年初一,和过去三十多年的新年一样,无聊,消沉,吃不好饭,盼着上班(小时候是盼着开学…)…


事实上,不仅仅是Linux内核,几乎所有的 现代操作系统 都没有为支持100Gb/s做好准备。

这是一个变革的年代,现代操作系统 已经不再 现代

我们回望一下类似Unix/Linux,Windows NT这些操作系统是如何被称作 现代 的。嗯,是因为虚拟内存系统。

隔离的地址空间 让操作系统一下子进入了现代社会。在此之前,操作系统都是谭浩强书里写的那种一旦操作空指针就会系统崩溃的系统。


自打操作系统成为现代操作系统后,貌似它就没有再有过突破性的进化,但是其周边,确实翻天覆地了。

先看CPU和系统架构,先是其主频的疯涨,然后又是多核架构。主频增加这个对于操作系统内核来讲是好事,在单位时间内能多执行很多指令,这完全是一个打鸡血的过程。然而多核心架构就让几乎所有的操作系统内核有点开始吃力应对了。其对数据同步的解法中,往往都是见招拆招地加锁。

多核心架构对系统性能的作用力和主频增加的作用力方向是相反的,如果主频的增加让CPU在单位时间执行了更多的指令,那么多核之间的沟通成本抵消了这个主频提升带来的收益,因为同步成本是高昂的。

多核心架构重演了 人月神话

最后的结果就是,支持SMP多核架构的操作系统内核,其实就是给当年引入虚拟内存时的现代操作系统全部挂满了枷锁而已。单就操作系统内核本身而言,它更慢了,而不是更快了!

意思是说,多核心架构下,单独的CPU上,操作系统的执行效率要比单核架构下操作系统的执行效率更低了!核数越多,沟通同步成本越大,最终让性能/核心数曲线上凸!

而沟通同步的方式,无外乎就是,锁!

所以说,锁是阻止操作系统性能多核扩展性伸缩性的罪魁祸首!

事实上,Linux内核也好,UNIX也好,Windows NT也好,根本就不是为多核心架构而设计的,它们只是 简单适应了SMP而已

操作系统虽然是现代的, 但是却不是当代的! (我记得上小学和初中那会儿,老师说过现代和当代的区别)


在现代操作系统发展停滞不前的时候,硬件却没有闲着。

100Gb/s网卡的意思是说, 如果有100Gb的数据在缓冲区里,它可以在1秒中把它们全部发送出去。但问题是, 操作系统有能力在1秒钟内准备好100Gb的数据吗?

我们知道,在我们对操作系统的传统认知中,数据的源头来自于用户态缓冲区,经由操作系统内核协议栈,将数据怼到网卡缓存区。我们可以简单测算一下,操作系统的内核协议栈有没有能力1秒钟往网卡怼100Gbit的数据。

这里有几个简单的统计数据统计点,获取这些数据的方法:

  • 在tcp_write_xmit函数的while循环里打点,看看发送一个skb需要多久;
  • 使用pktgen类似的机制,测算单包发送延时。

在如今常见的1Gb/s的网卡上发包测算,平均约4微秒发送一个Full Mss的包,貌似Linux内核对于千兆网卡应对的还不错,但这并不意味着它应对10Gb/s,40Gb/s,100Gb/s这些发送速率时,是可以线性扩展的!

简单反算,100Gb/s需要单包发送延时在120纳秒以内,我们只需要测算一下120纳秒够不够内核协议栈处理一个数据包就可以了。

纳秒,这是一个cache级别的时间,如果发生了一次cache命中,至少可以节省20到30纳秒的时间,但是反过来如果很不幸cache missing了,那么就要在120纳秒中扣除20到30纳秒,这样就剩下90纳秒了。

该重头戏了:

  • 一次spinlock需要20纳秒左右的时间;
  • 一次内存分配需要大概60纳秒的时间;

很不幸,没有时间剩下来了。以上的测算还是基于64字节的小包,丝毫没有包括真正的处理开销!而我们知道,协议栈处理过程中,有超级多的协议逻辑…120纳秒远远不够!

在协议栈处理数据包并发送的过程中,内存分配和内存操作将会引入巨大的延时,这十有八九又会牵扯到cache missing!

从另一个角度看,Linux内核作为一个通用操作系统内核,显然并没有针对单独的特性做极端的性能优化,这个意义上,我不是说它没有为大规模支持100Gb/s网卡做好准备,而是它可能根本就没有准备在支持这种高速网卡的竞赛中取得胜利!这方面你可以和David Miller交流一下,看看在他看来,代码的可维护性,简洁性,统一处理这些和极端的性能优势相比,哪个更重要。

不过,无论如何,Linux内核,Windows NT之类的OS内核在多核心架构下无法线性扩展,这确实是阻碍其从 现代操作系统 进化到 当代操作系统 的路易十六!


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

Linux内核为大规模支持100Gb/s网卡准备好了吗?并没有相关推荐

  1. linux 内核 网卡驱动 移植,Linux内核移植步骤_添加DM9000网卡驱动(设备树).docx

    Linux内核移植步骤_添加DM9000网卡驱动(设备树) Linux内核移植步骤2015年05月13日星期三上午 11:05往设备树中添加网卡驱动:1.选平台,指定交叉编译工具链:(1).在Make ...

  2. linux内核网络协议栈--数据包的网卡缓冲区(二十四)

    程序员可能关心的基本网卡知识 网卡相关介绍:http://www.linuxidc.com/Linux/2012-12/77132.htm 一.什么是网卡? 它是主机的网络设备,本身是LAN(局域网) ...

  3. tpm linux,Linux内核再次升级 支持TPM芯片

    [IT168 软件资讯]Linux内核更新是越来越快了,自Linux 2.6.11今年4月推出后,昨天李纳斯·托沃兹(Linus Torvalds)发布了Linux 2.6.12核心. Linux K ...

  4. xmake v2.6.2 发布,新增 Linux 内核驱动模块构建支持

    Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...

  5. 基于tiny4412的Linux内核移植(支持device tree)(二)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  6. linux内核5.3支持cpu,Linux 5.3版内核重磅发布:支持中国兆芯x86 CPU

    经过两个月的开发和八个RC候选版本之后,Linus Torvalds今天终于正式发布了Linux Kernel 5.3版内核.虽然因为旅游耽误了一个星期,但是这个版本带来了诸多重磅更新,值得等待和升级 ...

  7. 开启Digilent提供的Linux内核的NFS支持

    ZEDBoard上出厂的SD卡中自带了一个较完整的linux系统,虽然是精简版,但是对于开发来说已经足够了,在嵌入式linux开发中,挂载NFS协助调试非常常见,但是Digilent给出的内核中并没有 ...

  8. linux内核配置nfs,【参赛手记】开启Digilent提供的Linux内核的NFS支持

    ZEDBoard上出厂的SD卡中自带了一个较完整的linux系统,虽然是精简版,但是对于开发来说已经足够了,在嵌入式linux开发中,挂载NFS协助调试非常常见,但是Digilent给出的内核中并没有 ...

  9. linux内核网络协议栈--数据包的网卡驱动收发包过程(二十五)

    网卡 网卡工作在物理层和数据链路层,主要由PHY/MAC芯片.Tx/Rx FIFO.DMA等组成,其中网线通过变压器接PHY芯片.PHY芯片通过MII接MAC芯片.MAC芯片接PCI总线 PHY芯片主 ...

  10. linux 内核 sleep,linux内核是如何支持深度睡眠(deep sleep)方式的?

    1. 硬件架构 arm64 2. 内核版本 4.19 3. 分析相关函数 get_set_conduit_method() -> of_property_read_string(np, &quo ...

最新文章

  1. B - Parentheses Balance (UVA - 673)
  2. 5.Multil-task lasso(多任务lasso回归分析)
  3. ubuntu18.04 VirtualBox 开启虚拟机出错 Kernel driver not installed (rc=-1908)
  4. 正则控制可以输两位小数、负数,整数
  5. java属于以下哪种语言_Java属于以下哪种语言?
  6. mysql执行动态说起来_MySQL实战45讲学习笔记:第十四讲
  7. SVN学习总结(3)——分支合并
  8. Exchange 2016 CU9 已发布
  9. Vant Weapp小程序蹲坑之事件名称问题及解决方案
  10. 如何画好一套线性图标
  11. 邢波老师致广大学员的一封信(2010-10-26)
  12. PHP执行超时的那些事
  13. HCNA-Storage (H13-611)题库 v4.0
  14. java单例模式使用_Java单例模式的应用
  15. Java11实现X509TrustManager报错SSLHandshakeException分析及解决办法
  16. 输出字符的 ASCII 码
  17. Rust/WinRT更名,全面支持Windows API
  18. 统计分析基础-描述数据
  19. 为什么Rust这么受欢迎?
  20. 超级厉害的几个网站,一般人我都不告诉

热门文章

  1. java method方法_java入门(六) | 方法(Method)的定义和使用
  2. 接口与多态:模拟物流快递系统程序设计实验
  3. 口袋之旅html5超强账号,《口袋之旅H5》攻略:各大排行榜冲榜攻略
  4. 用无线热点入门树莓派4详解
  5. Minimum Class Confusion for Versatile Domain Adaptation
  6. QQ微信可以上网,但是google浏览器上不了网怎么办?
  7. 计算电路门数和nand2的面积
  8. python编程用什么软件-python用什么软件编写
  9. Odoo实施指南 连载三:成功案例
  10. Error: unconverted data remains: AM 解决方法