Bug#482997: asterisk: Extremely choppy sound and high CPU usage
Faidon Liambotis
paravoid at debian.org
Tue May 27 17:20:28 UTC 2008
tags 482997 + confirmed
thanks
Torgeir Skjøtskift wrote:
> When making calls involving IAX2 channels, sound is extremely choppy
> and CPU usage spikes.
>
> Messages on the CLI indicate problems while channels are active:
> WARNING[12301]: File chan_iax2.c, Line 4436 (socket_read): Received
> mini frame before first full voice frame
>
> IAX2 registry entries become unregistered
> IAX2 peers become UNREACHABLE
>
> This problem seems to be caused by the 2etch4 update, since it works
> fine in 2etch3 (see http://www.debian.org/security/2008/dsa-1563).
>
> To replicate:
> Set asterisk console debug and verbose to 100
> SIP phones on machine A
> via IAX2 trunk to machine B
> via IAX2 trunk back to meetme room on machine A
>
> Creating 5-10 simultaneous calls should reveal the problem.
This is indeed a regression from the versions before the security fix.
upstream has fixed this with a commit[1] with the following description:
Merge changes from team/russell/iax2_find_callno_1.2 These
changes address a critical performance issue introduced in the
latest release. The fix for the latest security issue included a
change that made Asterisk randomly choose call numbers to make
them more difficult to guess by attackers. However, due to some
inefficient (this is by far, an understatement) code, when
Asterisk chose high call numbers, chan_iax2 became unusable after
just a small number of calls. On a small embedded platform, it
would not be able to handle a single call. On my Intel Core 2 Duo
@ 2.33 GHz, I couldn't run more than about 16 IAX2 channels.
Ouch. These changes address some performance issues of the
find_callno() function that have bothered me for a very long
time. On every incoming media frame, it iterated through every
possible call number trying to find a matching active call. This
involved a mutex lock and unlock for each call number checked.
So, if the random call number chosen was 20000, then every media
frame would cause 20000 locks and unlocks. Previously, this
problem was not as obvious since Asterisk always chose the lowest
call number it could. A second container for IAX2 pvt structs has
been added. It is an astobj2 hash table. When we know the remote
side's call number, the pvt goes into the hash table with a hash
value of the remote side's call number. Then, lookups for
incoming media frames are a very fast hash lookup instead of an
absolutely insane array traversal. In a quick test, I was able to
get more than 3600% more IAX2 channels on my machine with these
changes.
There is another regression[2] thas has been similarly fixed in 1.2.28.1.
It is, unfortunately, a huge commit, since it backports various stuff
(astobj2) from 1.4.
But I don't see another option to be honest and neither did upstream --
and 1.2 is in their deep-freeze state, similar to our own (security
fixes and grave bugs only).
security team, what do you think?
Should I prepare a new version with these changes and upload it to
security-proposed-updates?
Regards,
Faidon
1: http://svn.digium.com/view/asterisk?view=rev&revision=115296
2: http://svn.digium.com/view/asterisk?view=rev&revision=115564
More information about the Pkg-voip-maintainers
mailing list