0

0

ksoftirqd 占用单核 100% 的 net_rx/softnet 软中断排查优化

舞夢輝影

舞夢輝影

发布时间:2026-01-20 09:48:09

|

294人浏览过

|

来源于php中文网

原创

ksoftirqd 单核 100% 是因 net_rx 软中断积压所致,需通过 /proc/softirqs、top -H、/proc/interrupts 和 ethtool 等工具定位网卡 IRQ 绑定不均或 NAPI 负载过重问题。

ksoftirqd 占用单核 100% 的 net_rx/softnet 软中断排查优化

ksoftirqd 占用单核 100%,尤其是绑定在 net_rxsoftnet 软中断上,是 Linux 网络高负载场景下的典型性能瓶颈。根本原因不是进程本身“吃 CPU”,而是内核持续调度该线程处理积压的网络软中断(softirq),说明网卡收包路径出现拥塞或处理不及时。

确认是否真是 net_rx 软中断瓶颈

先验证问题根源,避免误判:

  • 运行 watch -n 1 'cat /proc/softirqs',观察 NET_RX 行数值是否持续飙升(尤其对比其他 CPU 核)
  • top -H -p $(pgrep ksoftirqd) 查看具体哪个 ksoftirqd/N 线程 CPU 高,并记下其绑定的 CPU 编号 N
  • 检查该 CPU 对应的 /proc/irq/*/cpulist/proc/interrupts,确认网卡 IRQ 是否集中落在该核(IRQ 绑定不均会加剧 softirq 偏斜)

检查网卡收包队列与 NAPI 负载

NAPI 是 net_rx softirq 的执行主体。若 NAPI poll 循环未及时退出或轮询量过大,会导致 softirq 长时间占用 CPU:

故事AI绘图神器
故事AI绘图神器

文本生成图文视频的AI工具,无需配音,无需剪辑,快速成片,角色固定。

下载
  • 查看网卡队列状态:ethtool -S eth0 | grep -i "rx\|drop\|queue",重点关注 rx_queue_0_dropsrx_missed_errorsrx_long_length_errors
  • 确认 NAPI 是否被频繁唤醒:cat /sys/class/net/eth0/device/msi_irqs/*/name 2>/dev/null | grep napi,再结合 echo 128 > /sys/class/net/eth0/napi_weight,观察是否缓解(慎用于生产,需测试稳定性)

优化 IRQ 亲和性与 RPS/RFS

让收包中断和 softirq 处理尽量分散到多核,避免单核打满:

  • 均衡 IRQ 分布:用 sudo bash -c 'echo 0-3 > /proc/irq/*/smp_affinity_list'(按实际 CPU 数调整),确保网卡多队列 IRQ 均匀绑定
  • 启用 RPS(软件层面分发 rx softirq):echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus(十六进制掩码,f=0-3核)
  • 启用 RFS(提升 cache 局部性):先设 net.core.rps_sock_flow_entries=32768,再为每 rx 队列配 flow_cnt:echo 2048 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt

排查上层诱因与协议栈行为

软中断压满往往是结果,需回溯上游流量或应用行为:

  • 检查是否有异常流量:用 tcpdump -i eth0 -c 100 'tcp[tcpflags] & (tcp-syn|tcp-fin|tcp-rst) != 0' 快速抓包,看是否存在 SYN Flood、大量短连接、RST 扫描等
  • 确认 socket 接收队列是否溢出:ss -s 中关注 recv-q 持续非零、full connections dropped 计数增长
  • 检查 netfilter 规则(iptables/nftables)是否过于复杂,特别是 PREROUTING 链中大量 match 或 LOG,会显著拖慢 ingress 路径

相关专题

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

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

232

2023.09.22

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

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

436

2024.03.01

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

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

465

2024.01.03

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

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

13

2025.12.06

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1349

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

703

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

0

2026.01.20

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.5万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

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

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