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 拓扑不匹配,应恢复原值
- 验证通过的配置写入服务器基线文档,供同型号机器复用