DPDK和DNS服务器关系
2016-04-05 15:15
176 查看
为了更好的抗DDOS攻击与服务更多的用户,需求单机处理千万级别的DNS服务器。
要达到单机处理千万级别的只能采用轮询而非中断方式,在市面上的可实现技术方案有DPDK/pf_ring/netmap等.
其中DPDK为Intel公司主推,并有BAT之类的大型公司进行商用,而且也比较适合处理UDP类型协议。
DPDK
的组成架构如下图所示,相关技术原理概述如下:
在最底部的内核态(Linux
Kernel)DPDK 有两个模块:KNI 与 IGB_UIO。
其中,KNI 提供给用户一个使用 Linux 内核态的协议栈,以及传统的 Linux 网络工具(如ethtool,
ifconfig)。IGB_UIO(igb_uio.ko 和
kni.ko. IGB_UIO)则借助了 UIO 技术,在初始化过程中将网卡硬件寄存器映射到用户态。
DPDK
的上层用户态由很多库组成,主要包括核心部件库(Core Libraries)、平台相关模块(Platform)、网卡轮询模式驱动模块(PMD-Natives&
Virtual)、QoS 库、报文转发分类算法(Classify)等几大类,用户应用程序可以使用这些库进行二次开发.
去除了中断影响,减少了操作系统内核的开销,消除了IO吞吐瓶颈;
避免了内核态和用户态的报文拷贝;用户态下软件崩溃,不会影响系统的稳定性;
Intel提供的PMD驱动,充分利用指令和网卡的性能;
提供2M和1G的巨页,减少了TLB Miss,TLB Miss严重影响报文转发性能;
高效的m_buf管理,能够灵活的组织报文,包括多buffer接收,分片/重组,都能够轻松应对;
无锁化的消息队列,实际验证,性能充足;
实现虚拟化下高速吞吐;
明显的降低内存等待开销,提升CPU的流水线效率。
采用其源码examples目录下l3fwd为基础进行最小原型开发demo。
为了使网络可达,我们做了如下开发:
先在simpleDNS服务端中临时配置一个服务IP进行过滤.
在DNS客户端通过手工配置ARP表使得客户端ping/dig操作的请求包可达服务端,
在simpleDNS服务端做解析请求包,如果是DNS请求构造响应包,其他类型如ARP/ICMP请求则通过KNI入接口ingress()重入Linux内核由
其来处理后再通过KNI的egress()接口响应给客户端。
经过上述编码调试后,最简单的原型验证通过了,为下面的全面开发提供了参考依据。
要达到单机处理千万级别的只能采用轮询而非中断方式,在市面上的可实现技术方案有DPDK/pf_ring/netmap等.
其中DPDK为Intel公司主推,并有BAT之类的大型公司进行商用,而且也比较适合处理UDP类型协议。
DPDK
的组成架构如下图所示,相关技术原理概述如下:
在最底部的内核态(Linux
Kernel)DPDK 有两个模块:KNI 与 IGB_UIO。
其中,KNI 提供给用户一个使用 Linux 内核态的协议栈,以及传统的 Linux 网络工具(如ethtool,
ifconfig)。IGB_UIO(igb_uio.ko 和
kni.ko. IGB_UIO)则借助了 UIO 技术,在初始化过程中将网卡硬件寄存器映射到用户态。
DPDK
的上层用户态由很多库组成,主要包括核心部件库(Core Libraries)、平台相关模块(Platform)、网卡轮询模式驱动模块(PMD-Natives&
Virtual)、QoS 库、报文转发分类算法(Classify)等几大类,用户应用程序可以使用这些库进行二次开发.
用户态模式下的PMD Driver
去除了中断影响,减少了操作系统内核的开销,消除了IO吞吐瓶颈;避免了内核态和用户态的报文拷贝;用户态下软件崩溃,不会影响系统的稳定性;
Intel提供的PMD驱动,充分利用指令和网卡的性能;
HugePage和m_buf管理
提供2M和1G的巨页,减少了TLB Miss,TLB Miss严重影响报文转发性能;高效的m_buf管理,能够灵活的组织报文,包括多buffer接收,分片/重组,都能够轻松应对;
Ring
无锁化的消息队列,实际验证,性能充足;
82599 SR-IOV NIC
实现虚拟化下高速吞吐;
Vector Instance /向量指令
明显的降低内存等待开销,提升CPU的流水线效率。采用其源码examples目录下l3fwd为基础进行最小原型开发demo。
为了使网络可达,我们做了如下开发:
先在simpleDNS服务端中临时配置一个服务IP进行过滤.
在DNS客户端通过手工配置ARP表使得客户端ping/dig操作的请求包可达服务端,
在simpleDNS服务端做解析请求包,如果是DNS请求构造响应包,其他类型如ARP/ICMP请求则通过KNI入接口ingress()重入Linux内核由
其来处理后再通过KNI的egress()接口响应给客户端。
经过上述编码调试后,最简单的原型验证通过了,为下面的全面开发提供了参考依据。
相关文章推荐
- [安卓开发笔记一]Android开发配置opencv环境超详细教程
- Python中使用struct模块打包二进制数据
- python Web
- javaweb 简单 de 登录注册
- 遍历map的几种方式
- 空间直方图Meanshift跟踪—代码
- marathon参考(2)Blue-Green Deployment
- java日期加减操作
- 销售订单行项目的装运点字段确认规则
- hdu 4686 Arc of Dream【矩阵快速幂】
- 如何让导航条高亮显示
- Symbol(s) not found for architecture X86_64问题解决
- 使用JMeter测试基于WebSocket协议的服务
- 单例模式
- iOS NSSet和NSMutableSet
- CMD-mklink
- ERP开发的一些闲话—之一
- redis整合spring mybatis --缓存方案
- 数据仓库详细分析和说明
- LoadRunner之并发用户数与迭代关系