五分钟看懂抓包神技:DPDK
我是一个网络监控软件,我被开发出来的使命就是监控网络中进进出出的所有通信流量。
一直以来,我的工作都非常的出色,但是随着我监控的网络越来越庞大,网络中的通信流量也变得越来越多,我开始有些忙不过来了,逐渐发生丢包的现象,而且最近这一现象越发的严重了。
万兆流量需求
一天晚上,程序员哥哥把我从硬盘上叫了起来。
“这都几点了,你怎么还不下班啊?”,我问小哥哥。
“哎,产品经理说了,让我下个月必须支持万兆网络流量的分析,我这压力可大了,没办法只好加班了。”,说完整理了一下自己那日益稀疏的头发。
“万兆?10Gbps?开玩笑呢吧?这是要累死我的节奏啊”
“可不是吗,可愁死我了。你快给我说说,你工作这么久了,有没有干的不爽的或者觉得可以改进的地方都可以给我说说”,小哥哥真诚的看着我。
我思考了片刻说到:“要说干的不爽的,还真有!就是我现在花了太多时间在拷贝数据包了,把数据包从内核空间拷贝到用户态空间,以前数据量小还行,现在网络流量这么大,可真是要了我的老命了。”
小哥哥叹了口气,“哎,这个改不了,数据包是通过操作系统的API获取的,操作系统又是从网卡那里读取的,咱们是工作在用户空间的程序,必须要拷贝一次,这没办法。你再想想别的?”
我也叹了口气,“那行吧,还有一个槽点,数据包收到后能不能直接交给我,别交给系统的协议栈和netfilter框架他们去处理了,反正我拿来后也要重新分析,每次都从他们那里过一次,他们办事效率又低,这不拖累我的工作嘛”
小哥哥皱着眉头,眨了眨眼睛说到:“大兄弟,这个咱也改不了啊,我这水平也有限,我还没有能力改造你绕过操作系统让你直接去跟网卡打交道啊。要不,要不你再说一个?嘿嘿”
“好吧,我也就不为难你了。有个简单的问题,你可得改一下”
“什么问题,说说看?”
“就是我现在花了很多时间在线程切换上,等到再次获得调度执行后,经常发现换了一个CPU核,导致之前的缓存都失效了,得重新建立缓存,这又是一个很大的浪费啊!能不能让我的工作线程独占CPU的核心,这样我肯定能提高不少工作效率!”
小哥哥稍微思考了一下,说到:“没问题,这个可以有!用线程亲和性就可以搞定,给你划几个核出来,不让它们参与系统的线程调度分配,专门给你用,这事就包在我身上吧!”
中断问题
过了几天,程序员哥哥对我进行了升级改造,让我的几个工作线程都能独占CPU核,工作效率提升了不少。
不过,距离产品经理要求的万兆流量分析指标,那还是差了一大截。
一天晚上,程序员小哥哥又找我聊了起来。
“现在分析能力确实有所提升,不过离目标还差得远啊,你快给我说说,还有没有改进的建议给我啊?”
“有倒是有,但是我估计你还是会说改不了”,我翻了个白眼。
“你先说说看嘛!”
“现在这个数据包是用中断的形式来通知读取的,能不能不用中断,让我自己去取啊?你是不知道,每次中断都要保存上下文,从用户态切换到内核态,那么多流量,这开销大了去了!”,我激动的说到。
小哥哥听完沉默了。
“看吧,我就说你改不了吧!还是算了吧,趁早给产品经理说这个需求做不了,咱俩都轻松自在”
“那不行,这个项目对我非常重要,我还指望通过你来升职加薪,走向人生巅峰呢!”,小哥哥说的很坚定。
“实在不行,那就多找几台机器,把我copy几份过去,软件不行就靠硬件堆出性能嘛!”,我冲他眨了个眼睛。
“这还用你说,老板肯定不会同意的”
“那我没辙了,实话告诉你吧,想要我能处理万兆网络流量,非得绕开操作系统,我亲自去从网卡读取数据包不可,你好好去研究下吧,想升职加薪,怎么能怕难呢!”,我给小哥哥打了打气。
小哥哥点了点头,“你说的是,我一定可以的,给我一点时间”
DPDK
就这样过了一个多星期,程序员小哥哥一直没再来找过我,也不知道他研究的怎么样了。
又过了好几天,他终于又来了。
“快出来!我找到办法了,明天就开始改造你!”
我一听来了兴趣,“什么办法?你打算怎么改造我?”
“这个新方案可以解决你之前提出的所有问题,可以让你直接去跟网卡打交道,不用中断来通知读取数据包,也不用再把数据包交给系统协议栈和netfilter框架处理,不用再频繁的在用户态和内核态反复切换了!”,小哥哥越说越激动!
“你也太牛了吧,能把这些问题都解决了!你是怎么做到这些的,什么原理?”,我好奇的问到。
小哥哥有些不好意思,“我哪有那本事啊,其实这是别人开发的技术,我只是拿来用而已。”
“额,那你都弄清楚它的原理了吗,别到时候坑我啊!”,我有些不太放心。
“这个你放心,这个技术叫DPDK,是人家Intel开发的技术,靠谱!”
接下来,程序员小哥哥给我介绍了这个叫DPDK的技术原理。
有了DPDK,通过操作系统的用户态模式驱动UIO,我可以在用户态通过轮询的方式读取网卡的数据包,再也不用中断了!
直接在用户态读取,再也不用把数据包在内核态空间和用户态空间搬来搬去。读到了之后我直接就可以分析,还不用走系统协议栈和netfilter瞎耽误功夫,简直完美!
“还不止这些呢!还支持大页内存技术”,小哥哥得意的说到。
“大页内存?这是什么”
“默认情况下系统不是以4KB大小来管理内存页面的吗?这个单位太小了,对于咱们服务器内存会有大量的内存页面,为了管理这些页面,就会有大量的页表项。CPU里面进行内存地址翻译的缓存TLB大小有限,页表项太多就会频繁失效,降低内存地址翻译的速度!”
听到这里,我突然明白了:“我知道了,把这个单位调大,管理的内存页面就少了,页表项数量就少了,TLB就不容易失效,地址翻译就能更快对不对?”
“没错,你猜猜看,调到多大?”,小哥哥故作神秘。
“翻一倍,8KB?”,见小哥哥摇摇头,我又猜到:“难道是16KB?”
“太保守了,能支持2MB和1GB两种大小呢!”
“这么大,厉害了!”
空转问题
第二天,程序员小哥哥开始了对我进行了彻底的重构。
升级后的我试着跑了一下,发现了一个问题:如果数据包不是很多或者没有数据包的情况下,我的轮询基本上就挺浪费时间的,一直空转,由于我独占了一个核,这个核的占用率就一直是100%,不少别的程序都吐槽我,占着**不**。
于是,程序员小哥哥又对我进行了升级,用上了Interrupt DPDK模式:没有数据包处理时就进入睡眠,改为中断通知。还可以和其他线程共享CPU核,不再独占,但是DPDK线程会有更高调度优先级,一旦数据包多了起来,我又变成轮询模式,可以灵活切换。
程序员哥哥连续加了两个星期的班,经过一番优化升级,我的数据包分析处理能力有了极大的提升。
然而遗憾的是,测试了几轮,当面临10Gbps的流量时,我还是有点力不从心,还是差了那么一点点。
小哥哥有些灰心丧气,“我不知道该怎么办了,你觉得还有什么哪些地方可以改进吗?”
“我现在基本满负荷工作了,应该没有什么地方可以改进了。现在唯一有时间喘口气的地方就是数据竞争的时候了,遇到数据被加了锁发生线程切换歇一歇”
小哥哥思考了几秒钟,突然眼睛一亮,高兴的说到:“有了!”
还没来得及问,就把我关闭,下班去了~
到底程序员小哥哥又要对我做什么呢?
往期TOP5文章
五分钟看懂抓包神技:DPDK的更多相关文章
- 五分钟看懂js关键字this
this是js里面很常用的关键字,而灵活的js也赋予了这个关键字无穷的生命力,相信你也有被它糊弄的时候,我总结了一个6字原则,大部分场合都能清醒分辨this到底指向who,跟大家分享一下,欢迎指正. ...
- 五分钟看懂Celery定时任务
Django下使用Celery 使用场景: 1, Web应用. 当用户触发的一个操作需要很长时间才能执行完成,那么就可以把它当做一个任务去交给Celery去异步执行, 执行完成之后再返回给用户,这短时 ...
- [转]五分钟看懂UML类图与类的关系详解
在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(Dependency)和关联(Association).其中关联又分为 ...
- 五分钟看懂UML类图与类的关系详解
在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(Dependency)和关联(Association).其中关联又分为 ...
- [转帖]10分钟看懂Docker和K8S
10分钟看懂Docker和K8S https://zhuanlan.zhihu.com/p/53260098 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这 ...
- 十分钟看懂AES加密
十分钟看懂AES加密算法 今天看了Moserware的<A Stick Figure Guide to the Advanced Encryption Standard(AES)>收获了不 ...
- 五分钟搞懂POM设计模式
转载请注明出处️ 作者:IT小学生蔡坨坨 原文链接:五分钟搞懂POM设计模式 大家好,我是IT小学生蔡坨坨. 今天,我们来聊聊Web UI自动化测试中的POM设计模式. 为什么要用POM设计模式 前期 ...
- 五分钟搞懂Vuex
这段时间一直在用vue写项目,vuex在项目中也会依葫芦画瓢使用,但是总有一种朦朦胧胧的感觉.于是决定彻底搞懂它. 看了一下午的官方文档,以及资料,才发现vuex so easy! 作为一个圈子中的人 ...
- 五分钟读懂UML类图
平时阅读一些远吗分析类文章或是设计应用架构时没少与UML类图打交道.实际上,UML类图中最常用到的元素五分钟就能掌握,下面赶紧来一起认识一下它吧: 一.类的属性的表示方式 在UML类图中,类使用包含类 ...
随机推荐
- 多测师讲解_python_pycharm基本实用操作__保存代码_
pycharm中中保存代码的方式: 方式一: 方式二: 第一步: 第二步:
- 多测师讲解pthon_002字符,列表,元组,字段等
# # # 索引:# # # 正向索引: 0 1 2 3 4 5 6# # # l= a b c d e f g# # # 反向索引: -7 -6 -5 -4 ...
- Springboot配置excludePathPatterns不生效
Springboot添加拦截器配置excludePathPatterns不生效 code: @Configurationpublic class ServiceConfig implements We ...
- k8s-获取kuboardtoken
master节点执行命令 echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kub ...
- docker系统化学习图文教程
1.背景 在实际开发中我们经常遇到这样的情况: 1.开发的时候测试好的程序已发布到线上就出问题: 2.线上的集群环境需要扩容时非常麻烦,比如说要装jdk.mysql.redis等,如果扩容100台服务 ...
- 关于Dockerfile
在Docker中创建镜像最常用的方式,就是使用Dockerfile.Dockerfile是一个Docker镜像的描述文件,我们可以理解成火箭发射的A.B.C.D-的步骤.Dockerfile其内部包含 ...
- apache自带的ab测试失败请求原因
只要出现 Failed requests 就会多出现一行要求失败的各原因的数据统计,分别有 Connect, Length, 与 Exception 三种,分别代表的意义为:Connect ...
- fiddler 实用小技巧
1.添加查看响应时间
- C# 微支付 JSAPI支付方式 V3.3.6版本
<script type="text/javascript">//结算 (订单号) function PayClearing(num) { $.ajax({ type: ...
- JavaWeb中的域对象
域对象:可以在不同Servlet之间传递数据的对象,就是域对象,它们内置了map集合,都有setAttribute和getAttribute方法: Java Web有ServletContext.Se ...