freeswitch带媒体压力测试方案

概述
原本的计划是使用sipp完成带媒体压力测试,但是实际测试过程中发现sipp的媒体处理功能有问题(也有可能是我使用的姿势不对)。
sipp在带媒体的情况下(600路并发开始),出现大量的不响应和响应延迟,UAC和UAS都有该问题,猜测是sipp内部处理大量媒体的情况下,业务逻辑出现阻塞。
新的方案采用2台fs对接,增加的1台fs模拟UAC和UAS,使用python脚本发起呼叫并控制并发。
环境
centos7.9
freeswitch 1.10.7
python2.7.5
freeswitch压力测试服务器配置,cpu96线程核,内存32G。
freeswitch模拟服务器配置,cpu16线程核,内存32G。
对接方案
2台fs对接带媒体压测方案,见图。

fs配置
fs压力测试服务器,IP地址为192.168.1.2,开放3060和5066端口。
压测服务器的呼叫A路从3060端口进入,从5066端口呼出B路。拨号计划如下。
cat sbc-dp.xml
<include>
<X-PRE-PROCESS cmd="set" data="callout_answer_timeout=60"/>
<context name="out2in">
<extension name="sbc-out2in" continue="true">
<condition field="${acl(${network_addr} 192.168.1.1/32)}" expression="true"/>
<condition field="destination_number" expression="^(\d+)$">
<action application="limit" data="hash cps all 500/1 !EXCHANGE_ROUTING_ERROR"/>
<action application="limit" data="hash capacity all 5000 !EXCHANGE_ROUTING_ERROR"/>
<action application="set" data="effective_caller_id_name=_undef_" />
<action application="set" data="effective_caller_id_number=${translate(${caller_id_number} GB-CALLER-IN)}" />
<action application="set" data="destination_number=${translate(${destination_number} GB-DEST-IN)}" />
<action application="set" data="inherit_codec=true"/>
<action application="export" data="absolute_codec_string=G729,PCMA" />
<action application="export" data="rtp_codec_negotiation=greedy" />
<action application="set" data="sip_copy_custom_headers=false"/>
<action application="export" data="passthrough180=true" />
<action application="export" data="ringback=${cn-ring}"/>
<action application="bridge" data="{sip_invite_call_id=${sip_call_id}
}sofia/external5066/sip:${destination_number}@192.168.1.1:5080"/>
</condition>
</extension>
</context>
</include>
fs模拟服务器,IP地址为192.168.1.1,开放5080端口,呼入呼出都使用5080端口。
模拟UAS侧的呼叫处理,拨号计划如下。
cat test.xml
<include>
<context name="public">
<extension name="sbc-uas" continue="true">
<condition field="destination_number" expression="^(\d+)$">
<action application="set" data="inherit_codec=true"/>
<action application="export" data="absolute_codec_string=PCMA" />
<action application="export" data="rtp_codec_negotiation=greedy" />
<action application="pre_answer" />
<action application="sleep" data="500" />
<action application="answer" />
<action application="playback" data="/usr/local/freeswitch/sounds/ponce-preludio-in-e-major" />
</condition>
</extension>
</context>
</include>
其中的playback放音文件要准备多个格式的文件,防止UAS侧因为转码而消耗cpu。
ll /usr/local/freeswitch/sounds/
-rw-r--r--. 1 root root 140220 4月 6 11:20 ponce-preludio-in-e-major.G729
-rw-r--r--. 1 root root 1121760 4月 6 11:20 ponce-preludio-in-e-major.PCMA
-rw-r--r--. 1 root root 2243628 10月 12 14:09 ponce-preludio-in-e-major.wav
模拟UAC侧的呼叫发起由python脚本实现,见下一章。
python脚本
python脚本中使用fs的esl接口对接,通过循环调用fs的originate接口发起呼叫,通过参数方式设置cps、duration、capacity等信息,通过配置文件方式设置主被叫号码。
cat test-media.py
# coding=utf-8
#!/usr/bin/python2
#add by zr 20230404
#大并发场景下的语音媒体流压力测试
#根据配置的号码,批量并发拨测
import ESL
import time
import sys
#USAGE: python test-media.py cps duration calltotal
#PS: python test-media.py 10 30 100
cps = int(sys.argv[1])
duration = int(sys.argv[2])
calltotal = int(sys.argv[3])
callinterval = float(1)/cps
print('cps=%d, duration=%d, calltotal=%d, callinterval=%f' % (cps, duration, calltotal, callinterval))
con = ESL.ESLconnection('localhost', '8021', 'ClueCon')
if con.connected():
pass
# con.events('plain', 'CHANNEL_CREATE')
#con.events('plain', 'CHANNEL_ANSWER')
#con.events('plain', 'CHANNEL_HANGUP')
else:
print("ESLconnection failed")
exit()
fo = open('./test_multi.ini', 'r')
while calltotal > 0:
line = fo.readline().strip()
if not line:
print('line is null')
fo.seek(0)
time.sleep(callinterval)
continue
if line.startswith('#'):
print('line is ###')
time.sleep(callinterval)
continue
calltotal = calltotal - 1
caller, callee = line.split(' ')
print('line=%s, %s' % (caller, callee))
callstr = ("originate {origination_caller_id_number=%s}"
"[absolute_codec_string=^^:G729:PCMA]"
"[execute_on_answer='sched_hangup +%d']sofia/external/%s@192.168.1.2:3060 "
"&echo()"
% (caller, duration, callee))
print('callstr=%s' % (callstr))
con.bgapi(callstr)
time.sleep(callinterval)
fo.close()
con.disconnect()
配置文件如下。
cat test_multi.ini
#caller callee
10000 20000
10001 20001
10002 20002
测试
使用python脚本发起呼叫测试。
脚本参数含义为,每秒发起1通,接通后10秒挂断,总共发起2通呼叫。
python test-media.py 1 10 2
cps=1, duration=10, calltotal=2, callinterval=1.000000
line is ###
line=10000, 20000
callstr=originate {origination_caller_id_number=10000}[absolute_codec_string=^^:G729:PCMA][execute_on_answer='sched_hangup +10']sofia/external/20000@192.168.1.2:3060 &echo()
line=10001, 20001
callstr=originate {origination_caller_id_number=10001}[absolute_codec_string=^^:G729:PCMA][execute_on_answer='sched_hangup +10']sofia/external/20001@192.168.1.2:3060 &echo()
总结
通过修改UAC侧的python脚本中的“absolute_codec_string”变量,和UAS侧的dialplan中的“absolute_codec_string”变量,可以对不同的媒体流方式进行压力测试。
脚本命令使用“python test-media.py 44 50 44000”,即每秒发起44通呼叫,接通50秒后挂断,总共发起44000通呼叫。
SBC的AB路媒体为PCMA-PCMA,压测结果如下。
82sps,4100session,cpu4.5%,A路带宽占用162Mbps,B路带宽占用162Mbps。
SBC的AB路媒体为G729-G729,压测结果如下。
82sps,4100session,cpu5.5%,A路带宽占用59Mbps,B路带宽占用59Mbps。
SBC的AB路媒体为G729-PCMA,转码场景压测结果如下。
42sps,2096session,cpu37%,A路带宽占用31Mbps,B路带宽占用85Mbps。
62sps,3176session,cpu60%,A路带宽占用46Mbps,B路带宽占用129Mbps。
80sps,4000session,cpu86%,A路带宽占用58Mbps,B路带宽占用160Mbps。
空空如常
求真得真
freeswitch带媒体压力测试方案的更多相关文章
- 4分钟apache自带ab压力测试工具使用: 2015.10.4
2015.10.44分钟apache自带ab压力测试工具使用:win8.1 wampserver2.5 -Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b 可以参考一下部 ...
- win8.1上wamp环境中利用apache自带ab压力测试工具使用超简单讲解
2015.10.4apache自带ab压力测试工具使用:本地环境:win8.1 wampserver2.5 -Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b 可以参考一 ...
- 网站服务器压力Web性能测试(1):Apache Bench:Apache自带服务器压力测试工具
一个网站或者博客到底能够承受多大的用户访问量经常是我们在用VPS或者独立服务器搭建网站了最关心的问题,还有不少人喜欢对LNMP或者LAMP进行一些优化以便提高Web性能,而优化后到底有多大的效果,就需 ...
- PHP测试与优化(1)-- Apache自带的压力测试工具ab(apache bench) - 简单使用
ab是apache自带的网站压力测试工具,能够测试网站在一定时间内的发生高并发时的反应. 使用 1.进入apache的bin文件夹 2.模拟并发级别为100,请求数为1000个的api数据请求数量测试 ...
- mysql 自带的压力测试
注意mysqlslap 是mysql5.1之后新添加的功能,之前的版本是没有此功能的
- (转)MySQL自带的性能压力测试工具mysqlslap详解
mysqlslap 是 Mysql 自带的压力测试工具,可以模拟出大量客户端同时操作数据库的情况,通过结果信息来了解数据库的性能状况 mysqlslap 的一个主要工作场景就是对数据库服务器做基准测试 ...
- 使用ab进行压力测试详解
ab是apache自带的压力测试工具,非常好用.转载几篇对ab工具的详细使用的博文.猛击下面的链接地址 http://www.365mini.com/page/apache-benchmark.htm ...
- GPS部标监控平台的架构设计(七)-压力测试
部标监控平台的压力测试是部标检测流程的最后一个检测环节,也是最难的,很多送检的企业平台都是卡壳在这一个环节.企业平台面临的问题如下: 1.对于压力测试的具体指标要求理解含糊,只知道是模拟一万辆车终端进 ...
- Nginx使用webbench进行压力测试
在运维工作中,压力测试是一项非常重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验. 但是,在压力测试中存在一个共性,那就是压力测试的 ...
- 使用Apache Bench进行压力测试
Apache Bench是Apache中自带的压力测试工具 在linux中我们安装好apache后可以通过ab指令使用它 格式:ab [参数] [http://]ip地址/path/ 常用参数说明: ...
随机推荐
- CAP 8.0 版本发布通告 - CAP 7岁生日快乐!
前言 今天,我们很高兴宣布 CAP 发布 8.0 版本正式版,从 2016 年 12 月 14 日CAP立项到 2023 年 12 月14 日发布 8.0 版本刚好满 7 年,祝 CAP 7 岁生日快 ...
- Celery 定义和调用异步任务Task
https://docs.celeryq.dev/en/stable/userguide/tasks.html 使用app.task装饰器定义 需要通过导入celery app,然后使用@app.ta ...
- MySQL运维15-一主一从读写分离
一.读写分离介绍 读写分离,是把数据库的读和写分开操作,以应对不同的数据库服务器.主数据库提供写操作,从数据库提供读操作,这样能有效的减轻单台数据库的压力. 二.一主一从原理 MySQL的主从复制是基 ...
- 【C#】【串口通信(Serial Port)】无法使用(using System.IO.Ports;)命名空间<Error:SerialPort不存在上下文>
1.包缺失导致--安装相应包: 2.等待命令行初始化--输入命令: Install-Package Microsoft.Windows.Compatibility -Version 5.0.2 参考网 ...
- apache+mysql+php环境安装及配置
一.安装mysql 1.yum安装mysql # yum -y install mysql mysql-server 2.安装mariadb,用mariadb来启动数据库,systemctl star ...
- Python——第四章:函数的递归调用
递归: 函数自己调用自己 递归如果没有任何东西拦截的话. 它默认就是一个死循环 def func() func() func() 因此递归调用的时候需要有判断,来退出循环 def func() if ...
- aspnetcore使用websocket实时更新商品信息
先演示一下效果,再展示代码逻辑. 中间几次调用过程省略... 暂时只用到了下面四个项目 1.产品展示页面中第一次通过接口去获取数据库的列表数据 /// <summary> /// 获取指定 ...
- ElasticSearch的简单api介绍
1:ElasticSearch是什么? Elasticsearch 是一个分布式的免费开源搜索和分析引擎 适用于包括文本.数字.地理空间.结构化和非结构化数据等在内的所有类型的数据 Elasticse ...
- 请注意,你的 Pulsar 集群可能有删除数据的风险
在上一篇 Pulsar3.0新功能介绍中提到,在升级到 3.0 的过程中碰到一个致命的问题,就是升级之后 topic 被删除了. 正好最近社区也补充了相关细节,本次也接着这个机会再次复盘一下,毕竟这是 ...
- 2023-07-07:给出两个字符串 str1 和 str2。 返回同时以 str1 和 str2 作为子序列的最短字符串。 如果答案不止一个,则可以返回满足条件的任意一个答案。 输入:str1 =
2023-07-07:给出两个字符串 str1 和 str2. 返回同时以 str1 和 str2 作为子序列的最短字符串. 如果答案不止一个,则可以返回满足条件的任意一个答案. 输入:str1 = ...