DPDK rte_hash多线程

问题描述

大家!我正在编写基于DPDK的应用程序。我正在从NIC读取数据包,并将它们排队。然后,我有多个工作线程,这些线程将数据包从rx环中出队,解析其标头以获取目标ip地址和4级协议目标端口。此数据打包成以下结构:

struct session_key {
    rte_be32_t ip_dst;
    rte_be16_t port_dst;
};

此结构用作rte_hash表中的键。作为此哈希表中的数据,我使用uint32_t计数器,该计数器在数据包与键匹配时递增。我使用RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY标志创建rte_hash,以使其对多线程读写具有线程安全性。 每个工作线程从数据包获取dst_ip和dst_port,并查找哈希表以获取此类密钥。如果key存在,则其值增加;如果key不存在,则将其添加到data = 1的表中。

uint32_t *found;
int ret = rte_hash_lookup_data(sessions_hash_table,(void *)&key,(void **)&found);
if (ret < 0) {
   uint32_t *data = rte_zmalloc("session_key",sizeof(uint32_t),0);
   *data = 1;
   rte_hash_add_key_data(sessions_hash_table,&key,data);
} else {
   (*found)++;
}

因此,我有多个读取器和哈希表写入器。所有工作人员完成后,将在主线程中计算通用统计信息。屏幕上会打印多少包与每对IP和端口匹配的数据包。 问题是,当我仅使用一个工人时,就没有问题,接收到的数据包的数量等于哈希表中保存的数据包。

但是当我使用多个工作线程时,我得到的数字不相等。我知道有可能在另一个线程向它写入数据时读取表。但是我认为像RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY这样的配置标志将帮助我处理多线程。

因此,我需要一些有关如何使rte_hash在多线程应用程序中工作的建议,在该应用程序中,多个线程将写入和读取同一哈希表。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)