Linux kernel CPU{0}上的rcu_抢占自检测暂停

Linux kernel CPU{0}上的rcu_抢占自检测暂停,linux-kernel,scheduling,Linux Kernel,Scheduling,我在我的英特尔rangeley板上运行一个应用程序,该板具有3.14.29-rt22内核 在上面跑。应用程序将运行两个线程,每个线程的优先级为39。周期性地持续1和2毫秒。 两个线程都将在连续while循环中运行,该循环将运行 仅在核心0上。 运行一段时间后,大约10分钟。当我按下ctrl+c时,它会给出下面的日志 **INFO: rcu_preempt self-detected stall on CPU { 0} (t=21000 jiffies g=2362 c=2361 q=207)*

我在我的英特尔rangeley板上运行一个应用程序,该板具有3.14.29-rt22内核 在上面跑。应用程序将运行两个线程,每个线程的优先级为39。周期性地持续1和2毫秒。 两个线程都将在连续while循环中运行,该循环将运行 仅在核心0上。 运行一段时间后,大约10分钟。当我按下ctrl+c时,它会给出下面的日志

**INFO: rcu_preempt self-detected stall on CPU { 0}  (t=21000 jiffies g=2362 c=2361 q=207)**
**sending NMI to all CPUs:
 NMI backtrace for cpu 1**

 CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.14.29ltsi-rt22-yocto-preempt-rt+ #1

 Hardware name: ADI Engineering RCC-VE/RCC-VE, BIOS ADI_RCCVE-01.00.00.04-nodebug 05/06/2015

task: ffff8802761a0000 ti: ffff8802761a8000 task.ti: ffff8802761a8000
RIP: 0010:[<ffffffff8100b451>]  [<ffffffff8100b451>]   native_read_tsc+0x1/0x20
RSP: 0018:ffff8802761abe28  EFLAGS: 00000003
RAX: 0000000000000000 RBX: ffffffff81e1acc0 RCX: 0000000000000000
RDX: 0000000000000001 RSI: 0000000000000202 RDI: ffffffff81e1acc0
RBP: ffff8802761abe38 R08: ffff8802761a8000 R09: 0000000000000001
R10: 0000000000000800 R11: 0000000000000000 R12: 000000000000003e
R13: 0000000000014e76 R14: ffff8802761abfd8 R15: ffff88027fc8cf00
FS:  0000000000000000(0000) GS:ffff88027fc80000(0000)   knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: 00007fabcd23f000 CR3: 0000000269589000 CR4: 00000000001007e0
Stack:
ffff8802761abe38 ffffffff8100b4a9 ffff8802761abe60 ffffffff810a6b73
0000000000000001 ffff8802761abfd8 ffffffff81edc030 ffff8802761abec0
ffffffff810b01a5 ffffffffffffff10 ffffffff8103b906 0000000000000000
Call Trace:
[<ffffffff8100b4a9>] ? read_tsc+0x9/0x20
[<ffffffff810a6b73>] ktime_get+0x43/0xc0
[<ffffffff810b01a5>] __tick_nohz_idle_enter+0x25/0x480
[<ffffffff8103b906>] ? native_safe_halt+0x6/0x10
[<ffffffff810b064a>] tick_nohz_idle_enter+0x4a/0x80
[<ffffffff8109a626>] cpu_startup_entry+0x46/0x290
[<ffffffff81031597>] start_secondary+0x1b7/0x210
**信息:CPU{0}上的rcu_抢占自检测暂停(t=21000 jiffies g=2362 c=2361 q=207)**
**将NMI发送到所有CPU:
cpu 1的NMI回溯跟踪**
CPU:1 PID:0通信:交换程序/1未受污染3.14.29ltsi-rt22-yocto-preempt-rt+#1
硬件名称:ADI工程RCC-VE/RCC-VE,BIOS ADI_RCCVE-01.00.00.04-nodebug 05/06/2015
任务:ffff8802761a0000 ti:ffff8802761a8000任务。ti:ffff8802761a8000
RIP:0010:[]本机读取tsc+0x1/0x20
RSP:0018:ffff8802761abe28 EFLAGS:00000003
RAX:0000000000000000 RBX:ffffffff81e1acc0 RCX:0000000000000000
RDX:000000000000000 1 RSI:0000000000000 202 RDI:FFFFFFFF 81E1ACC0
RBP:ffff8802761abe38 R08:ffff8802761a8000 R09:0000000000001
R10:0000000000000800 R11:0000000000000000 R12:000000000000003e
R13:0000000000014e76 R14:ffff8802761abfd8 R15:ffff88027fc8cf00
FS:0000000000000000(0000)GS:ffff88027fc80000(0000)KNLG:0000000000000000
CS:0010 DS:0000 ES:0000 CR0:00000000 8005003B
CR2:00007fabcd23f000 CR3:0000000 26958900 CR4:0000000000 1007E0
堆栈:
ffff8802761abe38 FFFFFFFFFF8100B4A9 ffff8802761abe60 ffffffff810a6b73
000000000000000 1 ffff8802761abfd8 FFFFFFFFFF81EDC030 ffff8802761abec0
FFFFFFFF 810B01A5 FFFFFFFFFFFFFF 10 FFFFFFFFFFFF8103B906 0000000000000000
呼叫跟踪:
[] ? 读取\u tsc+0x9/0x20
[]ktime\u get+0x43/0xc0
[]勾选nohz空闲输入+0x25/0x480
[] ? 本机\u安全\u暂停+0x6/0x10
[]勾选\u nohz\u idle\u输入+0x4a/0x80
[]cpu_启动_项+0x46/0x290
[]启动辅助+0x1b7/0x210
原因可能是什么?是因为我一直在使用CPU吗?
当我在控制台上从线程打印任何内容时,不会发生此崩溃。

