You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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=20000
    
    如果范围被设置得极小(比如rtpstart=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=10000
    
    这里media-rtp-port-range设为10000,意味着从10000开始可使用10000个端口,足够支撑大量并发呼叫。
  • 如果用配置文件,在pjsua.conf里添加:
    media_rtp_port = 10000
    media_rtp_port_range = 10000
    

3. 验证端口占用情况

确认是否真的是端口被占满,或有其他程序占用了RTP端口范围:

  • 在Linux系统上,用ss命令查看当前RTP端口使用情况:
    ss -anp | grep -E '(10000:20000)'
    
    替换成你的实际RTP端口范围,查看已使用端口数量是否接近上限。
  • 检查是否有其他服务(比如流媒体服务、其他VoIP软件)占用了这个端口范围,导致Asterisk和PJSUA无法获取可用端口。

4. 系统级端口限制排查

虽然注册5000个SIP账号没问题,但系统的端口范围限制也可能影响媒体端口:

  • 查看Linux本地端口范围:
    cat /proc/sys/net/ipv4/ip_local_port_range
    
    默认通常是32768 60999,如果你的RTP端口范围设置在这个区间内,可能和系统自动分配的端口冲突。建议把RTP端口范围设到系统本地端口范围之外(比如10000-20000),避免冲突。

5. 排除Asterisk并发呼叫软限制

虽然日志明确是端口问题,也可以快速确认下Asterisk是否有并发呼叫的软限制:

  • 检查asterisk.conf里的maxcalls参数,确保没有设置过小的值(默认通常是0,即无限制)。

按照以上步骤排查后,应该能解决64路呼叫后端口耗尽的问题。

内容的提问来源于stack exchange,提问作者Wesley Schravendijk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:53:06