freeswitch带媒体压力测试方案

news2025/1/18 9:57:55

 

概述

原本的计划是使用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。

空空如常

求真得真

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

请求响应-响应

前面已经说了我们重点关注的就是XXXcontroller类 进行请求接收 和响应 接收参数那些我们在请求部分讲过了 现在我们来处理响应部分 响应 设置响应数据 可以发现其实我们之前都是设置过的 比如那个Hello World 浏览器都接收到了且在浏览器上进行了输出 这里的是返回值作为这个…

Direct3D 12——纹理——纹理

纹理不同于缓冲区资源&#xff0c;因为缓冲区资源仅存储数据数组&#xff0c;而纹理却可以具有多个mipmap层级(后 文有介绍)&#xff0c;GPU会基于这个层级进行相应的特殊操作&#xff0c;例如运用过滤器以及多重采样。支持这些特殊 的操作纹理资源都被限定为一些特定的数据格式…

7 个最好的 Word 转 PDF 转换器

如果您使用 Word 文件&#xff0c;您可能在某个时候遇到过将 Word 文件转换为 PDF 的紧迫问题。PDF 文件有很多优点。它们通常更紧凑&#xff0c;无论您在哪里打开它们看起来都一样。PDF 还允许您共享文档&#xff0c;而不必冒有人更改内容的风险。那么如何将 Word 文档转换为 …

小白学网络安全要学些什么?

一.网络安全学些什么呢&#xff1f; 虽然网上已经有非常多的学习路线了&#xff0c;但是仍然有很多零基础的小白还是不懂网络安全到底应该要怎么去学习&#xff0c;我也经常会在后台收到这样的问题“我想学网络安全&#xff0c;需要先学编程语言吗&#xff1f;”、“学渗透就业…

【python零碎】

1. 拼接字符中&#xff0c;插入变量 >>> shepherd "Mary" >>> age 32 >>> stuff_in_string "Shepherd {} is {} years old.".format(shepherd, age) >>> print(stuff_in_string) Shepherd Mary is 32 years old. &…

HIT-CSAPP 第五章 面向程序的优化方法(1)

考纲: 1.面向程序性能的优化 面向编译器的程序优化方法:减少过程调用、减少内存引用、指令并行等方法等方法。面向流水线、超标量、向量CPU的程序优化方法。 2.存储器的层次结构 优化编译器的能力和局限性 内存别名使用妨碍函数优化 void twiddle1(long *xp, long *yp){ //…

ERTEC200P-2 PROFINET设备完全开发手册(4-1)

ERTEC200P-2作为应用处理器&#xff0c;既可以单独使用&#xff0c;通过GPIO扩展实现基本的IO功能。也可以配合外部主机&#xff08;例如单片机&#xff09;实现更复杂的应用。ERTEC200P-2与外部主机接口的示意图如下。常用的接口包括UART&#xff0c;SPI&#xff0c;XHIF接口。…

MSI: 基于多元同步索引的SSVEP频率识别算法

MSI: 基于多元同步索引的SSVEP频率识别算法1.算法背景2.算法原理3.Python代码实现1.算法背景 脑机接口&#xff08;Brain-Computer Interface, BCI&#xff09;因其在神经工程与神经科学中的广泛应用价值而备受研究者们的关注。BCI系统可以在人类或动物被试与外部设备之间提供…

“深元AI”赋能传统加油站智能化转型,全力打造新一代智慧加油站

历届的全国两会和党代会上&#xff0c;“安全生产”始终是核心议题。党的二十大报告提出&#xff1a;推动公共安全治理模式向事前预防转型&#xff0c;并强调要加强重点行业、重点领域安全监管&#xff0c;提高防灾减灾救灾和重大突发公共事件处置保障能力。同时&#xff0c;国…

Linux_vim编辑器

Vi编辑器是所有Unix及Linux系统下标准的编辑器&#xff0c;类似于windows系统下的notepad&#xff08;记事本&#xff09;编辑器&#xff0c;由于在Unix及Linux系统的任何版本&#xff0c;Vi编辑器是完全相同的&#xff0c;因此可以在其他任何介绍vi的地方都能进一步了解它&…

Java的CPU 飙升700%优化的真实案例

最近负责的一个项目上线&#xff0c;运行一段时间后发现对应的进程竟然占用了700%的CPU&#xff0c;导致公司的物理服务器都不堪重负&#xff0c;频繁宕机。 那么,针对这类java进程CPU飙升的问题&#xff0c;我们一般要怎么去定位解决呢&#xff1f; 采用top命令定位进程 登…

spring初始项目创建

首先进入http://spring.p2hp.com/projects/spring-framework.html&#xff0c;点击git按钮 点击Access to Binaries中的链接 找到里程碑版本&#xff0c;要引入仓库地址 这里的spring-context依赖只是基础的spring框架的依赖 在resources目录下创建spring的xml文件&#xff0c…

中国31个主要城市绿地数据(空间分辨率为1m)

近年来&#xff0c;为了满足生态文明和可持续发展的理念&#xff0c;科学的城市绿地规划和管理在中国越来越受到重视。因此&#xff0c;提高UGS分类体系和布局布局的合理性&#xff0c;建设绿色宜居城市&#xff0c;是近年来政府和学者关注的重点。为此&#xff0c;本文选取中国…

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域

专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二、ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化&#xff1a;地图符号与…

Terraform 系列-Terraform Cloud 比 Terraform OSS 有哪些增强?

系列文章 &#x1f449; Terraform 系列文章 前言 最近在使用 Terraform Cloud 来置备 OCI 的 Always Free Tier, 发现它非常好用&#xff0c;相比 Terraform OSS, 用起来省心多了。 也借此总结学习下&#xff1a;Terraform Cloud 比 Terraform OSS 有哪些增强&#xff0c;…

【从零开始学Skynet】实战篇《球球大作战》(一):功能设计

为了能把之前在基础篇中学习到的Skynet的各种知识结合起来&#xff0c;所以在实战篇中&#xff0c;我们准备开发一个完整的游戏案例《球球大作战》&#xff0c;介绍分布式游戏服务端的实现方法。 1、功能需求 《球球大作战》是一款多人对战游戏&#xff0c;下图是它的战斗场景…

C语言库函数(memcpy,memmove)的模拟实现

模拟实现memcpy函数 下面是memcpy的函数声明 void *memcpy(void *str1, const void *str2, size_t n) 参数 str1 -- 指向用于存储复制内容的目标数组&#xff0c;类型强制转换为 void* 指针。str2 -- 指向要复制的数据源&#xff0c;类型强制转换为 void* 指针。n -- 要被复…

stm32当中的EXTI外部中断系统

一. 中断系统 中断 &#xff1a; 在主程序运行过程中&#xff0c;出现特定的中断触发条件&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;而去处理中断程序&#xff0c;完成后&#xff0c;又返回原来被暂停的位置继续工作 中断优先 &#xff1a; 当有多个中断开始时&…

SSR初体验-结合Vue3全家桶

SSR初体验 基础搭建 安装依赖 先开启一个服务器 let express require("express");let server express();server.get("/", (req, res) > {res.send(Hello Node Server); });server.listen(3000, () > {console.log("start node server on …

vue3引入Element plus的详细步骤

目录 一、遇到问题 二、操作步骤 一、遇到问题 在用vue3去引用Element UI的时候&#xff0c;发现了白屏不能显示&#xff0c;一直检查是不是代码的问题。后面找到了问题的所在&#xff0c;原来是vue3对应兼容的是Element Plus&#xff0c;要去下载对应的Element plus版本来引…