这个月,一直在搞ixgbe RSS,希望能使得收包均衡,结果没成功,但是对网卡的收包原理理解得更深入些。

1、网卡硬件通过网线或者光纤收包。

2、网卡的RSS功能根据网络五元组计算得到32bit的hash值,

根据hash值的低7位(0-127)与网卡queue的映射关系,

  把收到的数据包放到某个queue上。

3、做了cpu亲和性绑定时,一个queue上的数据包就由对应的一个core来处理。

reta寄存器负责为hash值的低7位和网卡queue建立映射关系,ixge驱动默认的映射关系是比较均衡的。

以12个队列为例,映射关系如下图:

ixgbe RSS原理分析-LMLPHP

现在线上机器遇到的问题是:由于haproxy在局域网机器之间数据交换量大,导致某几个

五元组比较集中,进而导致hash值的低7位比较集中,最后导致queue比较集中,对应的core负载也大

如下图所示。

ixgbe RSS原理分析-LMLPHP

我想到了两种办法来避免core使用率高。

方法一、采用round-robin策略,周期性修改reta寄存器,第一次是[0-11],第二次是[1-11,0],

第三次是[2-11,0,1]以此类推,这样每个队列收包看起来就比较均衡了,但没有改变core使用率。

方法二、产生随机值,根据收包多少来决定权重,最后根据权重来产生queue编号,

这样使得收包少的queue要多,收包多的queue要少。

不过,实际测试这两种方法都没有效果,想不通了,真的想不通了。

05-12 04:04