概述

原本的计划是使用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带媒体压力测试方案的更多相关文章

  1. 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 可以参考一下部 ...

  2. 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 可以参考一 ...

  3. 网站服务器压力Web性能测试(1):Apache Bench:Apache自带服务器压力测试工具

    一个网站或者博客到底能够承受多大的用户访问量经常是我们在用VPS或者独立服务器搭建网站了最关心的问题,还有不少人喜欢对LNMP或者LAMP进行一些优化以便提高Web性能,而优化后到底有多大的效果,就需 ...

  4. PHP测试与优化(1)-- Apache自带的压力测试工具ab(apache bench) - 简单使用

    ab是apache自带的网站压力测试工具,能够测试网站在一定时间内的发生高并发时的反应. 使用 1.进入apache的bin文件夹 2.模拟并发级别为100,请求数为1000个的api数据请求数量测试 ...

  5. mysql 自带的压力测试

    注意mysqlslap 是mysql5.1之后新添加的功能,之前的版本是没有此功能的

  6. (转)MySQL自带的性能压力测试工具mysqlslap详解

    mysqlslap 是 Mysql 自带的压力测试工具,可以模拟出大量客户端同时操作数据库的情况,通过结果信息来了解数据库的性能状况 mysqlslap 的一个主要工作场景就是对数据库服务器做基准测试 ...

  7. 使用ab进行压力测试详解

    ab是apache自带的压力测试工具,非常好用.转载几篇对ab工具的详细使用的博文.猛击下面的链接地址 http://www.365mini.com/page/apache-benchmark.htm ...

  8. GPS部标监控平台的架构设计(七)-压力测试

    部标监控平台的压力测试是部标检测流程的最后一个检测环节,也是最难的,很多送检的企业平台都是卡壳在这一个环节.企业平台面临的问题如下: 1.对于压力测试的具体指标要求理解含糊,只知道是模拟一万辆车终端进 ...

  9. Nginx使用webbench进行压力测试

    在运维工作中,压力测试是一项非常重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验. 但是,在压力测试中存在一个共性,那就是压力测试的 ...

  10. 使用Apache Bench进行压力测试

    Apache Bench是Apache中自带的压力测试工具 在linux中我们安装好apache后可以通过ab指令使用它 格式:ab [参数] [http://]ip地址/path/ 常用参数说明: ...

随机推荐

  1. Linux笔记03: Linux常用命令_3.3文件操作命令

    3.3 文件操作命令 3.3.1 stat命令 ●命令名称:stat. ●英文原意:display file or file system status. ●所在路径:/usr/bin/stat. ● ...

  2. [ARC122D] XOR Game

    Problem Statement There are $2N$ integers written on a blackboard. The $i$-th integer is $A_i$. Alic ...

  3. 初次认识 Git (v2.x)

    什么是版本控制? 版本控制,也称为源代码控制,是一种跟踪和管理软件代码变更的实践.版本控制系统是软件工具,可帮助软件团队管理源代码随时间推移而发生的变更.随着开发环境的加速,版本控制系统可以帮助软件团 ...

  4. Keepalived 高可用详解

    Keepalived 详解 1.Keepalived介绍 ​ Keepalived是一个基于VRRP协议来实现LVS服务高可用方案,可以利用其来避免单点故障.一个LVS服务会使用2台服务器运行Keep ...

  5. 数字孪生系统融合GIS系统能够在洪涝灾害防治上带来什么帮助?

    数字孪生技术与GIS系统的融合,为防治洪涝灾害方式带来了巨大的改变.这种整合的力量超越了过去单一技术的局限,为防洪抗灾工作提供了更全面.更准确的决策支持和应急响应能力. 在过去,防洪抗灾工作主要依赖于 ...

  6. 37. 干货系列从零用Rust编写负载均衡及代理,负载均衡中try_files实现

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...

  7. 玩转Python:处理音频文件,两个非常重要的库,很实用,附代码

    pyaudio和sounddevice都是用于Python中音频处理和流的库,允许用户通过他们的API录制.播放和处理音频数据.下面是对这两个库的简要介绍: PyAudio PyAudio 提供了 P ...

  8. 如何在IIS上部署docsify以及404问题

    操作步骤 创建一个文件夹,在文件夹中新建2个文件 index.html:入口文件,整个网站只需要这个html文件,其他文件都是md文件 README.md:主页内容,如果没有这个文件,访问时提示404 ...

  9. 打通Rasa Action Server和LLM接口的尝试方法

      本文使用最简单的方法对打通 Rasa Action Server 和 LLM 接口进行了尝试,即当 Rasa 对话 intent 为 out_of_scope 时,调用 action_gpt_fa ...

  10. PLG SaaS 案例:如何实践外链自动增长策略?

    首先任何的商业逻辑,光流量增长,没法变现是没用的. 就像博客群发提效工具,得有对应的用户,更得有对应付费用户群体的画像.剩下的就是靠增长,被动让他们找到你的产品,用产品解决他们痛点,他们自然而然会付费 ...