华为云鲲鹏ECS网卡多队列与RSS调优:解决高并发下CPU软中断打满问题

举报
yd_264409687 发表于 2026/11/02 08:29:37 2026/11/02
【摘要】 前段时间把一个API网关服务迁到华为云鲲鹏通用计算型 kc1 实例(8核16G),压测时发现一个诡异现象:QPS上到3万左右就上不去了,top一看,8个核里有两三个核的si(软中断)占用飙到80%以上,而其他核却很闲。典型的网卡中断分配不均问题,在ARM架构上尤其明显。一、 定位:中断都堆在CPU0上bashcat /proc/interrupts | grep -i eth输出显示,网卡e...

前段时间把一个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分布,如果严重不均,先查中断亲和性,再谈其他优化。

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。