DPDK源码分析之DPDK技术简介

Cache和内存技术

1. Cache一致性

多核处理器同时访问同一段cacheline时,会出现写回冲突的情况,操作系统解决这个问题会消耗一部分性能,DPDK采用了两个技术来解决这个问题:

  • 对于共享的数据,每个核都定义自己的备份lcore[RTE_MAX_LCORE],这样多核处理事务时只处理自己的部分,lcore[idx]
  • 利用单网卡有着多队列的能力,当多核处理同一个网卡的数据包时,进行分队列处理,例如核1使用队列1、2,核2使用队列3,4

2. 巨页技术

内存管理单元(MMU)完成从虚拟内存地址到物理内存地址的转换。内存管理单元进行地址转换需要的信息保存在一个叫页表(Page Table)的数据结构里面,页表查找是一种极其耗时的操作。DPDK则利用巨页技术,首先页表增大到1GB,这样会大大减少cache miss,其次所有的内存都是从巨页里分配,实现对内存池(Mempool)的管理,并预先分配好同样大小的mbuf,供每一个数据分组使用。

3. DDIO

传统方式,当一个网络报文送到服务器的网卡时,网卡通过外部总线(比如PCI总线)把数据和报文描述符送到内存。接着,CPU从内存读取数据到Cache进而到寄存器。进行处理之后,再写回到Cache,并最终送到内存中

DPDK使用了DDIO技术使外部网卡和CPU通过LLC Cache直接交换数据,绕过了内存这个相对慢速的部件。

4. NUMA

NUMA是起源于AMD Opteron的微架构,同时被英特尔Nehalem架构采用。在这个架构中,处理器和本地内存之间拥有更小的延迟和更大的带宽,而整个内存仍然可作为一个整体,任何处理器都能够访问,只不过跨处理器的内存访问的速度相对较慢一点。

DPDK做了一些优化以适应NUMA系统,使其运行速度更快:

  • per-core memory,每个核都有属于自己的内存,即对于经常访问的数据结构,每个核都有自己的备份
  • 如果有一个PCI设备在node0上,就用node0上的核来处理该设备,处理该设备用到的数据结构和数据缓冲区都从node0上分配,即本地设备本地处理

无锁环形队列

环形队列一般符合生产者-消费者模型,用于报文收发的缓存区或者是线程收

你可能感兴趣的:(c++,linux,DPDK,服务器,linux,c++,dpdk,虚拟机)