dpdk优势
传统网络架构与 DPDK(Data Plane Development Kit)网络架构之间存在许多区别,而 DPDK 的优势主要体现在以下几个方面:
数据包处理性能:传统网络架构中,网络数据包的处理通常由操作系统的网络协议栈负责,涉及多次内核态和用户态的切换,以及复杂的协议处理。这种方式对于高速数据包处理来说会产生较大的性能开销。而 DPDK 提供了一个用户空间的数据平面库,绕过了操作系统的网络协议栈,直接操作硬件和内存,实现了零拷贝和零中断的高效数据包处理,从而显著提升了数据包处理性能。
硬件抽象:传统网络架构中,网络设备的驱动程序是与特定硬件和操作系统紧密耦合的,不同的硬件需要编写不同的驱动程序。而 DPDK 提供了通用的抽象层,使得网络设备驱动可以更容易地在不同的硬件和操作系统上移植和使用,降低了硬件的依赖性。
高性能队列:传统网络架构中,操作系统提供的网络队列通常具有较高的延迟和较低的吞吐量,限制了数据包处理的性能。而 DPDK 采用基于Linux 内核的无锁环形缓冲 kfifo优化的无锁环形队列,针对单个或多个数据包生产者、单个数据包消费者的出入队列提供无锁机制,有效减少系统开销。
多核支持:传统网络架构中,由于操作系统的网络协议栈通常在单个核心上运行,无法充分利用多核处理器的性能。而 DPDK 支持多核并行处理,能够将数据包处理任务分配到多个核心上并行执行,从而充分利用多核处理器的性能优势。
采用HugePage:减少TLB Miss,降低访存开销;
采用精巧的内存池技术:创建Mbuf直接映射到实际报文,内核空间和用户空间的内存交互
不进行拷贝,只做控制权转移,避免拷贝开销;
利用CPU 亲和性:将线程绑定到指定CPU上,一方面减少了CPU线程间切换的开销,另一方
面避免了 CPU 缓存的局部失效性,增加了 CPU 缓存的命中率;
总体而言,DPDK 的优势在于其高性能、低延迟、硬件抽象和多核支持等特点,使得它成为高性能网络应用的理想选择。它被广泛应用于网络功能虚拟化、数据中心网络、云计算等场景,能够实现高速数据包的处理和转发,满足现代网络对性能和效率的要求
架构优化
主要采用三线程以及两组环形队列进行异步处理提升性能,此外,也很好的体现分层思想,具体架构如下:
因为暂时的功能不多,先实现上图中的框架,之后有新功能再不断完善。
这次代码太多先上伪代码
int pkt_process{
while (1) {
udp_process(); //处理UDP包
rte_ring_mp_enqueue(); //将ring->in中的数据内容 送到新的环形队列host->rcvbuf中
pthread_cond_signal(&host->cond);//条件变量 通知udp server 有数据需要处理
udp_out();//从host->sndbuf中取出数据来封装响应的udp包,并将包放入环形队列ring->out中
}
}
int udp_server_entry(){
nsocket();
nbind();
while (1) {
nrecvfrom();//从host->rcvbuf取数据
nsendto();//将要发送的数据写入host->sndbuf中
}
}
int main{
//创建环形队列,准备收包
ring->in = rte_ring_create("in ring",RING_SIZE,rte_socket_id(),RING_F_SP_ENQ | RING_F_SC_DEQ);
ring->out = rte_ring_create("out ring",RING_SIZE,rte_socket_id(),RING_F_SP_ENQ | RING_F_SC_DEQ);
//启动用户态协议栈中处理数据包的线程
rte_eal_remote_launch(pkt_process,mbuf_pool,lcore_id);
//启动udp server 线程
rte_eal_remote_launch(udp_server_entry,mbuf_pool,lcore_id);
while(1){
//将收到的包直接送入环形队列ring->in中
rte_eth_rx_burst();
rte_ring_sp_enqueue_burst();
//从环形队列ring->out中取出数据包发送
rte_ring_sc_dequeue_burst();
rte_eth_tx_burst();
}
}