华为云鲲鹏ECS网卡多队列与RSS调优:解决高并发下CPU软中断打满问题
前段时间把一个API网关服务迁到华为云鲲鹏通用计算型 kc1 实例(8核16G),压测时发现一个诡异现象:QPS上到3万左右就上不去了,top一看,8个核里有两三个核的si(软中断)占用飙到80%以上,而其他核却很闲。典型的网卡中断分配不均问题,在ARM架构上尤其明显。
一、 定位:中断都堆在CPU0上
bash
cat /proc/interrupts | grep -i eth
输出显示,网卡eth0的大部分队列中断都绑定在CPU0和CPU1上,CPU2-7几乎不参与网络包处理。鲲鹏920支持多队列网卡,但默认的IRQ亲和性策略在云环境下未必最优。
二、 调优三步走
1. 开启网卡多队列并确认队列数
bash
ethtool -l eth0
# 如果Combined显示为1,需要先开启多队列
ethtool -L eth0 combined 8
华为云超高IO/通用型实例的网卡一般支持8队列,确认开启后,中断会分散到多个CPU。
2. 用 irqbalance 做动态均衡,再手动兜底
安装并启动irqbalance,它会根据负载动态迁移中断。但在高并发稳态下,动态迁移反而带来缓存失效,所以我们最终采用手动绑核:把8个网卡队列的中断号分别绑定到CPU0-7,每个核处理一个队列。
bash
# 查看eth0各队列的中断号
grep eth0 /proc/interrupts
# 假设队列0-7的中断号为 120-127,逐一绑定
for i in {0..7}; do
echo $i > /proc/irq/$((120+i))/smp_affinity_list
done
注意:smp_affinity_list写入的是CPU编号,比传统的十六进制掩码smp_affinity更直观。
3. 调整内核网络参数,减少软中断堆积
bash
# 增大网卡接收队列,防止丢包触发重传
ethtool -G eth0 rx 4096 tx 4096
# 内核参数
sysctl -w net.core.netdev_max_backlog=65535
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
三、 调优结果
同样wrk压测(1000并发,长连接):
调优前:QPS ≈ 3.1万,si峰值 85%,偶发丢包
调优后:QPS ≈ 5.4万,si峰值降到 35%,8核负载均衡
QPS提升74%,且P99延迟从120ms降到45ms。
四、 总结
云服务器上的网络性能问题,很多时候不是CPU不够,而是中断没分好。鲲鹏架构下尤其要注意网卡多队列的开启和中断绑核。建议做高并发服务的兄弟,上线前先用mpstat -P ALL 1看一眼各核的%soft分布,如果严重不均,先查中断亲和性,再谈其他优化。
- 点赞
- 收藏
- 关注作者
评论(0)