我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Linux INFO: rcu_sched self-detected stall on CPU

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Linux INFO: rcu_sched self-detected stall on CPU

如果串口持续打印下面的信息,说明代码中出现了异常,程序一直占据了cpu不释放。cpu在调度中检测到了这种异常,在串口中打印出内核异常位置的调用栈。

这种检查内核缺省是打开的,CONFIG_RCU_CPU_STALL_TIMEOUT 参数是时间,如果cpu占据时间超过该参数,则会打印。在我调试的单板上缺省为60秒。

在openwrt系统上执行make kernel_menuconfig可以看到如下配置:



这种问题一般出现在内核程序出现了死循环的现象。因此通过调用栈信息很快能够找到程序的异常点。

[  814.604208] INFO: rcu_sched self-detected stall on CPU[  814.614448]  0-...: (1 GPs behind) idle=0e6/140000000000002/0 softirq=1740/1755 fqs=36948[  814.630874]   (t=78012 jiffies g=362 c=361 q=2868)[  814.640399] NMI backtrace for cpu 0[  814.647328] CPU: 0 PID: 1343 Comm: netifd Not tainted 4.14.195 #0[  814.659436] Stack : 00000000 806a0000 00000000 800727ac 806d0000 80667b78 00000000 00000000[  814.676060]         806299b8 87c09bec 87da631c 806a6a67 806247ac 00000001 87c09b90 53261622[  814.692683]         00000000 00000000 80810000 00007000 00000000 00000192 00000007 00000000[  814.709304]         00000000 806b0000 0009e0a0 00000000 80000000 806d0000 00000000 00000000[  814.725925]         806ac5e0 806a40cc 000000e0 806a0000 00000000 802aa118 00000000 80810000[  814.742548]         ...[  814.747401] Call Trace:[  814.752275] [<8000c7b0>] show_stack+0x58/0x100[  814.761124] [<80540ca4>] dump_stack+0xa4/0xe0[  814.769786] [<80547cc4>] nmi_cpu_backtrace+0xe4/0x108[  814.779825] [<80547db0>] nmi_trigger_cpumask_backtrace+0xc8/0x168[  814.791949] [<800874f8>] rcu_dump_cpu_stacks+0xc4/0x13c[  814.802334] [<80086948>] rcu_check_callbacks+0x3b4/0x8b8[  814.812896] [<8008a0b8>] update_process_times+0x34/0xdc[  814.823299] [<8009b168>] tick_handle_periodic+0x34/0xd0[  814.833693] [<8036c9a4>] gic_compare_interrupt+0x70/0x80[  814.844257] [<8007a098>] handle_percpu_devid_irq+0xbc/0x1a8[  814.855334] [<800742f0>] generic_handle_irq+0x40/0x58[  814.865387] [<8025cd04>] gic_handle_local_int+0x9c/0xe8[  814.875772] [<8025cec4>] gic_irq_dispatch+0x10/0x20[  814.885465] [<800742f0>] generic_handle_irq+0x40/0x58[  814.895521] [<8055eb8c>] do_IRQ+0x1c/0x2c[  814.903484] [<8025c580>] plat_irq_dispatch+0xfc/0x138[  814.913523] [<80007588>] except_vec_vi_end+0xb8/0xc4[  814.923401] [<80033fb4>] irq_exit+0xac/0xc8[  823.027079] mtk_soc_eth 1e100000.ethernet eth0: port 3 link down[  827.873748] mtk_soc_eth 1e100000.ethernet eth0: port 3 link up
[  634.574208] INFO: rcu_sched self-detected stall on CPU[  634.584461]  0-...: (1 GPs behind) idle=0e6/140000000000002/0 softirq=1740/1755 fqs=28760[  634.600887]   (t=60009 jiffies g=362 c=361 q=2850)[  634.610412] NMI backtrace for cpu 0[  634.617342] CPU: 0 PID: 1343 Comm: netifd Not tainted 4.14.195 #0[  634.629451] Stack : 00000000 806a0000 00000000 800727ac 806d0000 80667b78 00000000 00000000[  634.646075]         806299b8 87c09bec 87da631c 806a6a67 806247ac 00000001 87c09b90 53261622[  634.662698]         00000000 00000000 80810000 00006850 00000000 00000174 00000007 00000000[  634.679319]         00000000 806b0000 00096b7e 00000000 80000000 806d0000 00000000 00000000[  634.695940]         806ac5e0 806a40cc 000000e0 806a0000 00000000 802aa118 00000000 80810000[  634.712562]         ...[  634.717417] Call Trace:[  634.722293] [<8000c7b0>] show_stack+0x58/0x100[  634.731147] [<80540ca4>] dump_stack+0xa4/0xe0[  634.739811] [<80547cc4>] nmi_cpu_backtrace+0xe4/0x108[  634.749850] [<80547db0>] nmi_trigger_cpumask_backtrace+0xc8/0x168[  634.761976] [<800874f8>] rcu_dump_cpu_stacks+0xc4/0x13c[  634.772365] [<80086948>] rcu_check_callbacks+0x3b4/0x8b8[  634.782933] [<8008a0b8>] update_process_times+0x34/0xdc[  634.793340] [<8009b168>] tick_handle_periodic+0x34/0xd0[  634.803735] [<8036c9a4>] gic_compare_interrupt+0x70/0x80[  634.814303] [<8007a098>] handle_percpu_devid_irq+0xbc/0x1a8[  634.825378] [<800742f0>] generic_handle_irq+0x40/0x58[  634.835435] [<8025cd04>] gic_handle_local_int+0x9c/0xe8[  634.845820] [<8025cec4>] gic_irq_dispatch+0x10/0x20[  634.855513] [<800742f0>] generic_handle_irq+0x40/0x58[  634.865572] [<8055eb8c>] do_IRQ+0x1c/0x2c[  634.873537] [<8025c580>] plat_irq_dispatch+0xfc/0x138[  634.883577] [<80007588>] except_vec_vi_end+0xb8/0xc4[  634.893458] [<80033fb4>] irq_exit+0xac/0xc8

 官方网站上对RCU告警的解释如下:
