0

0

net_rx 软中断占比过高导致单核打满的定位与优化

舞夢輝影

舞夢輝影

发布时间:2026-01-23 17:54:09

|

792人浏览过

|

来源于php中文网

原创

net_rx软中断单核过载本质是RSS配置不当导致流量集中,需通过/proc/softirqs和mpstat定位热点CPU,再用ethtool与smp_affinity_list检查并均衡网卡队列中断绑定,辅以GRO关闭、netdev_budget调优及RPS启用。

net_rx 软中断占比过高导致单核打满的定位与优化

net_rx 软中断占比过高、导致某个 CPU 核心 100% 占用,本质是内核在该核上持续处理网络数据包收包软中断(NET_RX_SOFTIRQ),来不及返回调度,其他任务被饿死。关键不是“软中断多”,而是“单核集中处理”和“处理不过来”。定位要分三步:确认现象、锁定瓶颈点、验证优化效果。

确认是否真是 net_rx 软中断压满单核

别只看 top 或 htop 的 cpu 使用率——它们把软中断(si)和硬中断(hi)混在 system(sy)里,容易误判。用下面命令看真实分布:

  • cat /proc/softirqs:重点关注 NET_RX 行,对比各 CPU 列数值。若某列远高于其他(比如 cpu0 是 cpu1 的 5 倍以上),说明流量集中在该核
  • mpstat -P ALL 1:观察每秒的 %soft 字段,确认是否某核 %soft 持续 >90%
  • cat /proc/interrupts | grep -i eth:检查硬中断(如 eth0-TxRx-0)是否也集中在同一核——软中断常由同核硬中断触发,二者绑定过紧会雪上加霜

检查网卡中断亲和性与 RSS 配置

现代多队列网卡(如 ixgbe、i40e、mlx5)默认开启 RSS(Receive Side Scaling),但若未正确配置,所有队列中断可能仍落到同一个 CPU 上。

Figstack
Figstack

一个基于 Web 的AI代码伴侣工具,可以帮助跨不同编程语言管理和解释代码。

下载
  • 查当前 RSS 队列数:ethtool -l eth0(看 Combined 或 RX 队列数)
  • 查中断亲和性:cat /proc/irq/*/smp_affinity_list 2>/dev/null | grep -A1 "eth0",确认每个队列中断是否分散到不同 CPU
  • 手动均衡(示例:将 eth0 的 8 个 RX 队列均匀绑到 cpu0–cpu7):
    echo 0 > /proc/irq/$(cat /proc/interrupts | grep "eth0-TxRx-0" | awk '{print $1}' | sed 's/://')/smp_affinity_list
    依此类推设置 1~7;更稳妥用脚本或 irqbalance(确保它没被禁用且配置合理)

排查驱动与协议瓶颈点

即使中断分散了,若单队列处理慢,仍可能压垮对应 CPU。常见瓶颈包括:

  • 小包风暴:MTU=1500 的包,每秒 50 万 pkt 就足以打满单核 softirq 处理能力。用 tcpdump -i eth0 -c 1000 -w /tmp/pkts.pcap 2>/dev/null & & ss -i 结合 ifconfig 看 RX packets/sec 和 errs/drop,确认是否丢包伴随高 softirq
  • GRO/LRO 开启不当:GRO 在软中断中聚合,反而增加开销。对小包场景可关闭:ethtool -K eth0 gro off(LRO 通常硬件做,无需关)
  • Netfilter 规则过多:iptables/nftables 的 INPUT 链规则会在 net_rx 软中断上下文执行(尤其是 raw 和 mangle 表)。用 nft list ruleset | wc -liptables -t raw -L -n -v 查复杂度,精简非必要规则

内核参数与应用层协同调优

纯靠调参不能替代架构优化,但能缓解短期压力:

  • 降低单次软中断处理包数上限,避免 monopolize:echo 64 > /proc/sys/net/core/netdev_budget(默认 300,太大会卡住调度;64~128 较稳)
  • 启用 RPS(Receive Packet Steering)作为 RSS 补充(尤其虚拟化或老网卡):
    echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus(十六进制掩码,f=cpu0–3)
  • 应用层配合:避免单连接高频小包(如 HTTP/1.1 不复用、日志直写 socket)。改用批量上报、启用 TCP_NODELAY+writev、或切到 UDP+自定义批处理

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

185

2023.09.27

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

233

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

393

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

574

2023.08.10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

466

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

13

2025.12.06

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

184

2023.11.24

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.8万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 19万人学习

第二十二期_前端开发
第二十二期_前端开发

共119课时 | 12.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号