一、前言

在测试基于Openshift的负载均衡器的时候,需要进行性能测试,所要要对系统进行一些性能调优,保证每个工作节点能处理巨大的数据流量,其中最重要的调整是对NIC的调整。

在对NIC进行调整的时候,发现RSS(receive side scaling)和RPS(Receive Packet Steering)是两个需要关注的点。RSS和RPS都是网卡为了在接受数据包的时候使用多核架构而进行的性能增强,RSS是在硬件层面而RPS在软件层面。在数据包接收到之后在用户态的处理逻辑怎么处理,应用层的响应数据包如何发送都会影响系统性能,RFS(Receive Flow Steering)和XPS(Transmit Packet Steering)这两个机制就是为了解决这两个问题而产生的。

这四个功能在这个kernel文档里面进行了全面的描述:

https://www.kernel.org/doc/Documentation/networking/scaling.txt

转载自https://blog.csdn.net/cloudvtech

二、网卡处理的基本概念

2.1 硬中断(Hardware Interrupt)

硬件设备产生输入核输出事件的时候,会向CPU发送信号,这个信号就是硬中断。CPU在接收到硬中断之后,会停止现在的工作,以最高优先级处理这个硬件中断事件。

2.2 软中断(SoftIRQ)

软中断与硬中断在机制上类似只是优先级稍微低一点。在网卡传输数据的过程中,典型的过程是数据到达网卡,网卡通过DMA将数据拷贝到为网卡驱动指定的内存区域,产生硬中断,然后CPU需要自己负责处理中断,将网卡的数据拷贝到内核指定区域,进行TCP/IP协议栈的处理,再通知应用层并将数据拷贝的应用层。在这种情况下,如果一旦一个硬中断来了之后,CPU一直忙碌于处理网卡的这个请求和服务上层应用,那网卡后续数据到来产生的硬中断也会被延后处理,而且其它设备和进程也无法使用这个CPU资源,造成CPU饥饿状态。所以在处理设备硬中断的时候,将整个过程分成两个阶段;第一阶段,CPU只是使用ISR简单而快速响应硬中断,产生一个软中断,然后CPU可以继续进行后续调度处理而网卡可以继续收发数据;第二阶段,CPU会根据scheduler对一系列软中断按照优先级进行排队处理,将数据包移动到TCP/IP协议栈和后续应用程序。


2.4 接收队列

网卡驱动通过DMA将接收到的数据会拷贝到socket buffer并由一个socket descriptor进行标记,所有待处理的数据包的socket descriptor将被存储在接收队列里面,如果有多个接收队列,则网卡会将packet按照某个算法匹配到一个接收队列上。现在的许多网卡都是通过一种叫RSS(Receive Side Scaling)的技术(将数据包的处理任务分配到多个CPU)在硬件上支持Rx多队列的。

转载自https://blog.csdn.net/cloudvtech

三、RSS(Receive Side Scaling)

当数据包到达NIC之后,将被放到接收队列;在网卡驱动初始化阶段,接收队列会被赋予一个IRQ号,并且会分配一个CPU来处理这个IRQ,这个CPU需要执行这个IRQ的ISR并且在一般情况下还要负责执行后续的数据包在内核阶段的处理。在单核系统中,这是一个很好的工作模型,但是在多核系统中,这种方式在大流量的时候无法发挥多核的作用,只能使用一个内核,进行耗时的TCP/IP协议栈的处理。

所以在现在的NIC中,多数都支持RSS的功能,启用这种功能之后,网卡会有多个接收和发送队列,这些队列对被分配不同的CPU进行处理。一些是我们的测试机器上支持RSS的网卡的一些设置:



配置8个Tx Queue和8个Rx Queue之后的IRQ分布:


RSS为网卡数据传输使用多核提供了支持,RSS在硬件/驱动级别实现多队列并且使用一个hash函数对数据包进行多队列分离处理,这个hash根据源IP、目的IP、源端口和目的端口进行数据包分布选择,这样同一数据流的数据包会被放置到同一个队列进行处理并且能一定程度上保证数据处理的均衡性。


转载自https://blog.csdn.net/cloudvtech


四、RPS(Receive Packet Steering)

RPS是和RSS类似的一个技术,区别在于RSS是网的硬件实现而RPS是内核软件实现。RPS帮助单队列网卡将其产生的SoftIRQ分派到多个CPU内核进行处理。在这个方案中,为网卡单队列分配的CPU只处理所有硬件中断,由于硬件中断的快速高效,即使在同一个CPU进行处理,影响也是有限的,而耗时的软中断处理会被分派到不同CPU进行处理,可以有效的避免处理瓶颈。



转载自https://blog.csdn.net/cloudvtech

五、RFS(Receive Flow Steering)

在使用RPS接收数据包之后,会在指定的CPU进行软中断处理,之后就会在用户态进行处理;如果用户态处理的CPU不在软中断处理的CPU,则会造成CPU cache miss,造成很大的性能影响。RFS能够保证处理软中断和处理应用程序是同一个CPU,这样会保证local cache hit,提升处理效率。RFS需要和RPS一起配合使用。

转载自https://blog.csdn.net/cloudvtech

六、XPS(Transmit Packet Steering)

XPS通过创建CPU到网卡发送队列的对应关系,来保证处理发送软中断请求的CPU和向外发送数据包的CPU是同一个CPU,用来保证发送数据包时候的局部性。

转载自https://blog.csdn.net/cloudvtech

七、配置RSS进行性能测试

配置8个Tx Queue和8个Rx Queue之后,在进行性能测试的时候的CPU使用状态如下:



转载自https://blog.csdn.net/cloudvtech




Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