RCU CPU STALL DETECTOR

使用PCIE的TTE卡遇到的rcu: INFO: rcu_sched self-detected stall on CPU问题解决 RCU一个说明网页 cat或者 tail -f命令 日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全相关的日志信息 /var/log/maillog 与邮件相关的日志信息 /var/log/cron 与定时任务相关的日志信息 /var/log/spooler 与UUCP和news设备相关的日志信息 /var/log/boot.log 守护进程启动和停止相关的日志消息 系统: # 阅读详情

在RHEL 7 和 SELS11 SP2 之后的Linux系统上,有时会看到如下信息:

INFO: rcu_sched_state detected stall on CPU 5 (t=2500 jiffies)
INFO: rcu_bh_state detected stalls on CPUs/tasks: { 3 5 } (detected by 2, 2502 jiffies)

它们来自RCU CPU Stall Detector,要了解RCU CPU Stall Detector是什么,首先要知道RCU是什么。RCU(Read-Copy Update) 是Linux 2.6 内核开始引入的一种新的锁机制,与spinlock、rwlock不同,RCU有其独到之处,它只适用于读多写少的情况。

RCU是基于其原理命名的,Read-Copy Update,[Read]指的是对于被RCU保护的共享数据,reader可以直接访问,不需要获得任何锁;[Copy Update]指的是writer修改数据前首先拷贝一个副本,然后在副本上进行修改,修改完毕后向reclaimer(垃圾回收器)注册一个回调函数(callback),在适当的时机完成真正的修改操作–把原数据的指针重新指向新的被修改的数据,–这里所说的适当的时机就是当既有的reader全都退出临界区的时候,而等待恰当时机的过程被称为grace period 。在RCU机制中,writer不需要和reader竞争任何锁,只在有多个writer的情况下它们之间需要某种锁进行同步作,如果写操作频繁的话RCU的性能会严重下降,所以RCU只适用于读多写少的情况。

RCU API 最核心的函数是: 
rcu_read_lock() 
rcu_read_unlock() 
synchronize_rcu() 
call_rcu()

  • rcu_read_lock()和rcu_read_unlock()配对使用,由reader调用,用以标记reader进入/退出临界区。夹在这两个函数之间的代码区称为”读端临界区”(read-side critical section),注:读端临界区可以嵌套。reader在临界区内是不能被阻塞的。
  • synchronize_rcu()由writer调用,它会阻塞writer(即writer会进入睡眠等待),直到经过grace period后,即所有的reader都退出读端临界区,writer才可以继续下一步操作。如果有多个writer调用该函数,它们将在grace period之后全部被唤醒。
  • call_rcu()是synchronize_rcu()的非阻塞版本,它也由 writer调用,但不会阻塞writer(即writer不会进入睡眠,而是继续运行),因而可以在中断上下文或 softirq 中使用,而 synchronize_rcu()只能在进程上下文使用。call_rcu()把参数中指定的callback函数挂接到 RCU回调函数链上,然后立即返回。一旦所有的 CPU 都已经完成端临界区操作(即grace period之后),该callback函数将被调用,用writer修改过的数据副本替换原数据并释放原数据空间。需要指出的是,函数 synchronize_rcu 的实现实际上也使用了函数call_rcu()。

RCU API 有一些特殊用途的分支,比如 RCU BH (防DDoS攻击的API)、 RCU Sched (适用于 scheduler 和 interrupt/NMI-handler 的 API),等。参见 http://lwn.net/Articles/264090/

RCU在Linux 2.6内核中(RHEL6和SLES11 SP1)就已经存在了,那时处理 grace period 利用了软中断(softirq),而到了新的3.x内核之后有所改变,处理grace period利用的是内核线程,因为内核线程可以被抢占,减少了实时任务的响应延迟。所以在3.x内核的系统上,会看到类似如下的内核线程: 
[rcu_sched] 
[rcu_bh] 
[rcuob/0] 
[rcuob/1] 
[rcuos/0] 
[rcuos/1] 
还有可能会见到rcu_preempt线程。 
注:其中 rcuob/N, rcuos/N 是负责处理 RCU callbacks 的内核线程,参见https://www.kernel.org/doc/Documentation/kernel-per-CPU-kthreads.txt 。

