讲师中心 微信公众号
AI工具推荐 视频效率加速

rcu detected stall 导致 CPU 卡死的软/硬锁或中断风暴解决

千辰君_8573

千辰君_8573

发布时间:2026-01-30 19:25:02

|

1074人浏览过

|

来源于php中文网

原创

RCU stall 是软锁或中断风暴的症状而非原因;关键依据是softirq堆积、idle=000/0/0及ksoftirqd高CPU占用;可用sysrq实时抓栈,ftrace定位耗时函数,参数调优仅缓解不根治。

rcu detected stall 导致 cpu 卡死的软/硬锁或中断风暴解决

确认 stall 是否真由软锁或中断风暴引发

RCU stall 报错本身不是原因,而是症状。你看到 INFO: rcu_sched detected stalls on CPUs/tasks,紧接着系统卡死、softirq=0/65535、fqs=0、NMI backtrace 等,才提示软锁或中断风暴可能性极高——尤其是当 stall 日志里反复出现同一 CPU(比如 CPU 3),且 idle=000/0/0(非空闲)+ softirq=N/M 中 M 远大于 N,说明软中断队列严重堆积。

关键判断依据:
- 若 softirq 第二项(等待数)持续飙升,cat /proc/softirqs 对应列(如 NET_RX、NET_TX、HI)在 stall 前几秒突增数十倍 → 很可能是中断风暴或软中断处理函数卡住;
- 若 idle 字段始终为 000/0/0 或极小值,且 ps aux --sort=-pcpu | head -5 显示某内核线程(如 ksoftirqd/3)或驱动模块线程 CPU 占用 100% → 更倾向软锁(如自旋锁死循环、disable_irq_nosync 后忘开、readl/writel 在无超时轮询中阻塞);
- 若 stall 发生在 emulator(如 QEMU + cmodel)、RT 内核或 tickless idle 场景下,且 (0 ticks this GP) 频繁出现 → 很可能不是锁,而是调度器无法触发 tick,RCU 等不到 QS。

用 sysrq 实时抓取卡死现场的堆栈

这是最轻量、最可靠的第一响应手段,无需提前配置,只要 /proc/sys/kernel/sysrq 是 1 就能用。系统刚卡但尚未 panic 时,立刻按物理键盘组合键(串口/SSH 不生效):

  • Alt + SysRq + l(小写 L)→ 转储所有 CPU 的当前堆栈,你会看到每个 CPU 上正在执行的函数,重点关注 stalled CPU 的 RIP 指向哪(比如 readl+0xb/0x10 或 spin_lock+0x1a/0x30)
  • Alt + SysRq + w → 列出所有不可中断状态(D 状态)进程,确认是否有驱动线程卡在 wait_event_interruptible 或 mutex_lock
  • Alt + SysRq + t → 查看完整 task list,找 running 或 uninterruptible 状态下长时间未切换的 task(尤其注意名字含模块名或驱动名的)

⚠️ 注意:部分笔记本 SysRq 键需配合 Fn;虚拟机中需确保 keyboard: passthrough 开启;若用串口控制台,需在内核启动参数加 console=ttyS0,115200 并启用 sysrq_always_enabled。

用 ftrace 锁定软中断或驱动函数的异常耗时

如果 stall 偶发且无法手动触发 sysrq,就靠 ftrace 提前布防。重点不是录全量 trace,而是聚焦 RCU 和 softirq 关键路径:

Skill Weave Chains — 技能链路由引擎
Skill Weave Chains — 技能链路由引擎

开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。

下载
  • 启用 softirq 跟踪:
    echo 1 > /sys/kernel/debug/tracing/events/irq/softirq_entry/enable<br>echo 1 > /sys/kernel/debug/tracing/events/irq/softirq_exit/enable<br>echo function > /sys/kernel/debug/tracing/current_tracer<br>echo 'do_softirq*|__do_softirq|rcu_*|note_gp_changes' > /sys/kernel/debug/tracing/set_ftrace_filter
  • 加一个简单 watchdog 脚本,在后台轮询 dmesg -t | tail -20 | grep "rcu_sched.*stall",一旦命中立即:cat /sys/kernel/debug/tracing/trace_pipe > /tmp/ftrace-stall-$(date +%s).log &
  • 特别关注 __do_softirq 执行时间是否超 2ms(正常应在 sub-ms 级),以及它调用的驱动 handler(如 igb_poll、nvme_irq)是否陷入长循环

常见陷阱:function_graph tracer 开销大,可能掩盖问题;生产环境建议用 function tracer + 精确 filter,避免 trace buffer 溢出丢帧。

硬性规避:从内核参数和驱动行为入手

很多“卡死”本质是设计缺陷被 RCU 暴露出来,修复要落在驱动或子系统层。临时缓解可从启动参数切入:

  • 加 rcu_cpu_stall_timeout=60(默认 21 秒)给宽限期更多缓冲,避免误报(但不解决根本)
  • 对已知有问题的驱动(如某些老网卡、PCIe 设备),加 pci=noacpi 或 irqpoll 降低中断路由复杂度
  • 若确认是 readl/writel 轮询导致(见 calltrace 中 readl+0xb/0x10),必须在驱动中改用带超时的 readl_poll_timeout,并确保每次读前 mb() 内存屏障
  • RT 内核用户务必检查:是否在 preempt_disable 区域里做了耗时操作?cond_resched_rcu_qs() 是否被遗漏?因为 cond_resched() 不触发 RCU QS

真正难啃的是那些“看起来没锁、也没关中断,但就是不调度”的情况——比如在 stop_machine 上下文中做长计算,或在 atomic_notifier_call_chain 里调用了可能 sleep 的函数。这类问题不会出现在 sysrq 输出里,只能靠 ftrace + 源码交叉比对。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1138

2023.09.04

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

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

5747

2023.07.18

堆和栈区别
堆和栈区别

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

2468

2023.08.10

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

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

5747

2023.07.18

堆和栈区别
堆和栈区别

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

2468

2023.08.10

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

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

4158

2023.08.10

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

856

2023.08.08

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

6183

2024.05.29

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

20

2026.10.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
XAMPP手册
XAMPP手册

共0课时 | 0人学习

c语言项目php解释器源码分析探索
c语言项目php解释器源码分析探索

共7课时 | 0.5万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn