当前位置:网站首页>ice 100G 网卡分片报文 hash 问题
ice 100G 网卡分片报文 hash 问题
2022-07-25 14:59:00 【longyu_wlz】
问题描述
在 x710 hash 分片与非分片 tcp 报文异常问题 这篇文章中,我描述了 x710 网卡同时 hash 分片与非分片报文的问题。
实际的应用场景中,同一条流的包一般会被 hash 到同一个队列中,业务程序在同一个队列中处理同一条流的报文。
当一条流同时包含分片与非分片报文时,由于分片报文与非分片报文五元组存在区别,当配置的 hash 规则不正确时,这些属于同一条流的报文可能会被网卡 hash 到不同的队列中,此时业务程序就会产生异常。
实际测试发现,我们的业务程序使用 E810 网卡时存在上述问题,本文将针对这一问题进行描述。
dpdk 版本为:dpdk-20.11
过去的成功经验
曾经处理过 x710 网卡的类似问题,问题的描述如下:
当配置了 ETH_RSS_FRAG_IPV4与 ETH_RSS_NONFRAG_IPV4_TCPhash 类型后,一些连接的分片报文由于没有 L4 port number会被 hash 到其它队列中。
当不配置 ETH_RSS_NONFRAG_IPV4_TCP 时,ETH_RSS_FRAG_IPV4 哈希过程不会应用到非分片报文上,这些报文将会被投递到队列 0。
解决方法:修改网卡 rss-hash 配置非分片 tcp 报文只使用 L3 头进行 hash,x710 通过 fdir 来进行配置。
根据上述信息,需要配置 E810 网卡对非分片 tcp 报文只使用 L3 头进行 hash,那如何配置呢?
ice E810 100G 网卡 hash 配置信息
我们的业务程序使用 ETH_RSS_IP | ETH_RSS_TCP | ETH_RSS_UDPhash 配置,相关宏的定义如下:
#define ETH_RSS_IP ( \\
ETH_RSS_IPV4 | \\
ETH_RSS_FRAG_IPV4 | \\
ETH_RSS_NONFRAG_IPV4_OTHER | \\
ETH_RSS_IPV6 | \\
ETH_RSS_FRAG_IPV6 | \\
ETH_RSS_NONFRAG_IPV6_OTHER | \\
ETH_RSS_IPV6_EX)
#define ETH_RSS_UDP ( \\
ETH_RSS_NONFRAG_IPV4_UDP | \\
ETH_RSS_NONFRAG_IPV6_UDP | \\
ETH_RSS_IPV6_UDP_EX)
#define ETH_RSS_TCP ( \\
ETH_RSS_NONFRAG_IPV4_TCP | \\
ETH_RSS_NONFRAG_IPV6_TCP | \\
ETH_RSS_IPV6_TCP_EX)
上述配置的含义为使用报文的 ip 头与 tcp 头、udp 头的内容进行 hash,分片报文与非分片报文的 hash 规则一致,E810 网卡处理时会存在上文描述的问题。
dpdk 中 ice E810 网卡配置 rss hash 配置的过程
函数调用图示:

ice_init_rss 函数使用 dev->data->dev_conf.rx_adv_conf.rss_conf配置为参数调用 ice_rss_hash_set 函数完成 hash 配置过程。相关代码如下:
rss_conf = &dev->data->dev_conf.rx_adv_conf.rss_conf
...........
/* RSS hash configuration */
ice_rss_hash_set(pf, rss_conf->rss_hf);
ice_rss_hash_set 函数为真正配置 rss hash 的函数,其关键代码如下:
....................................................................
/* Configure RSS for tcp4 with src/dst addr and port as input set */
if (rss_hf & ETH_RSS_NONFRAG_IPV4_TCP) {
cfg.addl_hdrs = ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_IPV4 |
ICE_FLOW_SEG_HDR_IPV_OTHER;
cfg.hash_flds = ICE_HASH_TCP_IPV4;
ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
if (ret)
PMD_DRV_LOG(ERR, "%s TCP_IPV4 rss flow fail %d",
__func__, ret);
}
/* Configure RSS for tcp6 with src/dst addr and port as input set */
if (rss_hf & ETH_RSS_NONFRAG_IPV6_TCP) {
cfg.addl_hdrs = ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_IPV6 |
ICE_FLOW_SEG_HDR_IPV_OTHER;
cfg.hash_flds = ICE_HASH_TCP_IPV6;
ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &cfg);
if (ret)
PMD_DRV_LOG(ERR, "%s TCP_IPV6 rss flow fail %d",
__func__, ret);
}
上述代码将非分片的 IPv4_TCP 报文的 hash 字段设置为 TCP header + ipv4 header + 其它 IP 包类型字段;非分片的 IPV6_TCP 报文的 hash 字段设置为 TCP header + ipv6 header + 其它 IP 包类型字段。
显然可以直接修改上述代码来定制非分片 tcp 报文的 hash 配置,但这种修改有些过于粗暴,更好的方式是通过修改 rss_hf 的值为 ETH_RSS_IPV4 | ETH_RSS_IPV6,在这种配置下 E810 网卡仅仅使用 3 层头来进行 hash,就不存在上述分片与非分片问题。
快速修改 dpdk 中的 ice_rss_hash_set 函数,让报文只通过 L3 的信息来 hash 进行测试,修改 patch 如下:
Index: drivers/net/ice/ice_ethdev.c
===================================================================
--- drivers/net/ice/ice_ethdev.c
+++ drivers/net/ice/ice_ethdev.c
@@ -2795,6 +2795,8 @@
ETH_RSS_NONFRAG_IPV6_TCP | \\
ETH_RSS_NONFRAG_IPV4_SCTP | \\
ETH_RSS_NONFRAG_IPV6_SCTP)
+
+ rss_hf = ETH_RSS_IPV4 | ETH_RSS_IPV6
测试验证通过,最终通过修改 rte_eth_dev_configure 函数中传递的 dev_conf 中的 rss_hf 配置为 ETH_RSS_IPV4 | ETH_RSS_IPV6来修复此问题。
从 E810 驱动实现中发现的问题
写到这里我发现其实分片的 tcp 报文就是普通的 ip 报文,对它进行 hash 是按照 IP 头部的信息进行的,而未分片的 TCP 报文才带有 TCP 头部,对这两种不同类型的包使用不同的字段进行 hash,hash 到不同的队列上属于正常的行为,这里的异常可能只在我们的使用场景中才会有吧。
边栏推荐
- When using jetty to run items, an error is reported: form too large or form too many keys
- 43 box model
- Nacos2.1.0 cluster construction
- System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏
- [C topic] the penultimate node in the Niuke linked list
- 二维数组赋初值你会几种方法?
- Number of high-quality number pairs [bit operation characteristics + abstract ability evaluation + grouping fast statistics]
- "Ask every day" how locksupport realizes thread waiting and wakeup
- [Nacos] what does nacosclient do during service registration
- Reprint ---- how to read the code?
猜你喜欢

Sudo rosdep init error ROS installation problem solution

Nacos2.1.0 cluster construction

06、类神经网络

44 Sina navigation, Xiaomi sidebar exercise
![[Nacos] what does nacosclient do during service registration](/img/76/3c2e8f9ba19e36d9581f34fda65923.png)
[Nacos] what does nacosclient do during service registration

Wechat official account official environment online deployment, third-party public platform access

LeetCode-198-打家劫舍

IP address classification, which determines whether a network segment is a subnet supernetwork

Niuke multi school E G J L

27 选择器的分类
随机推荐
Qt connect 中, SIGNAL,SLOT 与 lambda 对比
[Android] recyclerview caching mechanism, is it really difficult to understand? What level of cache is it?
QT connect, signal, slot and lambda comparison
sql to linq 之存储过程偏
awk从入门到入土(20)awk解析命令行参数
Ssh server rejected password
[C topic] Li Kou 206. reverse the linked list
pl/sql 创建并执行oralce存储过程,并返回结果集
[C topic] force buckle 876. Intermediate node of linked list
kibana操作es
37 元素模式(行内元素,块元素,行内块元素)
27 classification of selectors
Dpkg package download addresses of various platforms (including arm64)
51 single chip microcomputer learning notes (2)
Award winning interaction | 7.19 database upgrade plan practical Summit: industry leaders gather, why do they come?
How to use the random number function of JMeter
冈萨雷斯 数字图像处理 第一章绪论
[C topic] the penultimate node in the Niuke linked list
Kibana operation es
51 single chip microcomputer learning notes (1)