好了,现在终于可以讲 RCU CPU Stall Detector 了,它其实是RCU代码中的一个debugging feature(参见https://lwn.net/Articles/301910/ ),在2.6内核中缺省是关闭的,而到3.x内核中缺省是打开的,它有助于检测导致 grace period 过度延迟的因素,因为grace period的长短是RCU性能的重要因素。发生RCU grace period延迟会在系统日志中记录告警信息,称为 RCU CPU Stall Warnings :

INFO: rcu_sched_state detected stalls on CPUs/tasks: { 15} (detected by 17, t=15002 jiffies) 
或 
INFO: rcu_bh_state detected stalls on CPUs/tasks: { 3 5 } (detected by 2, 2502 jiffies) 
等等。

在上述告警信息之后通常还会看到相关CPU的stack dump,检查stack trace有助于了解当时运行的代码和可能导致延迟的原因。

如果你不想看到以上告警信息,可以通过以下参数关掉它: 
/sys/module/rcupdate/parameters/rcu_cpu_stall_suppress 
注:缺省值为0,表示显示延迟告警;置为1表示禁止显示延迟告警。 
RCU grace period延迟多长时间会触发告警呢?这是以下参数决定的(以秒为单位): 
/sys/module/rcupdate/parameters/rcu_cpu_stall_timeout 
RCU的其它内核参数,如rcupdate.rcu_task_stall_timeout等参见: 
https://www.kernel.org/doc/Documentation/kernel-parameters.txt

有哪些原因会导致 RCU grace period延迟(RCU CPU Stall Warnings)呢?参见https://www.kernel.org/doc/Documentation/RCU/stallwarn.txt 这里仅列举几例:

  • CPU 在 RCU read-side 临界区内死循环
  • CPU 在屏蔽中断的情况下死循环
  • Linux引导过程中输出信息很多,但是所用的 console太慢,跟不上信息输出的速度。
  • 任何可能导致 RCU grace-period 内核线程无法运行的因素
  • 优先级很高的实时任务占着 CPU 不放,抢占了恰好处于RCU read-side临界区的低优先级任务。
  • RCU代码bug。
  • 硬件故障。.
  • 等等。

具体分析还需从告警信息中输出的stack trace入手。

参考资料: 
源代码:kernel/rcupdate.c, kernel/rcutree.c … 
https://www.ibm.com/developerworks/cn/linux/l-rcu/ 
https://www.kernel.org/doc/Documentation/RCU/stallwarn.txt 
https://www.kernel.org/doc/Documentation/RCU/whatisRCU.txt 
http://lwn.net/Articles/262464/ 
https://lwn.net/Articles/518953/

linux内核中watchdog、lockup、stall、hung等检测 系统(在一个或多个CPU核上)保持在长时间无反应状态。检测类型有watchdog、soft lockup、hard lockup、 hung task、workqueue stall 等。3、CONFIG_RCU_CPU_STALL_TIMEOUT 值的范围 (3~300)在此时间内一定能检测到。在内核模式下运行的CPU内核仍处于紧密循环状态,不允许其他硬件中断运行;1、硬锁定只能由NMI,在本机x86_64上检测到;内核处于紧密的循环中,长时间不让其他任务得到调度。检测系统的健康状态,有能力重启系统。 阅读详情

相关推荐

PREEMPT_RT下RCU宽限期抖动实战调优:Jetson Orin Nano实时性瓶颈突破

RCU(Read-Copy Update)是Linux内核中支撑高并发读取的关键无锁同步机制,其核心原理依赖宽限期(grace period)与静默状态(quiescent state)协同完成内存安全回收。在实时场景中,RCU不再仅是性能优化组件,而是决定SCHED_FIFO任务端到端延迟上限的系统级仲裁者——尤其在PREEMPT_RT内核中,`rcu_preempt`子系统需应对可抢占上下文、线程化中断及禁抢占区等复杂约束。技术价值体现在:避免自旋锁饥饿导致的宽限期卡死、保障CAN/EtherCAT等工

weixin_30879833的博客 419

Linux内核可能导致RCU stall的原因

Linux内核可能导致RCU stall的原因

lmp210的博客 4043

定位分析RCU stall问题

在编译内核时打开或者在启动参数中增加这样统计信息是在采样周期中收集的。其中number行分别是发生stalled的cpu上的硬中断,软中断,和上下文的切换次数cputime行的前三列分别是硬中断,软中断和任务消耗的cpu时间,单位为ms.最后一个数字是统计的周期时间(ms).因为用户态的任务通常不会引起RCU CPU stalls,所以任务通常是内核任务,这也是为什么只统计system cpu的原因.

happyAnger6的专栏 1993

关于softlockup和rcu stall错误分析

当发生中断时,会执行el1_irq来处理中断,来读取当前任务的thread_info.preempt_count 判断thread_info.preempt_count是否为0,如果为0 则调用arm64_preempt_schedule_irq 进行抢占式调度。spin_lock最终会调用preempt_disable:关闭抢占,此时CONFIG_PREEMPT=y。内核日志:此时rcu是 依靠其它cpu检查print_other_cpu_stall。如果使用关闭抢占,比如通过自旋锁的方式会如何呢?

gjioui123的博客 3143

【信息科学与工程学】【产品体系】计算机科学与自动化——第一百八十九篇 操作系统内核(微内核/宏内核)函数与算法02

宏内核(Linux)更多典型内核函数/算法,从编号271开始,覆盖中断管理、热插拔、PCI、ACPI、固件、崩溃转储、kexec、休眠、watchdog、RTC、hwmon、LED、backlight、input子系统、remoteproc等更多领域。编号类型领域内核类型内核中的函数/算法/模块/模组模块的调用关系模块/函数/算法逐步推理思考的数学表达式及参数列表及参数数值设计模块的C/C++/其他代码关联知识271中断管理中断描述符宏内核 / (中断子系统核心)驱动申请中断 → → → 分配irq_

weixin_49199313的博客 109

从MySQL到数据仓库:手把手教你用Airflow实现自动化ETL流水线

本文详细介绍了如何利用Airflow构建从MySQL到数据仓库的自动化ETL流水线,涵盖增量抽取策略、PySpark转换优化和数据质量监控等实战细节。特别适合中小规模企业构建高效数据仓库,提升数据处理效率和质量。

rnn9storyteller的博客 827

Using RCU‘s CPU Stall Detector(待更新)

文章目录是什么原因导致RCU CPU Stall 警告?Fine-Tuning the RCU CPU Stall Detector解读RCU's CPU Stall Detector "Splats" 本文首先讨论RCU的CPU Stall Detector可以定位哪些类型的问题,然后讨论内核参数和Kconfig选项,它们可以用来微调Detector的操作。最后,本文解释了stall Detector的“splat”格式。 是什么原因导致RCU CPU Stall 警告? 所以你的内核打印了一个RCU C

win9 4185

Windows下Maven环境变量配置避坑指南:解决‘mvn‘不被识别问题

本文详细解析了Windows系统中配置Maven环境变量时常见的'mvn'不被识别问题,特别是当系统提示“无法将‘mvn’项识别为cmdlet、函数、脚本文件或可运行程序的名称”时的解决方案。文章从问题根源入手,提供了清晰的配置步骤、深入的排查方法以及针对PowerShell的特殊处理,旨在帮助开发者彻底解决环境变量配置难题,确保Maven命令正常使用。

weixin_28826961的博客 389

RCU's CPU Stall Detector

有时候可以会打印INFO: rcu_bh_state detected stalls on CPUs/tasks: { } (detected by 4, 2502 jiffies) 类似的log。这不是bug,而是提醒你可能某些code执行太久了,超过CONFIG_RCU_CPU_STALL_TIMEOUT 定义的时间了。具体的call flow如下:在每个时间中断函数中都会走这个flow,也就

jason的笔记 9177

华为OD机试 双机位C卷:微服务的集成测试 (C/C++/Py/Java/JS/Go)

华为OD机试 双机位C卷 :微服务的集成测试 ,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 微服务的集成测试 , 华为OD 微服务的集成测试

qq_45776114的博客 2066

十五、【测试执行篇】异步与并发:使用 Celery 实现测试任务的后台执行与结果回调

本文介绍如何使用Celery实现测试任务的异步执行与结果回调,解决同步执行测试计划导致的请求阻塞问题。主要内容包括:Celery的基本概念与工作原理(任务队列、消息中间件、Worker进程),在Django项目中集成Celery的步骤,以及将同步测试逻辑改造为异步任务的方法。

blues_C的博客 708

Linux RCU队列(2)树形RCU队列实现

因为只用一个全局锁在多处理器系统中会造成很严重的锁竞争问题,一种有效的途径是将锁竞争关系变为一种层次关系(如图1)。图中四个rcu_node结构体都有自己的锁,因此处理器0和处理器1之间将会先竞争底层的锁然后在竞争高层的锁,其他处理器也一样。在grace period期间,只有获取了底层的锁的处理器才有机会获取高层的锁,也就是说只有每对处理器中的最后一个才能够记录相应的grace period转入

dayenglish的专栏 1787

Claude Code 处理长任务 + Cursor 专注交互:双栈协作的 3 种分工场景与响应提速 35% 实测

揭示 Claude Code 与 Cursor 在 AI 编程中的本质分工:Claude Code 作为离线式架构师处理跨文件、带约束的长链路重构(如单体拆微服务),Cursor 作为现场交互工程师专注秒级局部编辑;提出按任务切片动态切换的三种工程化协作场景,并给出结构化上下文构建、约束型 Prom

weixin_28728443的博客 123

Ftrace分析cpu idle被周期唤醒原因

Linux/tick/idle/sched

lunhui2016的博客 1245

SAP 公司间采购简介

SAP公司间采购(Intercompany Procurement)是指企业集团内部不同法人实体之间的采购和销售流程。这种流程在跨国公司或有多个独立运营子公司的企业中非常常见。SAP提供了标准的功能来处理公司间采购,确保财务和物流流程的透明性和效率。以下是SAP公司间采购的基本流程及其相关模块的简介。

我小时候很黑的博客 1378

基于机器学习的网络入侵检测系统设计与实现

本文设计并实现了一个基于机器学习的网络入侵检测系统,采用随机森林模型结合KMM算法优化,使用CICIDS2017数据集进行训练。系统包含完整的数据预处理流程、特征工程、模型调优和远程部署方案。实验结果表明,该系统能有效识别多种网络攻击类型,在检测准确率和误报率方面表现优异。研究为网络安全防护提供了新的技术思路和实用工具,具有重要的应用价值。

huanghm88的专栏 318

bug解决汇总

下面都是自己在编写内核模块时遇到的一些错误,以及在网络上检索到的一些资料,感谢这些大佬们! 会一直不定期更新! linux 内核中遇到的错误 RCU CPU STALL DETECTOR 点击 NMI watchdog:Bug: soft lockup - CPU #0 stuck for 23s 点击

CraboYang的博客 503

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

编译器小知识总结

Building with ClangAs a first step to building an ASan-instrumented binary, make sure that your code builds with Clang. This is done by adding LOCAL_CLANG:=true to the build rules. Clang may find bugs

每天进步一点点 1371

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

RCU检测CPU stall的原理

在系统中,有时可能会看到如下警告: INFO: rcu_sched self-detected stall on CPU 0-...: (9999 ticks this GP) idle=cee/140000000000001/0 softirq=64858/64858 fqs=4891 (t=10000 jiffies g=13416 c=13415 q=68) Task dump for CPU 0: my_debug_1 R running task 这是rcu的cpu

对的时间点 2万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Linux内核 失速(STALL) 警告说明文档翻译

kernel-4.14/Documentation/RCU/stallwarn.txt 如何使用RCU的处理器失速(CPU STALL)探测器 本文首先论述RCU的CPU stall探测器可以定位哪些类型的问题,然后论述如何用内核参数和Kconfig的选项微调探测器的功能。最后,本文介绍了stall 探测器的 “splat” 格式 什么情况下会导致 RCU CPU Stall 警告? 那么你的内核kernel打印了一个 RCU CPU stall 警告。下来就是想问“怎么导致的?”。 下面原因都可以导致 R

lxmega的专栏 1万+

Linux 系统报错 rcu_preempt detected stalls on CPUs/tasks

说在前面的一些废话: 这是什么错误我不知道,为什么出现我不知道! 那为什么还要把他写出来了,只是因为这个错误遇到了,而且浪费了我很多时间和精力。 故事留给自己看,解决办法就是,重新升级一下Linux系统内核。 这个问题出现在Reboot之后,不能进入不了系统,平均发生几率是40次左右出现一次。 之后重新升级完内核后没有出现。至于内核改了什么我也不知道。 Linux 系统报错如下: ...

weixin_34202952的博客 1万+

INFO: rcu_sched detected stalls on CPU/tasks

运行环境: ARCH:ARM Kernel:4.4.189 内核提示消息: 从图上可以看出提示消息:INFO:rcu_sched detected stalls on CPUs/tasks,这个提示是和RCU相关的。 第二行:数字4,表示是CPU核4 第三行:detected by 0,表示被CPU核0检测到了。 第五行:18322 18321 分别是当前进程号和父进程号。 关于RCU RCU(Read-Copy Update) 是Linux 2.6 内核开始引入的一种新的锁机制,与spinlock、rw

m0_37105371的博客 3万+

内存泄漏分析-luke

crash_arm64_unisoc> log [21880.692634] sipa_rm: sipa_rm_resource_consumer_release SIPA_RM_RES_CONS_WWAN_DL state changed 2->0 [21900.328018] sipa_dele: conn_thread dst=5, chan=120, type=5, flag=0x1, value=0x00000000 [21900.336137] sipa_dele: sipa_dele_on_c

Qiuuuuuuuuuushi的博客 1415

Linux 内核分析 rcu_sched self-detected stall on CPU

Linux 内核分析 rcu_sched self-detected stall on CPU问题分析

小立仔 1万+
上一篇: linux panic 问题定位
下一篇: Linux内核Crash分析
wdsfup
博客等级 码龄20年 31粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值