ksoftirqd 高占用但 net_rx 正常的 block softirq / timer softirq 排查

发布时间 - 2026-01-28 00:00:00    点击率:
ksoftirqd占用高但NET_RX正常,说明问题在BLOCK或TIMER softirq而非网络接收路径;需通过/proc/softirqs变化速率、/proc/irq/*/spurious、perf trace及存储设备状态等综合定位根因。

为什么 ksoftirqd 占用高但 net_rx softirq 统计正常

这通常意味着问题不在网络接收路径本身,而是其他 softirq 类型(尤其是 blocktimer)在持续触发、排队或执行时间过长,导致 ksoftirqd 线程忙于处理 backlog。注意:/proc/softirqs 中的 NET_RX 计数只反映被触发次数,不反映单次执行耗时;即使它增长平缓,只要某次 block softirq 处理花了 20ms,就可能阻塞后续所有 softirq 调度,ksoftirqd 就会持续跑满。

确认到底是 block 还是 timer softirq 在作祟

直接看 /proc/softirqs 各列累计值变化速率:

watch -n1 'grep -E "^(BLOCK|TIMER)" /proc/softirqs'

更关键的是观察每 CPU 的实时 pending 和延迟:

  • cat /proc/irq/*/spurious —— 查看是否有异常中断风暴(尤其 SCSI/NVMe 驱动 bug 可能引发虚假中断 → 触发大量 TIMER softirq)
  • perf record -e irq:softirq_entry -g -- sleep 5 + perf script | grep -E "(block|timer)" —— 定位实际进入 softirq 的调用栈源头
  • 检查 /sys/block/*/stat 是否有某设备 io_ticks 暴涨但 reads_completed 几乎不动 —— 典型 IO hang 导致 BLOCK softirq 卡住

block softirq 卡住的常见根因和验证方式

BLOCK softirq 主要由块设备驱动在完成 IO 后触发(如 blk_mq_complete_request),卡住往往不是软中断本身慢,而是它依赖的上下文被阻塞:

  • 文件系统层锁竞争:比如 XFS 的 log wait 或 ext4 的 journal commit 持久阻塞,用 cat /proc/fs/xfs/xfsstats | grep xs_log_waitsdmesg -T | grep -i "journal.*wait"
  • 底层存储响应超时:NVMe 设备掉盘、RAID 卡降速、iSCSI target 延迟突增,用 smartctl -a /dev/nvme0n1cat /sys/class/scsi_host/host*/statiscsiadm -m session -P 3 排查
  • IO 调度器死锁:CFQ 已淘汰,但某些定制内核仍用,或 mq-deadline 在高队列深度下出现请求合并异常,临时切到 none 测试:echo none > /sys/block/nvme0n1/queue/scheduler

timer softirq 异常升高的典型场景

TIMER softirq 占用高,大概率不是定时器太多,而是某个 timer handler 执行太久,或 timer 频繁重调度形成“timer storm”:

  • 用户态进程频繁调用 nanosleepepoll_wait(带 timeout)、select,且 timeout 极短(如 1ms),内核需为每个调用注册/注销高精度 timer —— 用 perf record -e 'syscalls:sys_enter_nanosleep' -- sleep 2 抓嫌疑进程
  • 内核模块 bug:比如某些旧版 RDMA 驱动、DPDK PMD、或自研驱动在 mod_timer 时传入已销毁的 timer 结构体,导致 softirq 循环重试
  • RCU stall 间接引发:当 RCU callback 积压,内核会通过 TIMER softirq 强制推进,查 dmesg | grep -i "rcu.*stall"/proc/sys/kernel/rcu_normal

真正难排查的是 softirq 在不同 CPU 间迁移不均 + 某个 CPU 上 block/timer handler 有隐式锁等待,这时候单看统计值会误判,必须结合 perf sched latency 和 per-CPU 的 /proc/softirqs 快照交叉比对。


# session  #   # ai  # 为什么  # echo  # select 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251811 】 【 AI营销90571


相关推荐: Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  如何实现建站之星域名转发设置?  香港网站服务器数量如何影响SEO优化效果?  黑客如何利用漏洞与弱口令入侵网站服务器?  python中快速进行多个字符替换的方法小结  电商网站制作价格怎么算,网上拍卖流程以及规则?  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  浅述节点的创建及常见功能的实现  Laravel如何使用查询构建器?(Query Builder高级用法)  历史网站制作软件,华为如何找回被删除的网站?  Laravel如何记录自定义日志?(Log频道配置)  如何在Windows 2008云服务器安全搭建网站?  如何为不同团队 ID 动态生成多个“认领值班”按钮  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  如何快速搭建二级域名独立网站?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  详解jQuery中的事件  C#如何调用原生C++ COM对象详解  制作企业网站建设方案,怎样建设一个公司网站?  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  Laravel怎么上传文件_Laravel图片上传及存储配置  iOS中将个别页面强制横屏其他页面竖屏  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Laravel如何处理表单验证?(Requests代码示例)  网站制作软件免费下载安装,有哪些免费下载的软件网站?  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  ,南京靠谱的征婚网站?  Laravel怎么在Controller之外的地方验证数据  网站图片在线制作软件,怎么在图片上做链接?  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  详解jQuery中基本的动画方法  Angular 表单中正确绑定输入值以确保提交与验证正常工作  如何在万网自助建站中设置域名及备案?  轻松掌握MySQL函数中的last_insert_id()  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  Laravel如何配置Horizon来管理队列?(安装和使用)  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  高防服务器租用首荐平台,企业级优惠套餐快速部署  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  如何在万网开始建站?分步指南解析  phpredis提高消息队列的实时性方法(推荐)  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  常州企业网站制作公司,全国继续教育网怎么登录?  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  JS中页面与页面之间超链接跳转中文乱码问题的解决办法