“RT 节流已激活”+ UDP 数据包泛滥时内核发生恐慌

问题描述 投票:0回答:1

我有一个 Android 应用程序,它使用 UDP 广播(实际上是多播)在设备之间传递消息。在我的压力测试中,我有一个设置,其中多个设备通过 UDP 相互发送并接收彼此的响应。每个设备最多每 5 毫秒发送一个数据报包。由于我有 5 个设备发送数据,这意味着设备最多可以每 1 毫秒接收一次数据包。

问题是这会导致我的设备重新启动,通常在开始测试后约 10 秒内重新启动。通常,测试的 5 台设备中的 1-3 台会重新启动。

[  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() 上崩溃:

#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

我们确实在内核中启用了

CONFIG_PANIC_ON_RT_THROTTLING
。我尝试简单地禁用它(FWIW Google 设备的内核配置已禁用此功能),系统仍然崩溃,但在其他时候......内核日志中绝对没有任何内容,它会突然中断。

令人惊讶的是,从 5.1 到 8.1 的不同版本的 Android 中都会发生这种情况,显然是在不同的 Linux 内核版本中。所有设备都运行 Qualcomm CPU(添加

CONFIG_PANIC_ON_RT_THROTTLING
是由 Qualcomm 添加的)。

仅用一些常识来分析这一点,UDP 数据包传输必须由某个 RT 调度程序来处理...而系统需要对此进行限制的事实意味着我正在加载超出 CPU 容量的 CPU...这很难相信在现代 CPU 上通过发送 UDP 数据包是可能的(当然,为什么这会让内核恐慌)。

android linux networking udp broadcast
1个回答
0
投票

我看到这个问题很久以前就被问过。但我在 Khadas VIM3 上的 4.9.241 内核上遇到了同样的问题,并且应用程序大量使用了串行端口。

接下来 WA 帮助了我:

# Mitigate RT throttling issue (that cause kernel panic on Khadas)
echo -1 >/proc/sys/kernel/sched_rt_runtime_us
echo -1 >/proc/sys/kernel/sched_rt_period_us

参考:https://www.kernel.org/doc/Documentation/scheduler/sched-rt-group.txt
参考:https://doc.opensuse.org/documentation/leap/archive/42.1/tuning/html/book.sle.tuning/cha.tuning.taskscheduler.html

© www.soinside.com 2019 - 2024. All rights reserved.