31.5. 接收数据包稳定性

接收数据包分析 (RPS) 与接收扩展 (RSS) 类似,用于将数据包定向到特定的 CPU 进行处理。但是,RPS 在软件级别实施,有助于防止单一网络接口卡的硬件队列成为网络流量的瓶颈。默认情况下禁用 RPS。

RPS 与基于硬件的 RSS 相比有几种优点:

  • RPS 可以与任何网卡一起使用。
  • 将软件过滤器添加到 RPS 以处理新协议很容易。
  • RPS 不会增加网络设备的硬件中断率。但是,它会引入交集中断。

RPS 会针对每个网络设备和接收队列进行配置,位于 /sys/class/net/device/queues/rx-queue/rps_cpus 文件中,其中 device 是网络设备的名称,如 enp1s0 和 rx-queue 是适当的接收队列的名称,如 rx-0。

rps_cpus 文件的默认值为 0。这可禁用 RPS,而 CPU 处理网络中断并同时处理数据包。要启用 RPS,请配置适当的 rps_cpus 文件,并带有应处理指定网络设备的数据包和接收队列的 CPU。

rps_cpus 文件使用以逗号分隔的 CPU 位映射。因此,为了允许 CPU 处理接口上接收队列的中断,请将 位映射中的位置值设置为 1。例如,要处理 CPU 0123 的中断,请将 rps_cpus 的值设置为 f,这是 15 的十六进制值。在二进制表示中,1500001111 (1+2+4+8)

对于具有单一传输队列的网络设备,可通过将 RPS 配置为在同一内存域中使用 CPU 来实现最佳性能。在非 NUMA 系统中,这意味着可以使用所有可用的 CPU。如果网络中断率非常高,除了处理网络中断的 CPU 也可能会提高性能。

对于具有多个队列的网络设备,通常不会同时配置 RPS 和 RSS,因为将 CPU 配置为默认将 CPU 映射到每个接收队列。但是,如果硬件队列数量少于 CPU,RPS 仍很有用,而 RPS 被配置为在同一内存域中使用 CPU。