news 2026/5/1 11:15:02

Linux 调度延迟案例 (1):ALSA 播放延迟

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 调度延迟案例 (1):ALSA 播放延迟

文章目录

  • 1. 前言
  • 2. 现场
  • 3. 问题分析

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. 现场

通过trace-cmd抓如下事件:

  • ALSA事件:hwptr, hw_mask_param, applptr
  • 调度事件:sched_switch, sched_wakeup
  • 中断事件:irq_handler_entry, irq_handler_exit

具体数据如下:

latency-7395[002]22719.778930:hwptr:pcmC0D0c/sub0:POS:pos=16,old=26768,base=26752,period=64,buf=128latency-7395[002]22719.778932:hwptr:pcmC0D0c/sub0:POS:pos=16,old=26768,base=26752,period=64,buf=128latency-7395[002]22719.778934:hwptr:pcmC0D0c/sub0:POS:pos=16,old=26768,base=26752,period=64,buf=128latency-7395[002]22719.778937:hwptr:pcmC0D0c/sub0:POS:pos=48,old=26768,base=26752,period=64,buf=128latency-7395[002]22719.778938:applptr:pcmC0D0c/sub0:prev=26768,curr=26800,avail=0,period=64,buf=128latency-7395[002]22719.778941:hwptr:pcmC0D0p/sub0:POS:pos=96,old=26816,base=26752,period=64,buf=128latency-7395[002]22719.778942:applptr:pcmC0D0p/sub0:prev=26896,curr=26928,avail=48,period=64,buf=128latency-7395[002]22719.778949:sched_switch:latency:7395[0]S==>kworker/2:1:5386[120]<idle>-0[007]22719.778971:irq_handler_entry:irq=182name=snd_hda_intel:card0<idle>-0[007]22719.779013:hwptr:pcmC0D0c/sub0:IRQ:pos=48,old=26800,base=26752,period=64,buf=128<idle>-0[007]22719.779070:irq_handler_exit:irq=182ret=handled<idle>-0[007]22719.779073:irq_handler_entry:irq=182name=snd_hda_intel:card0<idle>-0[007]22719.779084:irq_handler_exit:irq=182ret=unhandled kworker/2:1-5386[002]22719.779162:sched_wakeup:latency:7395[0]CPU:002<idle>-0[007]22719.780474:irq_handler_entry:irq=182name=snd_hda_intel:card0<idle>-0[007]22719.780524:sched_wakeup:kworker/7:1:5655[120]CPU:007<idle>-0[007]22719.780567:hwptr:pcmC0D0p/sub0:IRQ:pos=48,old=26848,base=26752,period=64,buf=128<idle>-0[007]22719.780567:xrun:pcmC0D0p/sub0:XRUN:old=26928,base=26880,period=64,buf=128<idle>-0[007]22719.780699:irq_handler_exit:irq=182ret=handled<idle>-0[007]22719.780701:irq_handler_entry:irq=182name=snd_hda_intel:card0<idle>-0[007]22719.780729:irq_handler_exit:irq=182ret=unhandled<idle>-0[007]22719.780736:sched_switch:swapper/7:0[120]R==>kworker/7:1:5655[120]kworker/7:1-5655[007]22719.780744:sched_switch:kworker/7:1:5655[120]W==>swapper/7:0[120]kworker/2:1-5386[002]22719.790242:sched_switch:kworker/2:1:5386[120]R==>latency:7395[0]latency-7395[002]22719.790455:hw_mask_param:pcmC0D0p:0000/025ACCESS0000000000000000ffffffffffffffff00000000000000000000000000000009latency-7395[002]22719.790455:hw_mask_param:pcmC0D0p:0000/025FORMAT0000000000000000ffffffffffffffff00000000000000000000000000000404latency-7395[002]22719.790456:hw_mask_param:pcmC0D0p:0000/025SUBFORMAT0000000000000000ffffffffffffffff00000000000000000000000000000001

3. 问题分析

观察到有playbackXRUN日志:

<idle>-0[007]22719.780567:xrun:pcmC0D0p/sub0:XRUN:old=26928,base=26880,period=64,buf=128

