31.6. 接收流 Steering

接收流 Steering (RFS)扩展 Receive Packet Steering (RPS)行为以增加 CPU 缓存命中率,从而减少网络延迟。其中 RPS 仅根据队列长度转发数据包,RFS 使用 RPS 后端来计算最合适的 CPU,然后根据占用数据包的应用程序的位置转发数据包。这会增加 CPU 缓存效率。

从单一发送方接收的数据不会发送到多个 CPU。如果从单一发送方接收的数据量大于单个 CPU 可以处理,请配置更大的帧大小来减少中断数量,从而处理 CPU 的处理量。或者,考虑 NIC 卸载选项或更快速的 CPU。

考虑将 numactltaskset 与 RFS 结合使用,以将应用程序固定到特定的内核、插槽或 NUMA 节点。这可帮助防止数据包没有按顺序处理。

31.6.1. 启用 Receive Flow Steering

默认情况下,Receive Flow Steering (RFS)被禁用。这个步骤描述了如何启用 RFS。

流程

  1. net.core.rps_sock_flow_entries 内核值设置为并发活跃连接的最大数量:

    # echo "net.core.rps_sock_flow_entries=32768" > /etc/sysctl.d/95-enable-rps.conf
    注意

    红帽建议在服务器负载中取 32768。在实践中,输入的所有值都向上舍入为与 2 的指数最接近的值。

  2. 永久设置 net.core.rps_sock_flow_entries 的值:

    # sysctl -p /etc/sysctl.d/95-enable-rps.conf
  3. 要临时将 sys/class/net/device/queues/rx-queue/rps_flow_cnt 文件的值设置为 rps_sock_flow_entries/N 值,其中 N 是设备上接收队列的数量:

    # echo 2048 > /sys/class/net/device/queues/rx-queue/rps_flow_cnt

    使用您要配置的网络设备的名称替换 device (如 enp1s0),并将 rx-queue 替换为您要配置的接收队列(如 rx-0)。

    N 替换为配置的接收队列的数量。例如,如果 rps_flow_entries 设为 32768,并且有 16 个配置的接收队列,则 rps_flow_cnt = 32786/16= 2048(即 rps_flow_cnt = rps_flow_enties/N)。

    对于单队列设备,rps_flow_cnt 的值与 rps_sock_flow_entries 的值相同。

  4. 在所有网络设备中永久启用 RFS,创建 /etc/udev/rules.d/99-persistent-net.rules 文件,并添加以下内容:

    SUBSYSTEM=="net", ACTION=="add", RUN{program}+="/bin/bash -c 'for x in /sys/$DEVPATH/queues/rx-*; do echo 2048 > $x/rps_flow_cnt;  done'"
  5. 可选:在特定网络设备中启用 RPS:

    SUBSYSTEM=="net", ACTION=="move", NAME="device name" RUN{program}+="/bin/bash -c 'for x in /sys/$DEVPATH/queues/rx-*; do echo 2048 > $x/rps_flow_cnt; done'"

    使用实际网络设备名称替换 device name

验证步骤

  • 验证是否启用了 RFS:

    # cat /proc/sys/net/core/rps_sock_flow_entries
    32768
    
    # cat /sys/class/net/device/queues/rx-queue/rps_flow_cnt
    2048

其他资源

  • sysctl(8) man page