DPDK-Hash(2)

简介: DPDK-Hash(2)

前言


第一章节介绍了DPDK的相关原理,和DPDK采用Cuckoo hash 相关性能指标。本章节主要是介绍DPDK hash 常用的 api 接口。


一、DPDK Hash


DPDK Hash Libary 提供函数主要是实现增加(add),删除(del), 查找(lookup),遍历(iterate)等功能。


二、DPDK hash 常用的API接口


1.DPDK 结构体

创建Hash 使用的参数结构体 如下:

/**
 * Parameters used when creating the hash table.
 */
struct rte_hash_parameters {
  const char *name;   /**< Name of the hash. */   //此名字具备唯一性, 在dpdk 中hash ,ring 等都需要唯一性名字
  uint32_t entries;   /**< Total hash table entries. */     // 创建的Hash 表容量,支持多少个条目
  uint32_t reserved;    /**< Unused field. Should be set to 0 */ // 保留
  uint32_t key_len;   /**< Length of hash key.*/ //每个Hash key 的长度。Hash 表中的Hash key 长度是统一的,有此处设置大小。
  rte_hash_function hash_func;  /**< Primary Hash function used to calculate hash. */ cuckoo Hask 需要两个Hash function,在这里设置Cuckoo Hash的主计算Function
  uint32_t hash_func_init_val;  /**< Init value used by hash_func. */
  int socket_id;      /**< NUMA Socket ID for memory. */ 此处表示Hash创建在那个物理socket_id 上。
  uint8_t extra_flag;   /**< Indicate if additional parameters are present. */
};

2. DPDK 常用接口

DPDK Hash API常用接口如下:

DPDK Hash API 大部分在<rte_hash.h> 中
// Hash table 的创建函数
struct rte_hash *rte_hash_create(const struct rte_hash_parameters *params);
// Hash add API 提供了四种
// hash_header + key
int32_t rte_hash_add_key(const struct rte_hash *h, const void *key);
// Hash_header + key + data. 在对应的Hash 表中存储数据data.
int rte_hash_add_key_data(const struct rte_hash *h, const void *key, void *data);
// Hash_headr +key + hask_function(slaver function)
int32_t rte_hash_add_key_with_hash(const struct rte_hash *h, const void *key, hash_sig_t sig);
// Hash_hader+key+
int32_t rte_hash_add_key_with_hash_data(const struct rte_hash *h, const void *key,hash_sig_t sig, void *data);
// 删除
// 根据key 删除 
int32_t rte_hash_del_key(const struct rte_hash *h, const void *key);
// 根据key和slave Hash function vale 
int32_t rte_hash_del_key_with_hash(const struct rte_hash *h, const void *key, hash_sig_t sig);
// 重置真个hash table
void rte_hash_reset(struct rte_hash *h);
// 遍历整个表
int32_t rte_hash_iterate(const struct rte_hash *h, const void **key, void **data, uint32_t *next);

三、DPDK 提供的Hash 算法


DPDK hash 提供了默认的默认的Hash 计算primary function. 如果不设置h->hash_func 就使用初始化默认的hash 函数


Hash 计算的slave function 可以使用rte_hash_hash(const struct rte_hash *h, const void *key) 获取。

Hash 计算函数可以自己定义: 比如l3fwd中。哈希函数就是自定义的。


四、DPDK Hash Demo


