这篇写什么?
TV 上开杜比 / MS12 时,有时会看到:
- audioserver(或 audio HAL 服务进程)某颗核长期 100%
- 卡顿、发热、调度抖动一起出现
常见原因不是「业务突然多写了十倍代码」,而是 重计算线程和主音频路径挤在同一两颗核上。本次修法很直接:把 MS12 工作线程 从 CPU2/3 挪到 CPU6/7。
一句话:
MS12 很吃 CPU
→ 原先亲和 CPU2/3,易与主路径抢核、单核打满
→ dolby_ms12_threadloop 改绑 CPU6/7
→ 负载分开,单核 100% 缓解

相关:抓 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/atrace看DOLBY_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 挤一张小板凳——给它单独两颗核。
相关阅读
评论
还没有评论,来做第一个吧
读完了不评论,作者会以为你在沉思