五分钟看懂抓包神技:DPDK
我是一个网络监控软件,我开发的任务是监控所有进出网络的流量。
一直以来,我的工作都很好,但是伴随着我所监控的网络越来越大,网络中的通信流量越来越多,一开始我就不堪重负,逐渐出现丢包现象,最近这种现象越来越严重。
巨大的交通需求
一天晚上,我的程序员哥哥把我从硬盘里叫了出来。
几点了你怎么还不下班我问我的小弟弟
哎,产品经理说我下个月要支持万兆网络流量的分析我压力很大,没办法,只能加班,说完整理了一下自己稀疏的头发
十万亿10Gbps你在开玩笑吗这是要杀我的节奏
是不是,可急死我了快告诉我,你工作这么久了,有什么不开心或者觉得可以改善的可以告诉我我的小弟弟真诚地看着我
我想了一下说:要说不好听的,那是真的!就是我现在花了太多时间复制包,从内核空间复制包到用户空间以前数据量小,现在网络流量这么大,真是要命
小哥哥叹了口气,哎,这是改不了的通过操作系统的API获取数据包,从网卡读取操作系统我们是在用户空间工作的程序,要复制一次没办法想点别的
我也叹了口气,好吧,还有一个槽收到数据包后,可以直接给我吗不要把它交给系统的协议栈和netfilter框架去处理反正我带了以后还要重新分析,每次都是从他们那里传过去的他们效率低,不拖累我的工作
我小哥皱着眉头眨着眼睛说:大哥,这个我们改不了我水平有限,还没能改造你绕过操作系统让你直接处理网卡不然你怎么不说另一个
好,我不会为难你有一个简单的问题,你要改
有什么问题吗跟我说说
就是我现在在线程切换上花了很多时间,当我再次得到调度执行的时候,经常发现我换了一个CPU核,导致之前的缓存失效,我不得不重新建立缓存。这又是一大浪费!我不能让我的工作线程独占CPU的核心,这样肯定能提高我的工作效率!
小哥想了一下,说:没问题,这个你可以要!可以通过线程关联来完成我给你画几个核心,不要让他们参与系统的线程调度和分配这是给你用的
中断问题
过了几天,程序员哥哥给我升级了,让我的几个工作线程可以独占CPU核,工作效率提高了不少。
但离产品经理要求的万兆流量分析指标还有一段距离。
一天晚上,程序员的小哥哥又找我聊天。
现在分析能力确实提高了,但离目标还很远快告诉我,你有什么改进的建议吗
是有,但我估计你还是会说改不了我翻了翻白眼
先说说吧!
现在这个数据包是以中断的形式读取的我能自己得到它而不被打断吗你不知道,每次中断都要保存上下文,从用户态切换到内核态,那么多流量,代价很大!,我兴奋地说
小哥听后沉默了。
看,我告诉过你你不能改变它!算了,趁早跟产品经理说,这个需求做不了,我们俩都放心。
那不行这个项目对我很重要,我还指望着你升职加薪,走上人生巅峰呢!小哥说的很坚决
如果你做不到,那就多找几台机器,复制几份给我软件不行,就靠硬件把性能堆出来!我冲他眨了眨眼
那还用说,老板不会同意的。
那我就毫无办法了说实话,要处理10万千兆的网络流量,我得绕过操作系统我得自己从网卡上读取数据包你要好好学习想升职加薪怎么会怕困难我给我的小弟弟打气
我小哥点点头,你说的是,我能做到。给我一点时间
数据面开发套件
过了一个多星期,程序员的小哥哥再也没有来找我,我也不知道他的研究怎么样了。
过了几天,他终于又来了。
出来吧!我找到办法了,明天我就开始改造你!
我听了来了兴趣,什么办法你打算怎么改造我
这个新方案可以解决你之前提出的所有问题它允许你直接处理网卡,不需要中断通知你读取数据包,也不需要把数据包交给系统协议栈和netfilter框架处理
你太棒了,你能解决所有这些问题!你是怎么做到这一切的什么原理我好奇地问
小哥哥有点不好意思我怎么会有那本事其实这是别人开发的技术我只是用它
嗯,你弄清楚它的原理了吗那就别坑我了!我有点不安
不要担心这个这项技术被称为DPDK这是英特尔开发的技术
接下来,我的小哥哥,一个程序员,给我介绍了这个叫DPDK的技术原理。
有了DPDK,UIO由操作系统的用户模式驱动,我可以在用户模式下通过轮询读取网卡的数据包,不再中断!
在直接用户模式读取中,不再需要在内核模式空间和用户模式空间中移动数据包看完之后我可以直接分析,不用再去翻系统协议栈和netfilter浪费时间
不止如此!它还支持大页面内存技术,我的小弟弟自豪地说。
大页内存这是什么
默认情况下,系统不管理4KB大小的内存页面这个单元太小了我们的服务器内存将会有很多内存页面为了管理这些页面,会有很多页面条目
听到这里,我突然明白了:我知道了,如果增加这个单元,管理的内存页就少了,页表项也少了,TLB也就不容易失效了,所以地址翻译会更快,对吧。
没错你猜,调整到多大我的小弟弟很神秘
翻倍,8KB看到小哥哥摇头,我又猜了一下,是16KB吗
太保守了,居然能支持2MB和1GB大小!
这么大,牛逼!
闲置问题
第二天,程序员小哥哥开始彻底重构我。
升级后试着运行,发现一个问题:如果包不多或者没有包,我的轮询基本就是浪费时间,一直空转由于我垄断了一个核心,这个核心的占用率始终是100%,其他很多节目都吐槽我,占* *不* *的
于是,我的小哥哥程序员给我升级了,用了中断DPDK模式:没有包处理的时候我就睡觉了,改成中断通知也可以和其他线程共享CPU核,不再独占,但是DPDK线程会有更高的调度优先级一旦包多了,我就重新换成轮询模式,可以灵活切换
我弟弟连续加班两周经过一些优化和升级,我的数据包分析和处理能力有了很大的提高
可惜几轮测试下来,面对10Gbps流量的时候,还是有点不知所措,还是有点捉襟见肘。
弟弟有些气馁我不知道该怎么办了你觉得还有其他可以改进的地方吗
我现在基本上是满负荷工作,应该没有提升的空间了现在,唯一能喘口气的时间就是数据竞赛的时间了当数据被锁定时,线程切换将会暂停
小哥哥想了几秒钟,突然眼睛一亮,高兴地说:我有了!
还没来得及问,就被关机下班了~
程序员的小哥哥要对我做什么。