31.6. 接收流 Steering
接收流 Steering (RFS)扩展 Receive Packet Steering (RPS)行为以增加 CPU 缓存命中率,从而减少网络延迟。其中 RPS 仅根据队列长度转发数据包,RFS 使用 RPS 后端来计算最合适的 CPU,然后根据占用数据包的应用程序的位置转发数据包。这会增加 CPU 缓存效率。
从单一发送方接收的数据不会发送到多个 CPU。如果从单一发送方接收的数据量大于单个 CPU 可以处理,请配置更大的帧大小来减少中断数量,从而处理 CPU 的处理量。或者,考虑 NIC 卸载选项或更快速的 CPU。
考虑将 numactl
或 taskset
与 RFS 结合使用,以将应用程序固定到特定的内核、插槽或 NUMA 节点。这可帮助防止数据包没有按顺序处理。
31.6.1. 启用 Receive Flow Steering
默认情况下,Receive Flow Steering (RFS)被禁用。这个步骤描述了如何启用 RFS。
流程
将
net.core.rps_sock_flow_entries
内核值设置为并发活跃连接的最大数量:# echo "net.core.rps_sock_flow_entries=32768" > /etc/sysctl.d/95-enable-rps.conf
注意红帽建议在服务器负载中取
32768
。在实践中,输入的所有值都向上舍入为与2
的指数最接近的值。永久设置
net.core.rps_sock_flow_entries
的值:# sysctl -p /etc/sysctl.d/95-enable-rps.conf
要临时将
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
的值相同。在所有网络设备中永久启用 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'"
可选:在特定网络设备中启用 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