0

0

ksoftirqd 长期占用 20-40% 的 softnet backlog 与网卡参数调整

冰川箭仙

冰川箭仙

发布时间:2026-01-25 18:36:17

|

590人浏览过

|

来源于php中文网

原创

ksoftirqd 持续高 CPU 是因网卡收包积压导致 softnet backlog 过高,非软中断本身繁忙;真实瓶颈在 NIC 驱动或硬件收包路径,如 RSS 不均、GRO 开启但应用不消费、NAPI 轮询不足。

ksoftirqd 长期占用 20-40% 的 softnet backlog 与网卡参数调整

为什么 ksoftirqd 持续吃高 CPU 且 softnet backlog 居高不下

这不是软中断本身太忙,而是网卡收包后来不及处理,导致 softnet_data->input_pkt_queue 积压。一旦 backlog 超过 net.core.netdev_max_backlog(默认 1000),内核会丢包并触发更频繁的 softirq 调度,形成恶性循环——ksoftirqd 看似“忙”,实则是被积压队列拖住的救火队员。

  • 典型现象:cat /proc/net/softnet_stat 中每行第 2 列(drop)持续增长,第 1 列(processed)远高于第 3 列(time_squeeze)
  • 真实瓶颈往往在 NIC 驱动层或硬件收包路径,比如 RSS 队列未均分、GRO 开启但应用不消费、NAPI poll 轮询量不足
  • ksoftirqd 占用率高只是表象,不能靠调高 vm.swappiness 或关 irqbalance 来解决

net.core.netdev_max_backlog 改大就能缓解吗

不能盲目调大。该值只是队列上限,不是性能加速器。设得过大反而延长延迟、掩盖真实瓶颈,还可能因内存碎片导致分配失败(见 dmesgsoftnet_alloc_recv_skb_failed)。

  • 合理范围:2000–5000,需配合 net.core.dev_weight 和 NAPI weight 同步调整
  • 必须确认硬件支持:部分老网卡(如 e1000e)在 backlog > 2048 时触发额外锁竞争,CPU 反而更卡
  • 改完要验证:watch -n1 'cat /proc/net/softnet_stat | cut -d" " -f1,2,3',观察 drop 是否下降、time_squeeze 是否减少

RSS、RPS、RFS 该怎么配才不打架

RSS(硬件多队列)优先级最高,RPS 是软件模拟,RFS 是流亲和增强。三者混用易冲突,尤其 RPS 在开启 RSS 后基本无用,还增加 cache miss。

Beautiful.ai
Beautiful.ai

AI在线创建幻灯片

下载
  • 有 RSS 支持(ixgbe、i40e、mlx5):关闭 RPS(echo 0 > /sys/class/net/eth0/queues/rx-0/rps_cpus),只调 RSS 队列数和 IRQ 绑核
  • 无 RSS(如 vmxnet3、virtio):启用 RPS + RFS,但 rps_sock_flow_entries 至少设为 32768,否则流哈希碰撞严重
  • RFS 依赖 net.core.rps_flow_cnt,若应用短连接多,建议设为 65536;否则默认 32768 即可

哪些网卡参数改动最立竿见影

别碰 txqueuelenethtool -G ring buffer 大小——它们影响的是发包或 DMA 缓存,对 softnet backlog 几乎无感。真正关键的是 NAPI 和 GRO/GSO 控制点。

  • 降低单次 NAPI 处理上限:echo 64 > /sys/class/net/eth0/napi_defer_hard_irqs(仅支持较新驱动),或调小 net.core.dev_weight(默认 64 → 32)
  • 禁用 GRO(如果上层是 UDP 或 TLS 流量):ethtool -K eth0 gro off,避免大包重组后无法及时分发
  • 确认 net.ipv4.tcp_rmem 第三项(max)不低于 4M,否则 socket 接收缓冲区小,会卡住 softnet 消费链路

真正卡点常在驱动与协议交界处:比如 ixgbe 的 InterruptThrottleRate 设太高会导致中断合并过度,RSS 队列空转;而 virtio-net 的 vq_rx ring size 不够则直接堵死 vhost 内核线程。这些细节比 sysctl 参数更值得盯住。

相关专题

更多
堆和栈的区别
堆和栈的区别

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

394

2023.07.18

堆和栈区别
堆和栈区别

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

574

2023.08.10

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

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

468

2024.01.03

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

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

13

2025.12.06

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

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

482

2023.08.10

tcp和udp的区别
tcp和udp的区别

TCP和UDP的区别,在连接性、可靠性、速度和效率、数据报大小以及适用场景等方面。本专题为大家提供tcp和udp的区别的相关的文章、下载、课程内容,供大家免费下载体验。

120

2023.07.25

udp是什么协议
udp是什么协议

UDP是OSI参考模型中一种无连接的传输层协议。本专题为大家带来udp是什么协议的相关文章,免费提供给大家。

290

2023.08.08

tcp和udp有什么区别
tcp和udp有什么区别

tcp和udp的区别有:1、udp是无连接的,tcp是面向连接的;2、udp是不可靠传输,tcp是可靠传输;3、udp是面向报文传输,tcp是面向字节流传输。想了解更多tcp相关的内容,可阅读本专题下面的相关文章。

384

2024.11.14

c++ 根号
c++ 根号

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

45

2026.01.23

热门下载

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

精品课程

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

共578课时 | 50.8万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

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

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