首页 > 解决方案 > 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 在多个线程写入和读取同一个哈希表的多线程应用程序中工作的建议。

标签: multithreadingconcurrencyatomicdpdk

解决方案


推荐阅读