何解?音频播放,必须严格按照设定的采样频率、周期进行数据填充,否则就会因为数据不足给的不及时而出现underrun现象,因此对实时性有一定的要求。场景中使用48000Hz 采样率周期长度为64个采样,这样,每个周期的时长为64/48000 = 1.333ms。从日志看,有好几个问题,但最为突出的是:进程latency-7395从时刻22719.778949被调度出去开始,到时刻22719.790242再次被调度进来,中间消耗了22719.790242 - 22719.790242 = 11.293ms,也就意味着,有约11.293ms向 playback 缓冲填充数据了,这远远的超过了一个周期64/48000 = 1.333ms;同时,结合hwptr, applptr,在 进程latency-7395被调度出去时,剩余的数据不可能支撑11.293ms的消耗,因此导致了playback underun。那么谁占住 CPU 不让进程latency-7395被调度?进程latency-7395从时刻22719.778949CPU-2被调度出去,然后CPU-2转去kworker/2:1:5386,然后就等待了11.293ms才被调度回来。进程latency-7395是一个实时进程,来自alsa-lib/test/latency.c,其优先级0,这怎么还让优先级120kworker/2:1:5386给占用了这么长时间呢?答案是当前测试内核内,调度 featureRT_RUNTIME_SHARE默认被关闭导致的,详见链接: https://lore.kernel.org/lkml/c596a06773658d976fb839e02843a459ed4c2edf.1479204252.git.bristot@redhat.com/

可以通过命令消除该补丁的影响:

sysctl-wkernel.sched_rt_runtime_us=1000000

然后再次测试,不再有XRUN发生,调查至此结束。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 5:41:16

VMware NSX 4.2 - Edge传输节点安装

&#x1f4dd; VMware NSX Edge 传输节点简介 1. Edge 传输节点的作用 服务承载设备&#xff1a;运行路由、防火墙、VPN、NAT 等网络与安全服务。&#xff08;有状态服务&#xff09;南北向流量网关&#xff1a;负责虚拟网络与物理网络之间的流量转发。与计算传输节点协同&am…

作者头像 李华
网站建设 2026/5/1 5:46:22

AI Agent的多语言支持:跨语言理解与生成

AI Agent的多语言支持:跨语言理解与生成 关键词:AI Agent、多语言支持、跨语言理解、跨语言生成、自然语言处理 摘要:本文围绕AI Agent的多语言支持展开,深入探讨了跨语言理解与生成的相关技术。首先介绍了该领域的背景,包括目的、预期读者、文档结构和术语表。接着阐述了…

作者头像 李华
网站建设 2026/5/1 7:29:35

云服务器运维实战:从环境搭建到安全加固全流程​

云服务器的高效运行离不开科学的运维管理&#xff0c;从基础环境搭建到进阶安全加固&#xff0c;每一步都直接影响系统稳定性与业务连续性。入门阶段需完成三大核心操作&#xff1a;首先是服务器连接&#xff0c;Linux 系统可通过 PuTTY、Xshell 工具或终端 SSH 命令连接&#…

作者头像 李华
网站建设 2026/5/1 9:58:14

云服务器成本管控:从粗放投入到精细运营

云服务器成本管控&#xff1a;从粗放投入到精细运营某跨境电商的降本实践具有代表性&#xff1a;通过预留实例&#xff08;RI&#xff09;覆盖80%基础负载&#xff0c;结合按需实例应对流量波动&#xff0c;使EC2计算成本下降42%&#xff1b;使用S3智能分层存储将归档数据存储成…

作者头像 李华
网站建设 2026/5/1 6:19:30

Segmentation Fault 调试指南:gdb + ASan + Valgrind 全流程实战

&#x1f9ed; 目录什么是 Segmentation Fault&#xff1f;从内存模型理解问题为什么很多 SegFault 不好找&#xff1f;——“错误不在崩的地方”演示环境准备&#xff08;Linux / GCC / gdb / ASan / Valgrind&#xff09;示例程序&#xff1a;两个看似简单却致命的 Buggdb 定…

作者头像 李华