概述

原本的计划是使用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. 基于Kubernetes的分布式压力测试方案

    压力测试是用来检测系统承载能力的有效手段.在系统规模较小的时候,在一台空闲的服务器上使用[ab],[wrk],[siege]等工具发起一定量的并发请求即可得到一个初步的测试结果.但在系统复杂度逐步提高 ...

  2. 压力测试到底测什么?压力测试方案是什么?

    云计算时代,企业对于应用性能要求倍显严格.如何保障企业应用高效运行,压力测试环节必不可少,那么压力测试到底测什么?如何制定适合自己都压力测试方案呢? 首先,进行总体测试规划,规划集成测试的目的.测试时 ...

  3. WEB网站压力测试方案 压力测试如何换算并发用户数

    http://wenku.baidu.com/view/bedf1a93daef5ef7ba0d3c29.html 压力测试通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大的服务级别 ...

  4. MySQL数据库自带基准压力测试工具MySQLSlap使用探索

    一.介绍 mysqlslap是MySQL5.1.4之后自带的benchmark基准测试工具,可以生成schema,装载数据,执行benckmark和查询数据,语法简单,灵活,容易使用. 该工具可以模拟 ...

  5. PHP Apache自带的压力测试工具ab(apache bench)

    ApacheBench 是一个指令列程式,专门用来执行网站服务器的运行效能,特别是针对Apache 网站服务器.这原本是用来检测 Apache 网站服务器能够提供的效能,特别是可以看出Apache能提 ...

  6. PHP测试Apache自带的压力测试工具ab(apache bench)

    1.进入apache的bin文件夹 2.模拟并发级别为100,请求数为1000个的api数据请求数量测试 ab.exe -c 100 -n 1000 http://www.day.com/index. ...

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

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

  8. Apache自带压力测试工具—ab

    ab压力测试工具: ab全称为:apache bench 我们先来了解一下压力测试的概念: 吞吐率(Requests per second) 概念:服务器并发处理能力的量化描述,单位是reqs/s,指 ...

  9. web性能压力测试工具材料

    很好的博客 http://www.nj-test.com/post/75-1.html :http://www.51testing.com/?uid-116228-action-spacelist-t ...

最新文章

  1. CUDA Samples: Ray Tracking
  2. 写给程序员的有效学习方法
  3. 01两数之和(哈希表)
  4. stm32 交换机芯片_基于STM32的全链路语音交互 - stm32/stm8 - 电子工程世界
  5. mysql mariadb并存_MariaDB与MySQL并存
  6. [BUUCTF-pwn]——picoctf_2018_buffer overflow 0
  7. IT外包 OpenEIM 强调CMMI等级
  8. git新建空白文件没有生效
  9. [视频教程]用Unity3d开发跳一跳小游戏
  10. 洛谷 P3952时间复杂度 (本地AC测评RE的伪题解)
  11. dbcp 连接都会被断开_科普帖:软件与数据库连接的机制是怎样的?
  12. Linux C/C++开发环境搭建指针
  13. Padavan设置无线中继
  14. 吐纳六字气法的形成与发展
  15. 课程计划、课程标准、教材三者关系
  16. 计算机求数值公式,excel表格常用技巧大全/EXCEL表格常用的计算公式
  17. win10系统激活提示无法连接到你组织的激活服务器如何解决
  18. Redis记录日志设计
  19. 二本毕业生如何从苦逼到强大的求职记(鲍金勇)
  20. Linux安装phpstudy(无联网版)

热门文章

  1. 网页样式——各种炫酷效果及实现代码
  2. 3.Hadooop 手动修改集群ID对集群有什么影响?
  3. PMBOK(第六版) PMP笔记——《第十章 项目沟通管理》
  4. Weex如何支撑200w+同时在线的优酷猫晚直播?
  5. factorio 服务器_这是您在Factorio上的大脑
  6. 计算机一级考试题 百度云盘,【一级建造师历年真题网盘_2021年一级建造师历年试题】- 环球网校...
  7. 什么是viewport?
  8. excel表里分隔符替换为制表符的操作方法
  9. 【tkinter组件专栏】Menubutton:会飞雷神之术的菜单按钮
  10. MIT公开课:How to speak