rcu_preempt在CPU {0}上自检失速

时间:2016-02-15 04:02:45

标签: linux-kernel scheduling

我在我的intel rangeley板上运行一个应用程序,它有3.14.29-rt22内核     在它上面跑。应用程序将运行两个线程,每个线程为pri: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吗? 当我从控制台上的线程打印任何内容时,不会发生这种崩溃。

2 个答案:

答案 0 :(得分:3)

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

有关RCU stall detector的文档:

  

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

     

... CONFIG_PREEMPT内核中的CPU绑定实时任务,可能是       碰巧抢占RCU中间的低优先级任务       阅读侧临界区。如果这是特别有害的       该低优先级任务不允许在任何其他CPU上运行,       在这种情况下,下一个RCU宽限期永远不会完成,其中       最终会导致系统内存不足并挂起。

     

... CONFIG_PREEMPT_RT内核中的CPU绑定实时任务       运行的优先级高于RCU softirq线程。       这将阻止RCU回调被调用,       并且在CONFIG_PREEMPT_RCU内核中将进一步阻止       RCU宽限期从此完成。无论哪种方式,       系统最终会耗尽内存并挂起。

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

可能sched_yield也会有所帮助。

答案 1 :(得分:2)

所以我在启动过程中得到的东西非常类似于它,它会挂起并按任意键(即使是num lock)也会挂起它并在几秒后再次挂起。不得不每次启动5-7次!

罪魁祸首是,BIOS中的设置,AMD C1E Support设置为Enabled并将其设置为Auto或Disabled(已测试两者)为我解决了问题!没有更多的摊位/挂起!