Neo's Blog

不抽象就无法深入思考
不还原就看不到本来面目!

0%

计算机-主存储

0. 主存储

dpdk高性能

轮询机制

在包处理时,采用轮询机制,而避免中断,有利于减少上下文切换的开销,规避不必要的内存拷贝和系统调用。

亲和性与独占

特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中

设置CPU亲和性,让程序近运行在指定的核上,仅读取指定网卡的指定队列,从而避免数据竞争

无锁循环队列

并行指令,从而加速访问

CPU Cache 加速

  • cache行对齐
  • 预取数据,CPU提供了指令来供程序员使用,提前把要读区的数据从内存加载到对应的Cache
  • 每个核尽量不与其他核共享数据,以减少Cache保持一致性带来的额外成本

引入大页表

矛盾:TLB大小有限 VS 尽可能高的查询命中率

解法:但是一个常规页4k,假设一个程序用了512页,总共2MB,这就需要TLB里至少方下512个页表项才能保证每次都能命中,但TLB大小有限。所以为了减少TLB不命中的情况,可以使用大页,以1G为单位进行分页。

降低访存开销:利用内存大页HUGEPAGE降低TLB miss,利用内存多通道交错访问提高内存访问有效带宽

克服NUMA

为了克服SMP的总线负担大的问题,引入NUMA,但是引入了新的问题:访问远程内存效率低下。

DPDK为了克服NUMA的弊端,采取了如下措施:

①Pre-corememory。每个核都有属于自己的内存,经常访问的数据结构有自己的备份。这样既满足了本地内存的需要,又可以避免cache一致性问题。

②本地设备本地处理。如果一个PCI设备在node0上,那这个设备就由Node0处理。比如:

q = rte_zmalloc_socked\t(“fm10k”,sizeof(*q), RTE_CACHE_LINE_SIZE, socket_id);

充分利用DDIO

没有DDIO的情况下,处理一个报文,CPU和网卡需要多次访问内存,而内存又很慢,造成CPU长时间等待内存。

DDIO让外部网卡和cpu通过LLC Cache交换数据,绕过内存。但是报文要存在LLC Cache中,增加了对LLC Cache的容量需求。(*LLC = Last Level Cache)

你的支持是我坚持的最大动力!