元芳你怎么看

本网站主要用于记录我个人学习的内容,希望对你有所帮助

0%

深入浅出DPDK-1

前言

该文章仅用于个人阅读笔记使用,如有错误,敬请指正。

什么是DPDK?

什么是DPDK?对于用户来说,它可能是一个性能出色的包数据处理加速软件库;对于开发者来说,它可能是一个实践包处理新想法的创新工场;对于性能调优者来说,它可能又是一个绝佳的成果分享平台。当下火热的网络功能虚拟化,则将DPDK放在一个重要的基石位置。

DPDK最初的动机很简单,就是证明IA多核处理器能够支撑高性能数据包处理。随着早期目标的达成和更多通用处理器体系的加入,DPDK逐渐成为通用多核处理器高性能数据包处理的业界标杆。

IA不适合进行数据包处理吗?

Linux系统为例,内核栈处理数据包流程:

  1. 数据包到达网卡。
  2. 网卡通过DMA将数据包复制到内存中的接收缓冲区。
  3. 网卡发送中断信号通知CPU有新的数据包到达。
  4. 中断处理程序被触发,处理该中断。
  5. 驱动程序将数据包从网卡的接收缓冲区移到内核的网络栈中,并将其放入适当的队列中。
  6. 内核网络栈对数据包进行处理(例如,协议栈处理,IP、TCP/UDP等)。
  7. 根据数据包的目的地,内核决定下一步操作:
    • 如果数据包需要在内核态进行处理,则直接在内核态处理。
    • 如果数据包需要由用户态应用程序处理,则内核将数据包放入相应的套接字缓冲区中。
  8. 用户态应用程序通过系统调用读取数据包,数据从内核态(CPU)复制到用户态的缓冲区中,然后进行处理。

在网络带宽向万兆发展时,大量的中断操作会严重降低处理性能。当然Linux操作系统对此也提出了NAPI机制,NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的方式读取数据,而代之以首先采用中断唤醒数据接收的服务程序,然后 POLL 的方法来轮询数据。以此来减少中断;问题是数据还需要做一次 CPU copy,复制操作也是很大的性能开销。对此也有处理方案,就是Netmap,使用共享数据包池减少这次CPU copy;还有问题:Linux是分时操作系统,需要进行进/线程进行对应的调度操作,那么它们的上下文切换以及cache misscache write back也会对极致的网络性能带来影响。

DPDK预取

alt text

在DPDK运行的时候,会使用mmap()系统调用把大页映射到用户态的虚拟地址空间,然后就可以正常使用了。

DDIO

DDIO技术之前是如何进行处理网络数据的:当一个网络报文送到服务器的网卡时,网卡通过外部总线(比如PCI总线)把数据和报文描述符送到内存。接着,CPU从内存读取数据到Cache进而到寄存器。进行处理之后,再写回到Cache,并最终送到内存中。最后,网卡读取内存数据,经过外部总线送到网卡内部,最终通过网络接口发送出去。

DDIO技术是如何改进的呢?这种技术使外部网卡和CPU通过LLCCache直接交换数据,绕过了内存这个相对慢速的部件。这样,就增加了CPU处理网络报文的速度(减少了CPU和网卡等待内存的时间),减小了网络报文在服务器端的处理延迟。