https://www.kernel.org/doc/Documentation/RCU/stallwarn.txt

什么情况会打印RCU告警?

  • CPU在RCU的读逻辑里面循环;
  • CPU在关中断中循环;
  • CPU在关闭抢占的逻辑中循环;
  • CPU在禁用下半部循环的逻辑中循环;
  • 对于非抢占内核,可以在任何地方循环,且不需要调用schedule()函数,如果在内核中的循环是真正预期和理想的行为,您可能需要添加一些调用cond_resched()。
  • 如果通过串口连接去重启Linux系统,并且串口日志上打印启动时间。例如,使用115K的波特率连接串口,可能会来不及打印启动日志,进而导致RCU告警,特别是在添加了调试日志的时候,更容易出现;
  • 任何阻止RCU的宽限期k线程正常运行的东西。就会在控制台上报RCU stall的告警日志,此日志将包括k线程上一次运行的时间,以及下一次期望运行的时间。如果rcu线程饿死的话,还会打印额外的调试信息。

  • 在CONFIG_PREEMPT内核中的一个与cpu绑定的实时任务,这可能会碰巧在RCU中间抢占一个低优先级任务读端关键部分。这是尤其有害的,如果这个低优先级的任务不允许在任何其他CPU上运行,在这种情况下,下一个RCU宽限期永远无法完成,这一点最终会导致系统内存不足并挂起。当系统正在耗尽自身的过程中内存中,你可能会看到停止警告消息。

  • 在CONFIG_PREEMPT_RT内核中的一个受cpu绑定的实时任务,正在以比RCU软件线程更高的优先级运行。这将导致RCU回调永远不被调用,而在CONFIG_PREEMPT_RCU内核中则会进一步防止RCU宽限期。无论哪种方式系统最终会耗尽内存并挂起。在CONFIG_PREEMPT_RCU的案例中,你可能会看到RCU告警。

来源地址:https://blog.csdn.net/l00102795/article/details/129820387

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Linux INFO: rcu_sched self-detected stall on CPU

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

目录