Asterisk服务器压测遇64路呼叫端口耗尽问题求助
解决Asterisk压力测试中64路呼叫后端口耗尽的问题
从你的描述和错误日志来看,核心问题是RTP/RTCP媒体端口资源耗尽——你成功注册5000个SIP账号只涉及信令端口,和媒体端口是完全分离的资源,而每路活跃呼叫都需要占用一对RTP/RTCP端口,当达到64路时端口池被耗尽。下面是具体的排查方向和解决方案:
1. 检查Asterisk的RTP端口范围配置
Asterisk通过rtp.conf文件管理RTP端口池,默认范围通常是10000-20000,理论上能支持约5000路并发呼叫(每路呼叫需要1个RTP端口+1个对应RTCP端口,比如RTP用偶数、RTCP用奇数)。但如果你的配置被修改过,就可能出现端口不足:
- 打开
/etc/asterisk/rtp.conf(路径可能因安装方式不同变化) - 确认
rtpstart和rtpend参数,比如:
如果范围被设置得极小(比如rtpstart=10000 rtpend=20000rtpstart=50000且rtpend=50127),刚好只能支持64路呼叫(128个端口),完全匹配你遇到的问题。修改范围后重启Asterisk生效。
2. 检查PJSIP客户端的RTP端口配置
从日志里的pjsua_call.c、pjsua_media.c可以看出,你是用PJSIP客户端发起呼叫。PJSUA默认的RTP端口范围可能有限制,需要确保客户端有足够端口可用:
- 如果是脚本调用pjsua,可添加参数指定端口范围:
这里pjsua --media-rtp-port=10000 --media-rtp-port-range=10000media-rtp-port-range设为10000,意味着从10000开始可使用10000个端口,足够支撑大量并发呼叫。 - 如果用配置文件,在
pjsua.conf里添加:media_rtp_port = 10000 media_rtp_port_range = 10000
3. 验证端口占用情况
确认是否真的是端口被占满,或有其他程序占用了RTP端口范围:
- 在Linux系统上,用
ss命令查看当前RTP端口使用情况:
替换成你的实际RTP端口范围,查看已使用端口数量是否接近上限。ss -anp | grep -E '(10000:20000)' - 检查是否有其他服务(比如流媒体服务、其他VoIP软件)占用了这个端口范围,导致Asterisk和PJSUA无法获取可用端口。
4. 系统级端口限制排查
虽然注册5000个SIP账号没问题,但系统的端口范围限制也可能影响媒体端口:
- 查看Linux本地端口范围:
默认通常是cat /proc/sys/net/ipv4/ip_local_port_range32768 60999,如果你的RTP端口范围设置在这个区间内,可能和系统自动分配的端口冲突。建议把RTP端口范围设到系统本地端口范围之外(比如10000-20000),避免冲突。
5. 排除Asterisk并发呼叫软限制
虽然日志明确是端口问题,也可以快速确认下Asterisk是否有并发呼叫的软限制:
- 检查
asterisk.conf里的maxcalls参数,确保没有设置过小的值(默认通常是0,即无限制)。
按照以上步骤排查后,应该能解决64路呼叫后端口耗尽的问题。
内容的提问来源于stack exchange,提问作者Wesley Schravendijk
相关产品推荐
相关产品推荐

