一、概述
RSS和RPS都是网卡为了在接受数据包的时候使用多核架构而进行的性能增强,RSS是在硬件层面而RPS在软件层面。在数据包接收到之后在用户态的处理逻辑怎么处理,应用层的响应数据包如何发送都会影响系统性能,RFS(Receive Flow Steering)和XPS(Transmit Packet Steering)这两个机制就是为了解决这两个问题而产生的。
二、网卡处理的基本概念
2.1 硬中断(Hardware Interrupt)
硬件设备产生输入核输出事件的时候,会向CPU发送信号,这个信号就是硬中断。CPU在接收到硬中断之后,会停止现在的工作,以最高优先级处理这个硬件中断事件。
2.2 软中断(SoftIRQ)
软中断与硬中断在机制上类似只是优先级稍微低一点。在网卡传输数据的过程中,典型的过程是数据到达网卡,网卡通过DMA将数据拷贝到为网卡驱动指定的内存区域,产生硬中断,然后CPU需要自己负责处理中断,将网卡的数据拷贝到内核指定区域,进行TCP/IP协议栈的处理,再通知应用层并将数据拷贝的应用层。在这种情况下,如果一旦一个硬中断来了之后,CPU一直忙碌于处理网卡的这个请求和服务上层应用,那网卡后续数据到来产生的硬中断也会被延后处理,而且其它设备和进程也无法使用这个CPU资源,造成CPU饥饿状态。所以在处理设备硬中断的时候,将整个过程分成两个阶段;第一阶段,CPU只是使用ISR简单而快速响应硬中断,产生一个软中断,然后CPU可以继续进行后续调度处理而网卡可以继续收发数据;第二阶段,CPU会根据scheduler对一系列软中断按照优先级进行排队处理,将数据包移动到TCP/IP协议栈和后续应用程序。
2.3 接收队列
网卡驱动通过DMA将接收到的数据会拷贝到socket buffer并由一个socket descriptor进行标记,所有待处理的数据包的socket descriptor将被存储在接收队列里面,如果有多个接收队列,则网卡会将packet按照某个算法匹配到一个接收队列上。现在的许多网卡都是通过一种叫RSS(Receive Side Scaling)的技术(将数据包的处理任务分配到多个CPU)在硬件上支持Rx多队列的。
三、RSS(Receive Side Scaling)
Contemporary NICs support multiple receive and transmit descriptor queues (multi-queue). On reception, a NIC can send different packets to different
queues to distribute processing among CPUs. The NIC distributes packets by applying a filter to each packet that assigns it to one of a small number
of logical flows. Packets for each flow are steered to a separate receive queue, which in turn can be processed by separate CPUs. This mechanism is
generally known as RSS.
当数据包到达NIC之后,将被放到接收队列;在网卡驱动初始化阶段,接收队列会被赋予一个IRQ号,并且会分配一个CPU来处理这个IRQ,这个CPU需要执行这个IRQ的ISR并且在一般情况下还要负责执行后续的数据包在内核阶段的处理。在单核系统中,这是一个很好的工作模型,但是在多核系统中,这种方式在大流量的时候无法发挥多核的作用,只能使用一个内核,进行耗时的TCP/IP协议栈的处理。
所以在现在的NIC中,多数都支持RSS的功能,启用这种功能之后,网卡会有多个接收和发送队列,这些队列对被分配不同的CPU进行处理。
RSS为网卡数据传输使用多核提供了支持,RSS在硬件/驱动级别实现多队列并且使用一个hash函数对数据包进行多队列分离处理,这个hash根据源IP、目的IP、源端口和目的端口进行数据包分布选择,这样同一数据流的数据包会被放置到同一个队列进行处理并且能一定程度上保证数据处理的均衡性。
四、RPS(Receive Packet Steering)
Receive Packet Steering (RPS) is logically a software implementation of RSS.
RPS requires a kernel compiled with the CONFIG_RPS kconfig symbol (on by default for SMP). Even when compiled in, RPS remains disabled until
explicitly configured. The list of CPUs to which RPS may forward traffic can be configured for each receive queue using a sysfs file entry:
/sys/class/net/ /queues/rx- /rps_cpus
RPS是和RSS类似的一个技术,区别在于RSS是网的硬件实现而RPS是内核软件实现。RPS帮助单队列网卡将其产生的SoftIRQ分派到多个CPU内核进行处理。在这个方案中,为网卡单队列分配的CPU只处理所有硬件中断,由于硬件中断的快速高效,即使在同一个CPU进行处理,影响也是有限的,而耗时的软中断处理会被分派到不同CPU进行处理,可以有效的避免处理瓶颈。
五、RFS(Receive Flow Steering)
While RPS steers packets solely based on hash, and thus generally provides good load distribution, it does not take into account
application locality. This is accomplished by Receive Flow Steering (RFS).
RFS is only available if the kconfig symbol CONFIG_RPS is enabled (on by default for SMP). The functionality remains disabled until explicitly
configured. The number of entries in the global flow table is set through:
/proc/sys/net/core/rps_sock_flow_entries
The number of entries in the per-queue flow table are set through:
/sys/class/net/ /queues/rx- /rps_flow_cnt
在使用RPS接收数据包之后,会在指定的CPU进行软中断处理,之后就会在用户态进行处理;如果用户态处理的CPU不在软中断处理的CPU,则会造成CPU cache miss,造成很大的性能影响。RFS能够保证处理软中断和处理应用程序是同一个CPU,这样会保证local cache hit,提升处理效率。RFS需要和RPS一起配合使用。
六、XPS(Transmit Packet Steering)
Transmit Packet Steering is a mechanism for intelligently selecting which transmit queue to use when transmitting a packet on a multi-queue
device.
XPS is only available if the kconfig symbol CONFIG_XPS is enabled (on by default for SMP). The functionality remains disabled until explicitly
configured. To enable XPS, the bitmap of CPUs/receive-queues that may use a transmit queue is configured using the sysfs file entry:
For selection based on CPUs map:
/sys/class/net/ /queues/tx- /xps_cpus
For selection based on receive-queues map:
/sys/class/net/ /queues/tx- /xps_rxqs
XPS通过创建CPU到网卡发送队列的对应关系,来保证处理发送软中断请求的CPU和向外发送数据包的CPU是同一个CPU,用来保证发送数据包时候的局部性。
总结
RSS(Receive Side Scaling):网卡多队列,需要硬件支持。网卡接收到网络数据包之后,要发送一个硬件中断,通知CPU取数据包。默认配置,都是由CPU0去做。
RPS(Receive Packet Steering):向某CPU发送一个软中断,来接收数据包,并递交给应用程序。
RFS(Receive Flow Steering):维护两张hash表,实现将软中断分散到多颗CPU去处理。
XPS(Transmit Packet Steering):创建CPU到网卡发送队列的对应关系,主要是为了避免cpu由RX队列的中断进入到TX队列的中断时发生切换,导致cpu cache失效损失性能。