今天遇到一个很有趣的问题,dpdk网卡绑定了两个core,同一个会话(TCP连接)的数据包,不同方向的两边报文被分配到了两个不同的core上处理,导致绑定在core上下文中的信息直接是获取不到,查找了相关的资料,才找到了相关的原因和解决方法。
负载均衡是多队列网卡中最常见的应用,其含义就是讲负载均衡分摊到多个执行单元上。首先需要先了解什么事RSS。RSS(Receive-Side-Scaling,接收方扩展),他是和硬件相关联的,必须要有网卡硬件进行支持,RSS把数据包分配到不同的队列中,其中的哈希值的计算公式直接是在硬件中完成的,也是可以定制修改的。RSS就是一种网卡驱动的技术, 通过RSS我们可以将多核处理系统中跨越多个处理器(core)的网络收包能力高效的分配。
DPDK由于天然的支持队列网卡,也可以很简便的将接收与发送的队列指定给某一应用,同时,DPDK的轮询模式的驱动也提供了配置RSS的接口。
RSS算法通常使用Toeplitz哈希函数
,此函数需要两个输入:静态哈希密钥和从数据包中提取的元组。问题在于,DPDK中使用的默认哈希密钥(也是Microsoft推荐的密钥)不会将对称流分配给同一CPU。
{srcip=1.1.1.1 distip=2.2.2.2 srcport=1111 distport=2222 }
{srcip=2.2.2.2 distip=1.1.1.1 srcport=2222 distport=1111 }
上面的数据包处于同一个TCP连接,但是经过hash之后不一定得到一样的hash结果,对于这种情况我们可以通过更改hash键来实现对称
RSS。
1 | static uint8_t hash_key [RSS_HASH_KEY_LENGTH] = |