背景
在CPU单核时代,数据包经由网卡接收后均被送往唯一的CPU进行处理。随着多核时代到来,出现了负载均衡问题(某些core过载,而另一些core空载的情况)。为解决该问题,RSS(Receive Side Scaling)技术先通过hash操作将数据包发送到不同的core上进行中断处理,然后再经由core间转发将数据包发送到运行目的应用所在的core上。虽然负载看似在多core上均衡了,但由于hash的抗碰撞特性,大量数据包会被送到了不匹配的core上,因而数据包的core间转发成为性能瓶颈。
RSS通过计算包的五元组(sip、sport、dip、dport、protocol)的hash并取余,得到队列的index,然后将包放入这个队列,实现了数据包在各个队列之间的负载均衡,不过RSS不能保证回包也落在同一个队列上;
对称hash(symmetric hash: sip/sport和dip/dport交换后hash不变)可以部分解决该问题,但是对于一些需要做NAT的设备(比如负载均衡)就失效了,FDIR可以完全解决该问题。
Intel® 以太网Flow Director技术(Intel® Ethernet Flow Director,简称FDIR)将数据包定向发送到对应应用所在core上,从而弥补了RSS的不足,可用来加速数据包到目的应用处理的过程。
FDIR(Flow Director)的优先级高于RSS(Receive Side Scaling)
FDIR模式缺陷
FDIR模式
我的理解:
感觉 perfect mode,就是收到的报文的字段和配置的规则是完全匹配的。
signature mode,就是收到的报文的字段的hash 和 配置字段的 hash 是匹配的。
signature mode的优点是节省空间,不需要存储各个field,但是模糊匹配,不精确。
DPDK中FDIR相关测试:
https://doc.dpdk.org/dts/test_plans/fdir_test_plan.html
fdir容量限制
- intel 82599 datasheet 对于FDIR支持
参考:intel 82599 datasheet
我的理解:
fdir 规则 和 网卡的收包缓冲区共享内存,共享内存的大小为 512K。
fdir 匹配的字段:sip、dip、ip proto、sport、dport;
fdir 规则,不可作用于 非 ip包,隧道包的内层,分片包;因为没有上诉的某个字段。
- 82599 匹配FDIR的原理
1> 过滤单元从来包中提取 相关元组(基于设置的fdir filter rule来提取元组)
2> 根据提取出的元组进行hash
3> 在hash 桶中查找,直到查找到,或者查找不到。
4> 查找到:
更新 fdir match 统计计数;
执行fdir filter rule动作(比如放入到指定的队列中)
注:fdir的优先级要低于 L2 filter/syn filter/5-tuple filter。
比如:非ip包的filter、tcp syn的filter 等优先于 fdir;
5> 查找不到;
更新 fdir dismatch 统计计数。
- testpmd中FDIR设置
–pkt-filter-size 其实就是 fdir_conf.pballoc :
设置的是 存放fdir filter的大小,目前看只有三种规格,64K,128K,256K;一般而言,默认是64K。
- DPVS中FDIR应用
对于DPVS而言:
fdir_conf.pballoc 默认 64K,可以支持 2K个 perfect 模式的 filter 规则。
实际上