DPDK 是目前比较流行的数据面加速的解决方案,提供了一些在数据转发面比较有用的库,比如本文中提到的LPM,LPM是longest prefix match的缩写,中文的意思是最长匹配。这是在数据转发面比较常用的一个概念,意思就是有多个匹配项的时候,最长匹配的那一项将做为最终的查找结果。
DPDK LPM的库主要是针对长度为32位的key,其实就是针对IPv4的路由查找所量身定制的。
LPM的库支持的方法主要有三个,分别是添加/删除/查找。通过空间换时间的方式,可以将查找的时间复杂度缩减到O(1)的量级。
接下来我们就来看看实现的具体细节,通过什么样的数据结构设计来实现常数级别的查找性能。
2019-07-16 未完待续
DPDK中的LPM算法,使用DDR-24-8的算法,通过牺牲空间的方法来换取查找性能的提升。大多数情况下,路由的子网掩码长度都是小于等于24的,满足这个条件的路由查找都可以通过一次访存来实现。如果是大于24的,则需要两次访存来实现。由此可见,DPDK中实现的LPM的查找性能很大程度上取决于所要访问的内存是否在CPU的cache中。
主要的数据结构由下面两部分构成:
- 一个有2^24表项的数组,我们暂且将这个表称为tbl24。
- 一群有2^8表项的数组,这个为tbl8。
tbl24由IP地址的前24位来进行索引,tbl8由IP地址的后8位来进行索引。理论上来讲,每一个tbl24中的表项都可以指向一个tbl8的数组,最终有可能退化成2^32个表项。然而这个对于内存资源来说是太大了。相反的,这个方法利用了IP路由的特点,大多数路由的掩码都是小于等于24的。通过设计两层表项的结构,可以在提高查找性能的情况下,尽可能小的耗用内存。</