麒麟os高并发网络优化需先确认网卡多队列硬件支持(ethtool -l eth0),再设合理队列数与ring buffer,绑定中断到专用cpu核,并按需启用rps/rfs补位。

在麒麟操作系统上运行高并发网络服务时,若出现单CPU核心持续100%而其他核心空闲、网络延迟突增或pps吞吐不随CPU核数线性增长等问题,说明网卡多队列未启用或配置失当,必须从硬件确认、队列分配、中断绑定到内核补位逐层落实。
确认网卡是否支持并已启用多队列
这一步不可跳过——没有硬件级多队列支持,后续所有软件优化都是徒劳。先查物理能力再调参数。
执行 ethtool -l eth0(将 eth0 替换为你的实际网卡名,如 ens33),重点观察 Combined 行:【Current】 值必须大于 1 才表示当前已启用多队列;【Max】 值告诉你硬件上限。
再运行 cat /proc/interrupts | grep eth0,若看到多个形如 eth0-TxRx-0、eth0-TxRx-1 的中断行,且数量与 Current 值一致,说明 RSS(接收侧缩放)已在硬件层生效。
注意:若 Current 显示为 1,即使 Max 是 16,也代表当前仅用单队列,需手动开启;若 Current > 逻辑 CPU 核数(如 24 核服务器设了 32 队列),系统会静默截断为 24,不会报错但浪费配置。
设置合理队列数量与Ring Buffer大小
队列不是越多越好,要匹配真实CPU资源和业务特征。目标是让每个RX队列由一个专用CPU核心处理,避免跨核缓存失效。
第一步:将 Combined 队列数设为逻辑CPU核数的 70%~100%。例如 24 核服务器,执行:sudo ethtool -L eth0 combined 20
第二步:调大 RX Ring Buffer 至 4096(万兆常用值),防止突发流量溢出丢包:sudo ethtool -G eth0 rx 4096
第三步:TX Ring Buffer 设为 RX 的 60%,即 2048,避免发送侧阻塞拖慢整体吞吐:sudo ethtool -G eth0 tx 2048
过小的 Ring Buffer 会导致 rx_missed_errors 持续上涨,用 ethtool -S eth0 | grep rx_missed 可验证;过大则增加内存占用与延迟,无实际收益。
绑定网卡中断到指定CPU核心
光有多个队列不够,必须让每个队列的中断固定落在对应CPU上,否则仍会发生中断争抢和负载倾斜。
方法一:启用 NUMA 感知的 irqbalance
编辑 /etc/sysconfig/irqbalance(CentOS系)或 /etc/default/irqbalance(Ubuntu系),设置:IRQBALANCE_ARGS="--numa",然后重启服务:sudo systemctl restart irqbalance
方法二:手动绑定(更精确,推荐生产环境)
先查各队列中断号:cat /proc/interrupts | grep "eth0-TxRx",输出类似:125: 1245678 0 0 0 PCI-MSI 123456-edge eth0-TxRx-0
其中 125 是 irq 编号;
再将 irq 125 绑定到 CPU 0:echo 0 | sudo tee /proc/irq/125/smp_affinity_list;
将 irq 126 绑定到 CPU 2:echo 2 | sudo tee /proc/irq/126/smp_affinity_list……依此类推。
验证是否均匀:运行 watch -n1 'grep eth0 /proc/interrupts',压测时观察各 irq 计数应同步、线性增长。若某 irq 几乎不动,说明绑定失败或该 CPU 被其他高优先级任务锁死。
启用RPS/RFS作为硬件多队列补充
仅在以下情况启用:网卡本身不支持多队列(如老旧千兆卡)、虚拟化环境中 vNIC 未暴露 RSS 能力、或需对特定流量做细粒度分发。
方法一:开启 RPS(接收包导向)
设置每接收队列可被哪些CPU处理。例如让 rx-0 接收的所有包可由 CPU 0~3 处理:echo f | sudo tee /sys/class/net/eth0/queues/rx-0/rps_cpus
其中 f 是十六进制掩码,对应 CPU 0/1/2/3(bit0~bit3置1)。
方法二:开启 RFS(接收流导向)提升缓存局部性
先扩大全局流表容量:echo 32768 | sudo tee /proc/sys/net/core/rps_flow_cnt
再为每个 rx 队列启用 RFS:echo 32768 | sudo tee /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
注意:RPS/RFS 是纯软件方案,会带来额外CPU开销,仅当硬件RSS不可用时启用;启用前确保 /proc/sys/net/core/rps_sock_flow_entries 不为 0。











