rps 是 linux 系统中用于将网络数据包分发到多个 cpu 处理的软件负载均衡机制,其核心是通过配置 /sys/class/net/

Linux 系统中,网络接口的 RPS(Receive Packet Steering)是一种软件层面的负载均衡机制,用于将接收的数据包在多个 CPU 核心之间进行分发处理。相比硬件层面的 RSS,RPS 是在内核协议栈中实现的,适用于普通网卡也能提升多核处理性能。

要让 RPS 发挥作用,关键在于合理配置其映射规则,使得软中断处理能均匀地分布到多个 CPU 上,从而提高整体网络吞吐能力并降低延迟。

什么是 RPS?
RPS 的核心思想是通过软件方式决定哪个 CPU 来处理某个队列上的数据包。默认情况下,一个网卡队列的数据包只由一个 CPU 处理,这样在高流量下容易造成单核过载。
启用 RPS 后,可以指定一组 CPU 来参与该队列的软中断处理,实现负载分担。
它的工作原理是在 /sys/class/net/ 文件中设置掩码,告诉内核哪些 CPU 可以处理这个队列的软中断。

如何查看当前网络接口队列数量?
在开始配置之前,先确认你的网卡支持多少个接收队列:
ls /sys/class/net//queues/ | grep rx-
比如 rx-0, rx-1, … 表示有两个或更多接收队列。每个队列都可以单独配置 RPS。
你也可以使用 ethtool -l 查看网卡的中断队列信息:
ethtool -l eth0
输出会显示当前驱动支持的最大队列数以及当前使用的队列数。
如何手动配置 RPS?
配置 RPS 主要是修改每个接收队列目录下的 rps_cpus 文件,写入 CPU 掩码。例如:
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus
这里的 f 是十六进制表示法,对应二进制 00001111,即允许 CPU 0~3 处理这个队列的软中断。
常见掩码对照表如下:
| 十六进制 | 允许的 CPU(从右往左) |
|---|---|
| 1 | CPU0 |
| 3 | CPU0, CPU1 |
| f | CPU0~3 |
| ff | CPU0~7 |
| ffff | CPU0~15 |
你可以根据服务器 CPU 数量和负载情况灵活设置。如果系统有 8 个 CPU,想让所有 CPU 都参与处理,就可以用 ff。
如何自动配置 RPS(适合重启后生效)?
每次重启之后这些配置都会失效,所以建议写成脚本或者通过 systemd 服务来加载。
一种简单的方式是写个 shell 脚本放在 /etc/rc.local 或者作为启动服务运行:
#!/bin/bash
IFACE="eth0"
for queue in $(ls /sys/class/net/$IFACE/queues/ | grep rx-); do
echo ff > /sys/class/net/$IFACE/queues/$queue/rps_cpus
done注意:确保文件系统挂载完成后再执行这个脚本,否则路径可能不存在。
另外,也可以结合 udev 规则,在网卡加载时自动应用配置。
一些实用建议
- CPU 绑定策略:尽量避免和其他高性能服务(如 DPDK、Nginx、数据库等)争抢同一个 CPU。
-
测试与监控:配置完成后可以用
top、mpstat或sar监控 CPU 使用率,观察是否实现了负载均衡。 - RFS 和 XPS 搭配使用效果更好:如果你还启用了 RFS(Receive Flow Steering),可以进一步优化流级别的负载均衡;XPS 则有助于控制发送方向的 CPU 分配。
- 不要过度分配 CPU:虽然看起来把所有 CPU 都加进去更“公平”,但上下文切换也会带来额外开销,建议根据实际流量调整。
基本上就这些。配置 RPS 不复杂,但细节上需要注意掩码格式、队列数量和 CPU 资源的平衡。只要设置得当,就能有效提升多核系统的网络处理性能。










