Android &引用;RT节流已激活“+;淹没UDP数据包时出现内核死机
我有一个Android应用程序,它使用UDP广播(实际上是多播)在设备之间传递消息。在我的压力测试中,我有一个设置,我有多个设备通过UDP相互发送和接收响应。最多每台设备每5毫秒发送一个数据报数据包。因为我有5台设备发送数据包,这意味着一台设备可以每1ms接收一次数据包 问题是这会导致我的设备重新启动,通常在启动测试后的10秒内。通常,测试中的5台设备中有1-3台会重新启动Android &引用;RT节流已激活“+;淹没UDP数据包时出现内核死机,android,linux,networking,udp,broadcast,Android,Linux,Networking,Udp,Broadcast,我有一个Android应用程序,它使用UDP广播(实际上是多播)在设备之间传递消息。在我的压力测试中,我有一个设置,我有多个设备通过UDP相互发送和接收响应。最多每台设备每5毫秒发送一个数据报数据包。因为我有5台设备发送数据包,这意味着一台设备可以每1ms接收一次数据包 问题是这会导致我的设备重新启动,通常在启动测试后的10秒内。通常,测试中的5台设备中有1-3台会重新启动 [ 131.986546] sched: RT throttling activated for rt_rq fffff
[ 131.986546] sched: RT throttling activated for rt_rq ffffffc0ac098e50 (cpu 1)
[ 131.986546] potential CPU hogs:
[ 131.986546] msm_thermal:fre (307)
[ 132.000113] ------------[ cut here ]------------
[ 132.004692] kernel BUG at XXX/kernel/kernel/sched/rt.c:866!
[ 132.013583] Internal error: Oops - BUG: 0 [#1] PREEMPT SMP
[ 132.019101] Modules linked in: XXX core_ctl(PO) qdrbg_module(O) qcrypto_module(O)
[ 132.026953] CPU: 1 PID: 307 Comm: msm_thermal:fre Tainted: P W O 3.10.84-g2e3fe32-00061-gf40a46d #6
查看一个设备的内核源代码中的rt.c,它在下面的BUG()上崩溃:
我们确实在内核中启用了CONFIG\u PANIC\u ON\u RT\u THROTTLING
。我试着简单地禁用它(FWIW Google为其设备配置的内核已禁用),系统仍然崩溃,但在其他一些点。。。由于内核日志中没有任何内容,它只是突然中断
令人惊讶的是,这种情况在5.1到8.1的不同版本的Android中发生,显然是在不同的Linux内核版本中。所有设备都运行高通公司的CPU(高通公司增加了CONFIG\u PANIC\u ON\u RT\u THROTTLING
)
只是用一些常识分析一下,UDP数据包传递必须由一些RT调度器来处理。。。而事实上,系统需要节流这意味着我加载的CPU超过了它的容量。。。很难相信在现代CPU上通过发送UDP数据包就可以做到这一点(当然,这也是为什么会使内核恐慌的原因)
#ifdef CONFIG_PANIC_ON_RT_THROTTLING
/*
* Use pr_err() in the BUG() case since printk_sched() will
* not get flushed and deadlock is not a concern.
*/
pr_err("%s", buf);
BUG();
#else
printk_deferred("%s", buf);
#endif