0

0

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

舞夢輝影

舞夢輝影

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

|

914人浏览过

|

来源于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/65535fqs=0、NMI backtrace 等,才提示软锁或中断风暴可能性极高——尤其是当 stall 日志里反复出现同一 CPU(比如 CPU 3),且 idle=000/0/0(非空闲)+ softirq=N/M 中 M 远大于 N,说明软中断队列严重堆积。

关键判断依据:
- 若 softirq 第二项(等待数)持续飙升,cat /proc/softirqs 对应列(如 NET_RXNET_TXHI)在 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/0x10spin_lock+0x1a/0x30
  • Alt + SysRq + w → 列出所有不可中断状态(D 状态)进程,确认是否有驱动线程卡在 wait_event_interruptiblemutex_lock
  • Alt + SysRq + t → 查看完整 task list,找 runninguninterruptible 状态下长时间未切换的 task(尤其注意名字含模块名或驱动名的)

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

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

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

Tome
Tome

先进的AI智能PPT制作工具

下载
  • 启用 softirq 跟踪:
    echo 1 > /sys/kernel/debug/tracing/events/irq/softirq_entry/enable
    echo 1 > /sys/kernel/debug/tracing/events/irq/softirq_exit/enable
    echo function > /sys/kernel/debug/tracing/current_tracer
    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_pollnvme_irq)是否陷入长循环

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

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

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

  • rcu_cpu_stall_timeout=60(默认 21 秒)给宽限期更多缓冲,避免误报(但不解决根本)
  • 对已知有问题的驱动(如某些老网卡、PCIe 设备),加 pci=noacpiirqpoll 降低中断路由复杂度
  • 若确认是 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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

395

2023.09.04

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

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

398

2023.07.18

堆和栈区别
堆和栈区别

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

575

2023.08.10

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

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

398

2023.07.18

堆和栈区别
堆和栈区别

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

575

2023.08.10

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

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

525

2023.08.10

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

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

415

2023.08.08

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

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

510

2024.05.29

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
c语言项目php解释器源码分析探索
c语言项目php解释器源码分析探索

共7课时 | 0.4万人学习

光速学会docker容器
光速学会docker容器

共33课时 | 1.9万人学习

PHP WEB 项目实战
PHP WEB 项目实战

共16课时 | 1.3万人学习

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

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