DPDK-RSS负载均衡分流

RSS的作用

RSS是网卡提供的分流机制。用来将报表分流到不同的收包队列,以提高收包性能。
RSS及Flow Director都是靠网卡上的资源来达到分类的目的,所以在初始化配置网卡时,我们需要传递相应的配置信息去使能网卡的RSS及Flow Director功能。
RSS(receive side scaling)是由微软提出的一种负载分流方法,通过计算网络数据报文中的网络层&传输层二/三/四元组HASH值,取HASH值的最低有效位(LSB)用于索引间接寻址表RETA(Redirection Table),间接寻址表RETA中的保存索引值用于分配数据报文到不同的CPU接收处理。现阶段RSS基本已有硬件实现,通过这项技术能够将网络流量分载到多个CPU上,降低操作系统单个CPU的占用率。

  • 没有开启 rss负载分流情况下:

    • 所有报文只会从一个硬件队列来收包。
  • 开启 rss进行负载分流情况下:

    • rss 会解释报文的 l3 层信息:ip 地址。甚至 l4 层信息:tcp/udp 端口。
    • 报文会经过 hash function 计算出一个 uint32_t 的 rss hash。填充到 struct rte_mbuf 的 hash.rss字段中。
    • rss hash 的 低7位 会映射到 4位长 的 RSS output index。
    • 无法解释的 报文,rss hash 和 RSS output index 设置为 0。

在这里插入图片描述

RSS配置的数据结构

在这里插入图片描述

其中rss_key 字段:rss_key 数组。如果 为 NULL,留给网卡设置 rss_key。
rss_key_len:rss_key数组的字节数。
rss_hf:需要对报文的分析的元组类型。常用的组合有 l3: ETH_RSS_IP, l3+l4: ETH_RSS_IP | ETH_RSS_UDP | ETH_RSS_TCP。

RSS在port_init的配置


// 端口的配置信息
	struct rte_eth_conf port_conf =
	{
#if 1
		.rxmode = {
		//.split_hdr_size = 0,
		.mq_mode = ETH_MQ_RX_RSS,	// 使用RSS分流
		},
		.rx_adv_conf = {
			.rss_conf = {
				.rss_key = NULL,		// 留给网卡设置 rss_key	
				// .rss_key_len = 0,		// rss_key数组的字节数
				.rss_hf = ETH_RSS_IP	// 通过l3层 tuple计算rss hash
						| ETH_RSS_UDP	// 通过l4层 UDP tuple计算rss hash
						| ETH_RSS_TCP,
						// | ETH_RSS_SCTP,	// 通过l4层 TCP tuple计算rss hash
				// .rss_hf  = ETH_RSS_IP ,	// l3层tuple计算rss hash
			},
		},
#endif
#if 0		
			.fdir_conf = {
			.mode = RTE_FDIR_MODE_PERFECT,
			.pballoc = RTE_FDIR_PBALLOC_64K,
			.status = RTE_FDIR_REPORT_STATUS,
			.drop_queue = 127,
			.mask = {
				.vlan_tci_mask = 0x0,
				.ipv4_mask = {
					.src_ip = 0xFFFFFFFF,
					.dst_ip = 0xFFFFFFFF,
				},
				.src_port_mask = 0xFFFF,
				.dst_port_mask = 0xFF00,

				.mac_addr_byte_mask = 0xFF,
				.tunnel_type_mask = 1,
				.tunnel_id_mask = 0xFFFFFFFF,

			},
			.drop_queue = 127,
		},
#endif

#if 0
		.txmode = {
			.offloads =
				DEV_TX_OFFLOAD_VLAN_INSERT |
				DEV_TX_OFFLOAD_IPV4_CKSUM |
				DEV_TX_OFFLOAD_UDP_CKSUM |
				DEV_TX_OFFLOAD_TCP_CKSUM |
				DEV_TX_OFFLOAD_SCTP_CKSUM |
				DEV_TX_OFFLOAD_TCP_TSO,
		},
#endif
	};

将 rss_key 字段设置为 NULL, 留给 网卡设置 rss key。
因为不同的驱动,rss key 有可能设置为对称,也有可能设置为非对称的。所以不同驱动网卡的分流效果,将无法预测。

当使用发包机来测试的时候,如果发包机产出的报文的元组信息过于有规律,而网卡使用了对称的 rss_key,(此时 rss_hf 设置为 ETH_RSS_IP)将会很大可能分流到相同的硬件收包队列,从而影响性能。
一旦发现分流效果不好。则可以 使用非对称的 rss_key,并且将 rss_hf 设置为 ETH_RSS_IP | ETH_RSS_UDP | ETH_RSS_TCP。

rss_key条件

对称rss_key条件下,一共四个队列,结果rss通过hash之后分流到其中两个队列 0和3,分流效果不好(相同的IP在同一个队列)。
非对称rss_key条件下,rss通过通过hash之后分流到四个队列,分流效果均衡(相同的IP分到不同的队列)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值