绝对干货!初学者也能看懂的DPDK解析
一、网络IO的处境和趋势
从我们用户的使用就可以感受到网速一直在提升 , 而网络技术的发展也从1GE/10GE/25GE/40GE/100GE的演变 , 从中可以得出单机的网络IO能力必须跟上时代的发展 。
1. 传统的电信领域
IP层及以下 , 例如路由器、交换机、防火墙、基站等设备都是采用硬件解决方案 。 基于专用网络处理器(NP) , 有基于FPGA , 更有基于ASIC的 。 但是基于硬件的劣势非常明显 , 发生Bug不易修复 , 不易调试维护 , 并且网络技术一直在发展 , 例如2G/3G/4G/5G等移动技术的革新 , 这些属于业务的逻辑基于硬件实现太痛苦 , 不能快速迭代 。 传统领域面临的挑战是急需一套软件架构的高性能网络IO开发框架 。
2. 云的发展
私有云的出现通过网络功能虚拟化(NFV)共享硬件成为趋势 , NFV的定义是通过标准的服务器、标准交换机实现各种传统的或新的网络功能 。 急需一套基于常用系统和标准服务器的高性能网络IO开发框架 。
3. 单机性能的飙升
网卡从1G到100G的发展 , CPU从单核到多核到多CPU的发展 , 服务器的单机能力通过横行扩展达到新的高点 。 但是软件开发却无法跟上节奏 , 单机处理能力没能和硬件门当户对 , 如何开发出与时并进高吞吐量的服务 , 单机百万千万并发能力 。 即使有业务对QPS要求不高 , 主要是CPU密集型 , 但是现在大数据分析、人工智能等应用都需要在分布式服务器之间传输大量数据完成作业 。 这点应该是我们互联网后台开发最应关注 , 也最关联的 。
二、Linux + x86网络IO瓶颈
根据经验 , 在C1(8核)上跑应用每1W包处理需要消耗1%软中断CPU , 这意味着单机的上限是100万PPS(Packet Per Second) 。 从TGW(Netfilter版)的性能100万PPS , AliLVS优化了也只到150万PPS , 并且他们使用的服务器的配置还是比较好的 。 假设 , 我们要跑满10GE网卡 , 每个包64字节 , 这就需要2000万PPS(注:以太网万兆网卡速度上限是1488万PPS , 因为最小帧大小为84B《Bandwidth, Packets Per Second, and Other Network Performance Metrics》) , 100G是2亿PPS , 即每个包的处理耗时不能超过50纳秒 。 而一次Cache Miss , 不管是TLB、数据Cache、指令Cache发生Miss , 回内存读取大约65纳秒 , NUMA体系下跨Node通讯大约40纳秒 。 所以 , 即使不加上业务逻辑 , 即使纯收发包都如此艰难 。 我们要控制Cache的命中率 , 我们要了解计算机体系结构 , 不能发生跨Node通讯 。
从这些数据 , 我希望可以直接感受一下这里的挑战有多大 , 理想和现实 , 我们需要从中平衡 。 问题都有这些
1.传统的收发报文方式都必须采用硬中断来做通讯 , 每次硬中断大约消耗100微秒 , 这还不算因为终止上下文所带来的Cache Miss 。
2.数据必须从内核态用户态之间切换拷贝带来大量CPU消耗 , 全局锁竞争 。
3.收发包都有系统调用的开销 。
4.内核工作在多核上 , 为可全局一致 , 即使采用Lock Free , 也避免不了锁总线、内存屏障带来的性能损耗 。
5.从网卡到业务进程 , 经过的路径太长 , 有些其实未必要的 , 例如netfilter框架 , 这些都带来一定的消耗 , 而且容易Cache Miss 。
需要C/C++ Linux高级服务器架构师学习资料后台私信“资料”(包括C/C++ , Linux , golang技术 , Nginx , ZeroMQ , MySQL , Redis , fastdfs , MongoDB , ZK , 流媒体 , CDN , P2P , K8S , Docker , TCP/IP , 协程 , DPDK , ffmpeg等)
文章插图
三、DPDK的基本原理
从前面的分析可以得知IO实现的方式、内核的瓶颈 , 以及数据流过内核存在不可控因素 , 这些都是在内核中实现 , 内核是导致瓶颈的原因所在 , 要解决问题需要绕过内核 。 所以主流解决方案都是旁路网卡IO , 绕过内核直接在用户态收发包来解决内核的瓶颈 。
DPDK旁路原理:
文章插图
左边是原来的方式数据从 网卡 -> 驱动 -> 协议栈 -> Socket接口 -> 业务
右边是DPDK的方式 , 基于UIO(Userspace I/O)旁路数据 。 数据从 网卡 -> DPDK轮询模式-> DPDK基础库 -> 业务
用户态的好处是易用开发和维护 , 灵活性好 。 并且Crash也不影响内核运行 , 鲁棒性强 。
DPDK支持的CPU体系架构:x86、ARM、PowerPC(PPC)
DPDK支持的网卡列表: , 我们主流使用Intel 82599(光口)、Intel x540(电口)
四、DPDK的基石UIO
为了让驱动运行在用户态 , Linux提供UIO机制 。 使用UIO可以通过read感知中断 , 通过mmap实现和网卡的通讯 。
- AI芯片“点燃”北京!GTIC 2020 AI芯片创新峰会大咖演讲全干货
- 二叉树:搜索树的最小绝对差
- 小店|抖音小店无货源模式,干货来了,抖音小店店群怎么做?
- GPU|干货|基于 CPU 的深度学习推理部署优化实践
- 干货:阿里巴巴提升组织能力的5大经典管理工具
- 搞定2020年路由器选购,家庭组网干货攻略
- 换机|年底换机热潮如何选?这六款旗舰手机绝对有一款是你的菜
- 30款万年笔的推荐人气排名男性/女性/初学者/ 2020
- 互联网创业思维:什么是真正的干货?你是怎么给“干货”下定义的
- 更新|微信再次迎来创新,这4点新功能很实用,绝对值得你的关注