用户态IO:DPDK
在讲多路复用的时候,我们提到:多路复用本身仍然是同步I/O,数据从内核空间到用户空间仍然存在一次拷贝,影响效率。其实对于大容量网络通信(如交换机)而言,不仅数据拷贝的开销不可接受,系统调用频繁的上下文切换也是难以忽视的开销。
Intel DPDK(Data Plane Development Kit) 采用绕过Linux kernel、将报文收发工作放到用户空间的方式,同时做到了避免数据拷贝和上下文切换,是目前高性能网络通信最成熟的解决方案。
传统I/O过程
传统的I/O方式使用的是中断机制,数据包到来时会产生一个硬件中断,CPU接收到中断信号之后会切换进入内核态获取报文,然后切换回用户空间,并从内核空间中拷贝消息。
当数据量比较大的时候,频繁的中断和上下文切换不仅会降低I/O效率,还会影响多核CPU上其他程序的运行。
DPDK I/O过程
DPDK 通过kernel里的 uio driver 直接屏蔽硬件中断,用户空间的 PMD(Poll Mode Driver) 采用轮询方式进行收发。
为了减少cache miss和TLB miss,DPDK使用大页内存、NUMA和CPU亲和性绑定机制。
为了避免没有报文时空转,提出 Interrupt DPDK,当没有报文收发时转入中断机制,有消息到来被唤醒,进入轮询。
// TBD