#include <stdio.h>
#include <arpa/inet.h>
#include <rte_eal.h>
#include <rte_ethdev.h>
//#include <rte_log.h>
#include <rte_hash.h>
#include <rte_jhash.h>
// hash表,也就是实现增删改查等功能
#define HASH_ENTRI_MAXNUM 1<<12
#define HUSH_KEY_COUNT   1<< 4
// 创建Hash key。 此处采用TUPLE5
struct net_key {
  uint32_t sip;
  uint32_t dip;
  uint16_t sport;
  uint16_t dport;
  char proto;
};
static void print_key (struct net_key *key) {
  printf("sip: %x dip: %x sport: %x dport %x proto:%d \n", 
    key->sip, key->dip, key->sport, key->dport, key->proto);  
}
// DPDK 创建表,队列等都需要自定义名字
static struct rte_hash * create_hash_table(const char *name){
  struct rte_hash_parameters *param = (struct rte_hash_parameters *) malloc(sizeof(struct rte_hash_parameters));
  if (!param) return NULL;
  param->name = name;
  param->entries = HASH_ENTRI_MAXNUM;
  param->key_len = sizeof(struct net_key);
  param->hash_func = rte_jhash; //  hash 函数
  param->hash_func_init_val = 0;
  param->socket_id =rte_socket_id();               // 进行NUMA, 这个是表示每一块内存上的寻址。
  struct rte_hash *hash = rte_hash_create(param);
  if (hash == NULL) {
    //RTE_LOG(INFO, Hash, "========================\n");    
  }
  return hash;
}
//DPDK 添加方式有四种
int main(int argc, char *argv[]){
  // DPDK 环境初始化
  rte_eal_init(argc, argv);
  int i = 0;
  uint32_t  net_sip;
  uint32_t  net_dip;
  uint16_t  sport;
  uint16_t  dport;
  inet_pton(AF_INET,"192.168.1.1",&net_sip);
  inet_pton(AF_INET,"192.168.2.1", &net_dip);
  sport = htons(5000);
  dport = htons(6000);
  struct rte_hash *hash  = create_hash_table("cuckoo hash table");
  for (i = 0; i < HUSH_KEY_COUNT; i++){
    struct net_key *nk = malloc(sizeof(struct net_key));
    nk->sip = net_sip + i;
    nk->dip = net_dip + i;
    nk->sport = sport+ i;
    nk->dport = dport + i;
    nk->proto = i % 2;
    // key 
    // key hash
    // key data+
    // key hash, data
    if(i % 4 == 0) {
      //rte_hash_add_key(hash, nk);
    }else if(i % 4 == 1){ // 第二种添加
      hash_sig_t key2 = rte_hash_hash(hash, nk);
      rte_hash_add_key_with_hash(hash, nk, key2);
    }
    else if (i %4 == 2){ // 第三种添加
      uint32_t* tmpdata = (uint32_t *)malloc(sizeof(uint32_t));
      *tmpdata = i;
      rte_hash_add_key_data(hash, nk, (void *)tmpdata);
    }else {
      hash_sig_t key4 = rte_hash_hash(hash, nk);
      uint32_t* tmp = (uint32_t *)malloc(sizeof(uint32_t));
      *tmp= i;
      rte_hash_add_key_with_hash_data(hash, nk, key4, (void *)tmp);
    }
  }
#if 0
  for (i = 0;i < HUSH_KEY_COUNT;i ++) {
    struct net_key *nk = malloc(sizeof(struct net_key));
    nk->sip = net_sip + i;
    nk->dip = net_dip + i;
    nk->sport = sport+ i;
    nk->dport = dport + i;
    nk->proto = i % 2;
    int idx = rte_hash_lookup(hash, nk);
    printf("hash lookup --> sip: %x, idx: %d\n", nk->sip, idx);
    rte_hash_del_key(hash, nk);
    free(nk);
  } 
#endif
  struct net_key *key = NULL;
  void *value = NULL;
  uint32_t next =0;
  while (rte_hash_iterate( hash, (const void **)&key, &value,&next) >= 0){
    print_key(key);
    if (value != NULL)
      printf("value : %u \n", *(uint32_t*)value);
  }
  return 0;
}


结果 :


总结


提示:这里对文章进行总结:

目录
相关文章
|
存储 C++ 容器
c++vector容器-赋直操作讲解
c++vector容器-赋直操作讲解
1964 0
|
架构师 测试技术 网络性能优化
dpdk课程学习之练习笔记七(vpp环境搭建及plugin demo测试)
dpdk课程学习之练习笔记七(vpp环境搭建及plugin demo测试)
1269 0
|
网络协议 网络安全 网络架构
TCP连接的保持活跃机制详解
总的来说,TCP的保持活跃机制是网络通信中不可或缺的一部分,能够有效维持TCP连接的活跃性,提高网络性能,防止不必要的网络断开。这一点不论对于TCP协议的深度理解,还是对于网络通信的实际应用,都有着重要的现实意义。
629 17
|
存储 数据挖掘 API
DPDK_Hash(1)
DPDK_Hash(1)
638 0
|
11月前
|
存储 负载均衡 容灾
海量数据如何“安家”?一文读懂哈希、范围和一致性哈希三大分片策略
将单机系统扩展为分布式架构时,数据分布是核心。哈希、范围及一致性哈希分片策略各有优劣:哈希均匀但扩缩容代价大;范围利于查询却易热点;一致性哈希平衡了动态伸缩与负载,广泛用于现代分布式系统。
876 3
|
JavaScript 前端开发 数据建模
探索未来编程新范式:响应式编程的崛起与实践
本文将深入探讨响应式编程的核心概念、技术优势及其在现代软件开发中的应用。通过实例解析,揭示这一新兴编程范式如何简化异步数据处理,提高代码的可维护性和效率,为读者提供从传统命令式编程向声明式编程转型的新视角。 ####
|
存储 缓存 运维
一致性哈希算法的缺点是什么?
【10月更文挑战第25天】虽然一致性哈希算法具有一些优点,如在节点变化时数据迁移量相对较小等,但也存在数据倾斜、虚拟节点复杂、节点数量少性能受限、数据迁移代价以及哈希函数选择等多方面的缺点。在实际应用中,需要根据具体的业务场景和系统需求,综合考虑这些因素,采取相应的优化措施来克服其缺点,充分发挥一致性哈希算法的优势。
|
域名解析 网络协议 网络安全
[计算机网络]---UDP协议
[计算机网络]---UDP协议
|
存储 开发工具 git
【Git】Git提示Another git process seems to be running in this repository, e.g. an editor opened by ..错误
【Git】Git提示Another git process seems to be running in this repository, e.g. an editor opened by ..错误
1361 0
|
数据采集 自然语言处理 数据可视化
使用爬虫技术从今日头条获取社会热点
今日头条是一款基于数据挖掘的推荐引擎产品,能够为用户提供个性化的信息流,涵盖了新闻、视频、娱乐、体育等多个领域。今日头条的内容来源于各大媒体、自媒体、网友等,具有丰富性和多样性。利用爬虫技术,我们可以从今日头条中获取社会热点和舆情分析,为我们的决策和研究提供有价值的数据和洞察。
1340 0
使用爬虫技术从今日头条获取社会热点