是的,长时间连续使用高优先级线程的CPU(从调度程序的角度来看,1ms是一个较长的时间段)可能是RCU暂停的原因

从有关以下内容的文档中:

以下问题可能导致RCU CPU暂停 警告:

。。。配置抢占内核中CPU绑定的实时任务,可能 发生在RCU的中间抢占低优先级任务 阅读侧面临界部分。这尤其具有破坏性,如果 该低优先级任务不允许在任何其他CPU上运行, 在这种情况下,下一个RCU宽限期永远无法完成 最终将导致系统内存不足并挂起

。。。配置抢占RT内核中的CPU绑定实时任务 正在以比RCU softirq线程更高的优先级运行。 这将防止调用RCU回调, 在配置中,RCU内核将进一步阻止 RCU宽限期自完成之日起计算。无论哪种方式,都是 系统最终将耗尽内存并挂起

从高优先级线程执行任何系统调用(如
write()
到控制台)都会让内核执行一些针对系统维护的工作


可能,威尔也会有帮助。

所以我在引导过程中得到了与此惊人相似的东西,它会挂起,按下任何键(甚至num lock)都会将其解锁,几秒钟后再次挂起。每次开机都要做5-7次


罪魁祸首是,BIOS中的一个设置,AMD C1E支持被设置为Enabled,并将其设置为Auto或Disabled(测试两者)修复了我的问题!没有更多的摊位/挂起

谢谢你的快速回复。我想连续运行这个应用程序。我可以禁用RCU吗。
我可以禁用RCU吗?
-不可以。这是内核本身的一个实现。您可以禁用configuration
CONFIG\u PREEMPT\u RCU
(但这需要重新编译内核),因此用户空间进程不会抢占RCU read部分。但是在任何情况下,拥有高优先级的进程,并且长时间不放弃CPU是不好的。嗨,Tsyvarev,我在4.1.5-rt5内核上也尝试过同样的方法,我在这里没有遇到任何问题。@Tsyvarev我看不到linux-4.9.38中有
CONFIG\u PREEMPT
选项。哪里出了问题?“我看不出linux-4.9.38中有CONFIG_PREEMPT选项。”-该选项仍然受支持。例如:Linux内核中的
:2.6.13–2.6.39,3.0–3.19,4.0–4.20,5.0–5.7,5.8-rc+HEAD
很棒,也遇到了同样的问题,这个提示让我很开心。谢谢