KunSpace
返回博客

audioserver 单核打满:把 MS12 线程绑到 CPU6/7

2026年6月28日
尚无阅读

读完了?别空手走啊 😏

这行字出现时,你的大拇指应该已经 itch 了

写评论

读完了不评论,作者会以为你在沉思

这篇写什么?

TV 上开杜比 / MS12 时,有时会看到:

  • audioserver(或 audio HAL 服务进程)某颗核长期 100%
  • 卡顿、发热、调度抖动一起出现

常见原因不是「业务突然多写了十倍代码」,而是 重计算线程和主音频路径挤在同一两颗核上。本次修法很直接:把 MS12 工作线程 从 CPU2/3 挪到 CPU6/7

一句话:

MS12 很吃 CPU
  → 原先亲和 CPU2/3,易与主路径抢核、单核打满
  → dolby_ms12_threadloop 改绑 CPU6/7
  → 负载分开,单核 100% 缓解

MS12 绑核到 CPU6/7

相关:抓 atrace 看 CPU 占用MS12 DRC 模式


一、现象

观察 说明
进程 audioserver / android.hardware.audio.service-* 一侧很忙
CPU 单核 经常顶到 100%
场景 杜比解码、MS12 持续跑(HDMI / OTT 等)

「单核 100%」比「八核各 30%」更伤:同一核上的实时音频线程会互相抢,延迟和 xrun 风险都上去。


二、思路:亲和性(CPU affinity)分流

Linux 可用 sched_setaffinity 把线程限制在指定 CPU 集合上运行。

原先 MS12 线程循环里:

/* affinity the thread to cpu 2/3 which has few IRQ */
aml_audio_set_cpu23_affinity();

意图是绑到 IRQ 较少 的核,减少被打断。但在具体 SoC / 产品调度上,2/3 可能仍和 audioserver 其它热点挤在一起,表现就是 单核打满

改法:MS12 改绑到 CPU6 / CPU7(通常是另一簇、相对更「空」或专留给重负载的核——以板级拓扑为准)。


三、改动要点

1)dolby_ms12_threadloop:换亲和函数

aml_set_thread_priority("DOLBY_MS12", ms12->dolby_ms12_threadID);

// 原:aml_audio_set_cpu23_affinity();
aml_audio_set_cpu67_affinity();

while ((ms12->dolby_ms12_thread_exit == false) && (ms12->dolby_ms12_enable)) {
    // scheduler_run ...
}

只动 MS12 线程 的绑核,不等于把整个 audioserver 进程迁走;其它线程仍按系统调度,但最重的那条环不再死磕 2/3。

2)新增 aml_audio_set_cpu67_affinity

void aml_audio_set_cpu67_affinity()
{
    cpu_set_t cpuSet;
    CPU_ZERO(&cpuSet);
    CPU_SET(6, &cpuSet);
    CPU_SET(7, &cpuSet);
    int status = sched_setaffinity(0, sizeof(cpu_set_t), &cpuSet);
    if (status) {
        ALOGW("%s(), failed to set cpu affinity", __FUNCTION__);
    }
}
含义
CPU_SET(6/7) 允许跑在 6 或 7
sched_setaffinity(0, ...) 0 = 当前线程
失败只打 log 绑核失败时仍可跑,但要靠监控发现

头文件声明 aml_audio_set_cpu67_affinity(),与原有 aml_audio_set_cpu23_affinity() 并列。


四、为什么这样有效?

之前 之后
MS12 + 其它音频热点易同挤 2/3 MS12 固定在 6/7
单核易 100% 重负载与主路径分开
实时线程互相抢同一核 争用下降,毛刺减少

注意:这是 工程分流,不是算法优化。若 6/7 本身也忙(别的模块也绑过去),还要再看拓扑与 top/atrace


五、验证与注意

验证

  • 复现原「单核 100%」场景(杜比片 / HDMI)
  • top -H / atraceDOLBY_MS12 是否在 CPU6/7
  • audioserver 单核占用是否下降
  • 听感无新增卡顿、掉字、xrun

注意

说明
核号因平台而异 6/7 是该产品拓扑上的选择;换 SoC 要重测
别和大小核策略打架 确认 6/7 适合跑持续 DSP 类负载
权限 / 失败 sched_setaffinity 失败时要有 log,避免「以为绑了其实没有」
与 IRQ 的权衡 原注释写 2/3 IRQ 少;改 6/7 后要用实机确认不被中断打爆

六、小结

项目 内容
现象 audioserver 侧单核 CPU 经常 100%
手段 MS12 线程亲和性 CPU2/3 → CPU6/7
关键点 aml_audio_set_cpu67_affinity + dolby_ms12_threadloop 调用更换
本质 把最重的实时环挪到更合适的核上,给主路径腾地方

口诀:MS12 太沉,别和 audioserver 挤一张小板凳——给它单独两颗核。


相关阅读

评论

还没有评论,来做第一个吧

读完了不评论,作者会以为你在沉思