网络栈调优98 条

XPS 发送队列绑定

XPS 把发送队列绑定到指定 CPU, 减少跨核发送时的队列竞争, 常与 CPU 亲和及中断布局一起规划。

XPS 是什么

XPS(Transmit Packet Steering)把发送队列绑定到指定 CPU,让某个核发出的流量固定走某几个队列,从而减少多核并发发送时的队列锁竞争与缓存失效。它只在多发送队列的网卡上有意义,配置粒度是每个 tx-* 队列对应一张 CPU 位图。XPS 管的是发送方向,和收包方向的 RPS、RFS 不是一回事。

基本信息

查看队列ls /sys/class/net/eth0/queues/ | grep tx
设置命令echo <位图> > /sys/class/net/eth0/queues/tx-0/xps_cpus
位图格式十六进制,例如 4 表示仅 CPU2
前提条件网卡具备多个发送队列
配套规划中断亲和与应用 CPU 布局需要一起考虑

典型使用场景

  • 多进程网关同时发送,发送路径存在明显的跨核竞争
  • 同一 NUMA 节点内规划发送路径,减少跨节点内存访问
  • 高 PPS 场景下把发送队列与中断、应用线程成组规划
  • 验证网卡是否真正暴露了多发送队列
  • 与中断亲和配置一并纳入服务器基线

查看与设置

查看与设置
ls /sys/class/net/eth0/queues/ | grep tx          # 确认存在多少个发送队列
cat /sys/class/net/eth0/queues/tx-0/xps_cpus      # 查看当前绑定
cat /sys/class/net/eth0/queues/rx-0/rps_cpus      # 对照收包方向的 RPS 设置
echo 4 > /sys/class/net/eth0/queues/tx-0/xps_cpus # 把 tx-0 绑定到 CPU2

三个方向别记混

机制方向绑定对象
RPS收包接收队列与参与处理的 CPU 位图
RFS收包流与应用线程所在 CPU 的对应关系
XPS发送发送队列与所属 CPU 位图
只有多发送队列的网卡才会出现多个 tx-* 目录;容器与部分虚拟网卡不暴露该接口,配置前先用 ls 确认路径存在。
单流发送为主的业务收益有限:流量本来就集中在一个发送路径上,绑定不会带来额外并行度,先做压测确认再批量下发。

验证与回退

  • 先核对绑定是否符合规划:逐个 cat queues/tx-*/xps_cpus
  • 用同一压测对比绑定前后的发送吞吐与各 CPU 利用率
  • 吞吐下降说明绑定与 CPU 拓扑不匹配,应恢复原值
  • 验证通过的配置写入服务器基线文档,供同型号机器复用

易错点

  • 把收包方向的 RPS 与发送方向的 XPS 绑定关系记反,配置后指标反而变差
  • 单流发送为主的场景未评估收益就全面绑定,只增加了配置复杂度
  • 位图写成十进制或数值超出 CPU 范围,导致绑定不生效或报错
  • 只改 XPS 不同步调整中断亲和与应用 CPU 布局,队列绑定后仍存在跨核竞争

数据来源与参考

  • Linux Documentation/networking/scaling.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