我在我的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吗? 当我从控制台上的线程打印任何内容时,不会发生这种崩溃。
答案 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(已测试两者)为我解决了问题!没有更多的摊位/挂起!