我是一个网络监控软件,我被开发出来的使命就是监控网络中进进出出的所有通信流量。

一直以来,我的工作都非常的出色,但是随着我监控的网络越来越庞大,网络中的通信流量也变得越来越多,我开始有些忙不过来了,逐渐发生丢包的现象,而且最近这一现象越发的严重了。

万兆流量需求

一天晚上,程序员哥哥把我从硬盘上叫了起来。

“这都几点了,你怎么还不下班啊?”,我问小哥哥。

“哎,产品经理说了,让我下个月必须支持万兆网络流量的分析,我这压力可大了,没办法只好加班了。”,说完整理了一下自己那日益稀疏的头发。

“万兆?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文章

那天,我被拉入一个Redis群聊···

CPU明明8个核,网卡为啥拼命折腾一号核?

因为一个跨域请求,我差点丢了饭碗

完了!CPU一味求快出事儿了!

哈希表哪家强?几大编程语言吵起来了!

五分钟看懂抓包神技:DPDK的更多相关文章

  1. 五分钟看懂js关键字this

    this是js里面很常用的关键字,而灵活的js也赋予了这个关键字无穷的生命力,相信你也有被它糊弄的时候,我总结了一个6字原则,大部分场合都能清醒分辨this到底指向who,跟大家分享一下,欢迎指正. ...

  2. 五分钟看懂Celery定时任务

    Django下使用Celery 使用场景: 1, Web应用. 当用户触发的一个操作需要很长时间才能执行完成,那么就可以把它当做一个任务去交给Celery去异步执行, 执行完成之后再返回给用户,这短时 ...

  3. [转]五分钟看懂UML类图与类的关系详解

    在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(Dependency)和关联(Association).其中关联又分为 ...

  4. 五分钟看懂UML类图与类的关系详解

    在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(Dependency)和关联(Association).其中关联又分为 ...

  5. [转帖]10分钟看懂Docker和K8S

    10分钟看懂Docker和K8S https://zhuanlan.zhihu.com/p/53260098 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这 ...

  6. 十分钟看懂AES加密

    十分钟看懂AES加密算法 今天看了Moserware的<A Stick Figure Guide to the Advanced Encryption Standard(AES)>收获了不 ...

  7. 五分钟搞懂POM设计模式

    转载请注明出处️ 作者:IT小学生蔡坨坨 原文链接:五分钟搞懂POM设计模式 大家好,我是IT小学生蔡坨坨. 今天,我们来聊聊Web UI自动化测试中的POM设计模式. 为什么要用POM设计模式 前期 ...

  8. 五分钟搞懂Vuex

    这段时间一直在用vue写项目,vuex在项目中也会依葫芦画瓢使用,但是总有一种朦朦胧胧的感觉.于是决定彻底搞懂它. 看了一下午的官方文档,以及资料,才发现vuex so easy! 作为一个圈子中的人 ...

  9. 五分钟读懂UML类图

    平时阅读一些远吗分析类文章或是设计应用架构时没少与UML类图打交道.实际上,UML类图中最常用到的元素五分钟就能掌握,下面赶紧来一起认识一下它吧: 一.类的属性的表示方式 在UML类图中,类使用包含类 ...

随机推荐

  1. 轻松理解JVM的分代模型

    前言 上篇文章我们一起对jvm的内存模型有了比较清晰的认识,小伙伴们可以参考JVM内存模型不再是秘密这篇文章做一个复习. 本篇文章我们将针对jvm堆内存的分代模型做一个详细的解析,和大家一起轻松理解j ...

  2. 达梦产品技术支持-DM8-数据库安装

    (该文档只适合个人环境搭建,未涉及到数据库的各种参数配置,未涉及到数据库规划,若需要企业环境搭建请咨询专业人员) 基于Windows的安装 windows下安装是图形化界面,与linux下的图形化界面 ...

  3. IDEA推送docker镜像到私服/利用dockerfile-maven-plugin插件在springboot中上传镜像到远程的docker服务器、远程仓库

    利用dockerfile-maven-plugin插件在springboot中上传镜像到远程仓库      这篇文章讲解在开发工具中把打包好的jar编译成docker镜像,上传到远程的docker服务 ...

  4. git 查看本地分支和切换本地分支的命令

    查看本地分支,和当前所在的分支 git branch -vv git checkout developer 切换到developer分支

  5. 解决SpringBoot 定时计划 quartz job 任务重复执行多次(10次)

    上一篇:SpringBoot多任务Quartz动态管理Scheduler,时间配置,页面+源 设置了多个 任务,本应该是各司其职的,任务调用多线程处理任务,but这个定时任务竟然同时跑了10次???如 ...

  6. Fullscreen API与DOM监听API

    前言 以下几个API,在web开发中可以简化我们一部分交互操作. Fullscreen API 有时候我们想要全屏预览的效果,比如类似于图片预览.幻灯片播放等.全屏API是一个很好的选择. 基本用法 ...

  7. Windows下CertUtil校验和编码文件

    目录 前言 CertUtil计算文件hash 计算MD2 计算MD4 计算MD5 计算SHA1 计算SHA256 计算SHA384 计算SHA512 文件base64编码 文件base64解码 文件h ...

  8. Mysql架构与内部模块-第一章

    Mysql作为大多数中小型企业的首选数据库,也可能是众多同僚接触的第一个数据库,其热门程度不言而喻,一些相对基础的知识本系列不做赘述,主要简述Mysql相关的进阶知识. 本章将由浅入深的讲解从连接My ...

  9. spring boot: 通过filter过滤器实现中文的简体繁体字符集转换(spring boot 2.3.1)

    一,为什么要使用filter来实现简繁体转换? 项目中有时会有同时支持简体和繁体两种字符集的要求, 或者搜索引擎有支持繁体输入字符的需求. 针对繁体字符的显示, 我们通常会在数据库和模板.文案配置中默 ...

  10. Django采坑日志(django2.0)

    使用Mariadb时出现的问题 "Unknown system variable 'transaction_isolation'" 解决办法:修改django/db/backend ...