[pulseaudio-discuss] 61ms delay in pa_simple_write()
Wu Fengguang
fengguang.wu at intel.com
Thu Sep 23 23:13:26 PDT 2010
On Fri, Sep 24, 2010 at 01:17:29PM +0800, Wu Fengguang wrote:
> Greetings,
>
> We are debugging a new QEMU USB audio model that works fine with alsa
> backend but drops samples from time to time with pulseaudio backend.
>
> Traces show that the pa_simple_write() call normally does its job
> quickly, but sometimes takes ~60ms to return (the last write=XXms
> field):
>
> L1 qpa_thread_out rpos = 1499, pa->decr = 1155, decr = 1155, pa->live = 0, write=0ms
> L2 qpa_thread_out rpos = 605, pa->decr = 1154, decr = 1154, pa->live = 0, write=0ms
> L3 qpa_thread_out rpos = 1670, pa->decr = 1065, decr = 1065, pa->live = 0, write=1ms
> L4 qpa_thread_out rpos = 736, pa->decr = 1114, decr = 1114, pa->live = 0, write=0ms
> L5 qpa_thread_out rpos = 1850, pa->decr = 1114, decr = 1114, pa->live = 0, write=0ms
> L6 qpa_thread_out rpos = 957, pa->decr = 1155, decr = 1155, pa->live = 0, write=0ms
> L7 qpa_thread_out rpos = 15, pa->decr = 1106, decr = 1106, pa->live = 0, write=0ms
> ==> L8 qpa_thread_out rpos = 1127, pa->decr = 1112, decr = 1112, pa->live = 936, write=61ms
> ==> L9 qpa_thread_out rpos = 1127, pa->decr = 2048, decr = 2048, pa->live = 0, write=0ms
>
> The 61ms delay in L8 overruns the ring buffer inside qemu (note the
> decr=2048 in L9; I ran qemu with QEMU_PA_SAMPLES=2048).
>
> Skimming through the pulseaudio code, my wild guess is there are two
> possible source of delays (I excluded kernel problems since ALSA works
> fine):
> 1) memory allocation
> 2) pulseaudio internal lock
> 3) blockable syscall
With "strace -Tp `pidof pulseaudio`", I do see several ppoll()
syscalls that take up to 59ms:
(sorted by time spent in the syscall)
==> 0.059522 ppoll
==> 0.059478 ppoll
==> 0.056892 ppoll
0.035356 ppoll
0.028646 ppoll
0.028407 ppoll
0.027576 ppoll
...
> I'm mainly suspecting (1). Basically any latency sensible application
> should do pre-allocation and to _absolutely avoid_ memory allocation
> during audio streaming. However I do see the pa_simple_write() calls
> into pa_stream_write() which in turn _might_ call malloc() in the end.
>
> I'm not sure if the pa_memblock_new[_user]() API takes care to
> preallocate _enough_ memory before playback. Can anyone kindly confirm
> that?
Hmm it seems there are zero memory allocation delays, so it's at least
not the root cause of the qemu delays in my case.
$ getdelays -dip `pidof pulseaudio`
print delayacct stats ON
printing IO accounting
PID 7412
CPU count real total virtual total delay total
81186 9808613000 9692671654 4396396593
IO count delay total
91 483460900
(note: the above line does not change during playback, so don't care)
SWAP count delay total
0 0
==> RECLAIM count delay total
==> 0 0
pulseaudio: read=1019904, write=4096, cancelled_write=0
Thanks,
Fengguang
More information about the pulseaudio-discuss
mailing list