DPDK_Hash(1)

简介: DPDK_Hash(1)

前言


什么是Hash和解决hash 冲突的方案:


哈希的本质是从一个较大空间映射到一个较小的空间,因此在插入数据足够多之后,根据鸽巢原理,一定会存在位置冲突。常见的哈希表(Hash Table 或者字典,dictionary)会通过链表、开放地址探测等方式来处理冲突。单桶多函数的布谷鸟哈希,便是开放地址法处理冲突的一种哈希表,只不过有冲突后,不是通过线性寻找新的位置,而是通过额外哈希函数来寻找。

DPDK 提供的Hash是采用Cuckoo Hase 实现。 DPDK Hash 具备一下特点:


  • 每个条目有唯一的key标识;
  • 所有key 占有相同大小的空间,空间大小有创建的时候设定;

一、什么是CUCKOO Hash


Cuckoo Hash Table是本次引入的数据结构,它用了两个哈希函数来解决冲突。

Cuckoo利用两个哈希函数来实现最差O(1)的查询复杂度:


  • 对任意一个Key可求出两个哈希值,相当于映射到两个桶,如A被映射到1,4,说明它可以被存到1号或4号桶,而实际在1号桶。本图中,用箭头连接某个Key实际存入的桶和另一个对应的桶,如1—>4。
  • 当插入一个F时,如果对应的两个桶至少有一个为空,则将其插入到这个位置,否则任选一个桶,不妨设为A所在的1号桶。我们将其中原有的A =Key’/Value’踢出,将新的F存入。对于刚取出的A,它之所以存储在1号桶是因为用了两个哈希函数之一,那么我们用另外一个哈希函数,知道A对应的位置还有4号桶。若4号桶为空,则将A放入,整个过程就结束了。而事实上,4号桶中还存有B

= Key’’/Value’’,那么把它们踢出并重复上面的操作。整个过程中进行踢出、填入操作的,形如“1->4-> … ->空位”这样的序列我们将其称为Cuckoo Kick路径。

  • 当查询一个F时,分别检查它的的哈希值对应的两个位置即可。

04708a7b1e6d3a924049550275c63f77_f4cdba0c868c47b7823b2b747b794ad2.png


二、常见 Hash特点


1.Hash 优点

  1. Cuckoo查询操作的理论复杂度为最差O(1),优于Dense的期望查询复杂度O(1)和Chain的O(1+α)。
  2. 而Cuckoo的插入复杂度为均摊O(1)

三、DPDK采用的Hash 原理


3.1 DPDK Hash libary 具体原理

dd4d24e6c32e915cd23298bc9580de87_b8a042c672e74eeba9b06aad706c2670.png


3.2 DPDK Hash Table 具体实现

Hase table 包含两个表:

第一个表是一个桶数组构成,每个桶中具有相同数量的连续数组条目。每个条目包含计算的给定Key的主要和次要签名(hask index)(如下所述)和第二个表的索引。

第二个表是存储在哈希表中的所有Key的数组及其与每个Key相关联的数据。(Key + 8Byte integer 或者 key + ptr)

d97c9462c639fc1a79dcde6de857fb0f_95a382a6c3024fd29b66c685c3703bcc.png


3.3存储的数据

b00247648abaa5450a0df5a1713ca671_953fd56156924a00a7b2b651cdcdbb62.png


**NODE**

只能在单线程模式下,使用的API: “rte_hash_set_cmp_func()”.

b04b684e91b53dc5bbe396083f6865b4_0a2cafb928ec403dbb8df72a5bcb7ec8.png

943ebe4f77908f72543d262ced5ada1f_c3400611ef3842d4b01c2ff79fd71cb4.png


3.5 Hash bucket index

bucket

First table is an array of buckets each of which consists of multiple entrie.


bucket index

f5f9dfea3ca123d45b6252a6b7f2147a_58bf3ea0665d454da617fa308b652380.png


四、DPDK应用


Hash 可以用来实现 Flow Classification。流分类用于将每个输入数据包映射到它所属的连接/流。这种操作是必需的,因为每个输入分组的处理通常在其连接的上下文中进行,因此相同的操作集合被应用于来自相同流的所有分组。

使用流分类的每个应用通常具有被定义为从输入报文中读取一个或多个字段来构成Key,用于标识流。我们通常使用5-tuple 来标识一条流。


参考


DPDK官方文档中文版

DPDK 官方文档

Cuckoo Hashing的应用及性能优化


总结

目录
相关文章
|
存储 缓存 Linux
free命令详解
`free`命令在Linux中显示内存使用详情,包括总内存(`total`)、已用(`used`,含缓存`buffers/cache`)、空闲(`free`)、共享(`shared`)和可用(`available`)内存。交换空间显示其总量、使用量和剩余量。`-h`选项以易读格式显示,`-m`以MB显示,`-t`显示总和,`-s`定时刷新。例如,`free -ht 5`每5秒更新内存和交换空间的总览。
1010 3
|
监控 Linux C++
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展(2)
本文是《4步实现C++插件化编程》的延伸,重点介绍了新增的插件“热拔插”功能。通过`inotify`接口监控指定路径下的文件变动,结合`epoll`实现非阻塞监听,动态加载或卸载插件。核心设计包括`SprDirWatch`工具类封装`inotify`,以及`PluginManager`管理插件生命周期。验证部分展示了插件加载与卸载的日志及模块状态,确保功能稳定可靠。优化过程中解决了动态链接库句柄泄露问题,强调了采纳用户建议的重要性。
661 113
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展(2)
|
运维 监控 应用服务中间件
运维打铁: Ruby 脚本在运维自动化中的应用探索
Ruby 是一种简洁、动态类型的编程语言,适合运维自动化任务。本文介绍了其在服务器配置管理、定时任务执行和日志分析处理中的应用,并提供了代码示例,展示了 Ruby 在运维自动化中的实际价值。
634 2
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
321 0
|
JSON 测试技术 API
接口测试的测试用例该怎么写呢
在上面的代码中,我们首先设置了测试用例的输入参数,包括请求的方法、URL、请求头、请求体等。然后使用requests库发送请求并获取响应结果。最后,我们使用assert语句对响应结果的状态码和响应体进行验证。如果验证不通过,assert语句会抛出异常并终止程序的执行。如果验证通过,程序将继续执行后面的代码。
|
IDE 数据可视化 Java
查看Java字节码内容的几种方式
查看Java字节码内容的几种方式
639 152
|
算法 API
DPDK-Hash(2)
DPDK-Hash(2)
643 0
|
人工智能 Oracle 关系型数据库
一篇文章弄懂Oracle和PostgreSQL的Database Link
一篇文章弄懂Oracle和PostgreSQL的Database Link
|
存储 缓存 算法
从零开始学习DPDK:掌握这些常用库函数就够了(下)
从零开始学习DPDK:掌握这些常用库函数就够了
|
存储 缓存 测试技术
DPDK-mempool(3)
DPDK-mempool(3)
542 0