概述

SIP压测工具sipp,免费,开源,功能足够强大,配置灵活,优点多。

有时候我们需要模拟现网的生产环境来压测,就需要同时有多个sipp脚本运行,并且需要不断的调整呼叫并发。

通过python脚本的子进程功能,我们可以很方便的实现sipp的多方案压测功能。

环境

centos7.9

freeswitch1.10.7

sipp v3.6.2_rc1

python 2.7.5

压测方案

Freeswitch部署在137服务器,作为呼叫的信令代理,开放端口5080。

Sipp和python脚本部署在138服务器,sipp的测试方案需要启动4个进程。

Sipp1,uas端,开启5555端口,接收fs137转发的呼叫,并响应接通信令。

Sipp2,uac端,开启6666端口,向fs137发送呼叫,并在接通30秒后挂断电话。

Sipp3,uac端,开启7777端口,向fs137发送呼叫,并接收fs137返回的404信令但不处理。

Sipp4,uac端,开启6668端口,向fs137发送呼叫,并在收到180振铃消息后主动cancel呼叫。

其中,sipp2,sipp3,sipp4三个uac端的进程,每间隔3分钟发起新一轮呼叫,每一轮呼叫运行2分钟。

Sipp1配置脚本

Sipp1,uas端,开启5555端口,接收fs137转发的呼叫,并响应接通信令。

监听10.55.55.138的5555端口,命令和脚本如下。

sudo sipp -i 10.55.55.138 -p 5555 -sf uas-test180cps.xml

uas-test180cps.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE scenario SYSTEM "sipp.dtd">

<scenario name="Basic UAS responder">

<recv request="INVITE" crlf="true">

</recv>

<send>

<![CDATA[

SIP/2.0 100 Trying

[last_Via:]

[last_From:]

[last_To:];tag=[pid]SIPpTag08b[call_number]

[last_Call-ID:]

[last_CSeq:]

Contact: <sip:[local_ip]:[local_port];transport=[transport]>

Content-Length: 0

]]>

</send>

<pause milliseconds="500"/>

<send>

<![CDATA[

SIP/2.0 180 Ringing

[last_Via:]

[last_From:]

[last_To:];tag=[pid]SIPpTag01[call_number]

[last_Call-ID:]

[last_CSeq:]

Contact: <sip:[local_ip]:[local_port];transport=[transport]>

Content-Type: application/sdp

Content-Length: [len]

v=0

o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]

s=-

c=IN IP[media_ip_type] [media_ip]

t=0 0

m=audio [media_port] RTP/AVP 8

a=rtpmap:8 PCMA/8000

a=ptime:20

]]>

</send>

<pause milliseconds="500"/>

<send>

<![CDATA[

SIP/2.0 180 Ringing

[last_Via:]

[last_From:]

[last_To:];tag=[pid]SIPpTag01[call_number]

[last_Call-ID:]

[last_CSeq:]

Contact: <sip:[local_ip]:[local_port];transport=[transport]>

Content-Length: 0

]]>

</send>

<pause milliseconds="500"/>

<send retrans="500">

<![CDATA[

SIP/2.0 200 OK

[last_Via:]

[last_From:]

[last_To:];tag=[pid]SIPpTag01[call_number]

[last_Call-ID:]

[last_CSeq:]

Contact: <sip:[local_ip]:[local_port];transport=[transport]>

Content-Type: application/sdp

Content-Length: [len]

v=0

o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]

s=-

c=IN IP[media_ip_type] [media_ip]

t=0 0

m=audio [media_port] RTP/AVP 8

a=rtpmap:8 PCMA/8000

]]>

</send>

<recv request="ACK"

optional="true"

rtd="true"

crlf="true">

</recv>

<recv request="BYE">

</recv>

<send>

<![CDATA[

SIP/2.0 200 OK

[last_Via:]

[last_From:]

[last_To:]

[last_Call-ID:]

[last_CSeq:]

Contact: <sip:[local_ip]:[local_port];transport=[transport]>

Content-Length: 0

]]>

</send>

<!-- Keep the call open for a while in case the 200 is lost to be     -->

<!-- able to retransmit it if we receive the BYE again.               -->

<timewait milliseconds="4000"/>

<!-- definition of the response time repartition table (unit is ms)   -->

<ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 150, 200"/>

<!-- definition of the call length repartition table (unit is ms)     -->

<CallLengthRepartition value="10, 50, 100, 500, 1000, 5000, 10000"/>

</scenario>

Sipp2配置脚本

Sipp2,uac端,开启6666端口,向fs137发送呼叫,并在接通30秒后挂断电话。

使用10.55.55.138的6666端口向10.55.55.137的5080端口发起呼叫,每秒发起160通呼叫,总共发起19200通呼叫后停止运行,后台运行。

sudo sipp -i 10.55.55.138 -p 6666 -inf call-test.csv -sf uac-test180cps.xml 10.55.55.137:5080 -rp 1000 -r 160 -l 8192 -m 19200 -bg

uac-test180cps.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE scenario SYSTEM "sipp.dtd">

<scenario name="Basic Sipstone UAC">

<send retrans="500">

<![CDATA[

INVITE sip:[field1]@[remote_ip]:[remote_port] SIP/2.0

Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]

From: [field0] <sip:[field0]@[local_ip]:[local_port]>;tgrp=TG-19073;tag=[pid]SIPpTag00[call_number]

To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>

Call-ID: [call_id]

CSeq: 1 INVITE

Contact: sip:sipp@[local_ip]:[local_port]

Max-Forwards: 70

Subject: Performance Test

Content-Type: application/sdp

Content-Length: [len]

v=0

o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]

s=-

c=IN IP[media_ip_type] [media_ip]

t=0 0

m=audio [media_port] RTP/AVP 8 18

a=rtpmap:8 PCMA/8000

a=rtpmap:18 G729/8000

a=ptime:20

]]>

</send>

<recv response="100" optional="true">

</recv>

<recv response="183" optional="true">

</recv>

<recv response="180" optional="true">

</recv>

<recv response="200" rtd="true">

</recv>

<send>

<![CDATA[

ACK sip:[field1]@[remote_ip]:[remote_port] SIP/2.0

Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]

From: [field0] <sip:[field0]@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number]

To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>[peer_tag_param]

Call-ID: [call_id]

CSeq: 1 ACK

Contact: sip:sipp@[local_ip]:[local_port]

Max-Forwards: 70

Subject: Performance Test

Content-Length: 0

]]>

</send>

<pause milliseconds="30000"/>

<send retrans="500">

<![CDATA[

BYE sip:[field1]@[remote_ip]:[remote_port] SIP/2.0

Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]

From: [field0] <sip:[field0]@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number]

To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>[peer_tag_param]

Call-ID: [call_id]

CSeq: 2 BYE

Contact: sip:sipp@[local_ip]:[local_port]

Max-Forwards: 70

Subject: Performance Test

Content-Length: 0

]]>

</send>

<recv response="200" crlf="true">

</recv>

<ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 150, 200"/>

<CallLengthRepartition value="10, 50, 100, 500, 1000, 5000, 10000"/>

</scenario>

Sipp3配置脚本

Sipp3,uac端,开启7777端口,向fs137发送呼叫,并接收fs137返回的404信令但不处理。

使用10.55.55.138的7777端口向10.55.55.137的5080端口发起呼叫,每秒发起30通呼叫,总共发起3600通呼叫后停止运行,后台运行。

sudo sipp -i 10.55.55.138 -p 7777 -inf call-test.csv -sf uac-test404-noack.xml 10.55.55.137:5080 -rp 1000 -r 30 -l 8192 -m 3600 -bg

uac-test404-noack.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE scenario SYSTEM "sipp.dtd">

<scenario name="Basic Sipstone UAC">

<send retrans="500">

<![CDATA[

INVITE sip:[field1]@[remote_ip]:[remote_port] SIP/2.0

Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]

From: [field0] <sip:[field0]@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number]

To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>

Call-ID: [call_id]

CSeq: 1 INVITE

Contact: sip:sipp@[local_ip]:[local_port]

Max-Forwards: 70

Subject: Performance Test

Content-Type: application/sdp

Content-Length: [len]

v=0

o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]

s=-

c=IN IP[media_ip_type] [media_ip]

t=0 0

m=audio [media_port] RTP/AVP 8 18

a=rtpmap:8 PCMA/8000

a=rtpmap:18 G729/8000

a=ptime:20

]]>

</send>

<recv response="100" optional="true">

</recv>

<recv response="183" optional="true">

</recv>

<recv response="180" optional="true">

</recv>

<recv response="404" rtd="true">

</recv>

<timewait milliseconds="1000"/>

<ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 150, 200"/>

<CallLengthRepartition value="10, 50, 100, 500, 1000, 5000, 10000"/>

</scenario>

Sipp4配置脚本

Sipp4,uac端,开启6668端口,向fs137发送呼叫,并在收到180振铃消息后主动cancel呼叫。

使用10.55.55.138的6668端口向10.55.55.137的5080端口发起呼叫,每秒发起10通呼叫,总共发起1200通呼叫后停止运行,后台运行。

sudo sipp -i 10.55.55.138 -p 6668 -inf call-test.csv -sf uac-test-cancel1.xml 10.55.55.137:5080 -rp 1000 -r 10 -l 8192 -m 1200 -bg

uac-test-cancel1.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE scenario SYSTEM "sipp.dtd">

<scenario name="Basic Sipstone UAC">

<send retrans="500">

<![CDATA[

INVITE sip:[field1]@[remote_ip]:[remote_port] SIP/2.0

Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]

From: [field0] <sip:[field0]@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number]

To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>

Call-ID: [call_id]

CSeq: 1 INVITE

Contact: sip:sipp@[local_ip]:[local_port]

Max-Forwards: 70

Subject: Performance Test

Content-Type: application/sdp

Content-Length: [len]

v=0

o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]

s=-

c=IN IP[media_ip_type] [media_ip]

t=0 0

m=audio [media_port] RTP/AVP 8 18

a=rtpmap:8 PCMA/8000

a=rtpmap:18 G729/8000

a=ptime:20

]]>

</send>

<recv response="100" rtd="true">

</recv>

<recv response="180" >

</recv>

<recv response="180" >

</recv>

<pause milliseconds="200"/>

<send retrans="500">

<![CDATA[

CANCEL sip:[field1]@[remote_ip]:[remote_port] SIP/2.0

[last_Via:]

From: [field0] <sip:[field0]@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number]

To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>[peer_tag_param]

Call-ID: [call_id]

CSeq: 1 CANCEL

Contact: sip:sipp@[local_ip]:[local_port]

Max-Forwards: 70

Content-Length: 0

]]>

</send>

<recv response="200" crlf="true">

</recv>

<recv response="487" crlf="true">

</recv>

<send>

<![CDATA[

ACK sip:[field1]@[remote_ip]:[remote_port] SIP/2.0

[last_Via:]

From: [field0] <sip:[field0]@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number]

To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>[peer_tag_param]

Call-ID: [call_id]

CSeq: 1 ACK

Contact: sip:sipp@[local_ip]:[local_port]

Max-Forwards: 70

Subject: Performance Test

Content-Length: 0

]]>

</send>

<timewait milliseconds="1000"/>

<ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 150, 200"/>

<CallLengthRepartition value="10, 50, 100, 500, 1000, 5000, 10000"/>

</scenario>

Python脚本

该Python脚本可以在python2和python3的环境下运行,测试环境只跑了python2。

脚本如下,通过subprocess子进程实现压测方案的自动启停。

sipp-auto.py

# coding=utf-8

# python3 required

import subprocess

import time

import signal

import sys

def signal_handler(sig, frame):

continueflag = 0

for p in processes:

p.terminate()

sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)

commands = [

# "sudo sipp -i 10.55.55.138 -p 5555 -sf uas-test180cps.xml",

"sudo sipp -i 10.55.55.138 -p 6666 -inf call-test.csv -sf uac-test180cps.xml 10.55.55.137:5080 -rp 1000 -r 160 -l 8192 -m 19200 -bg",

"sudo sipp -i 10.55.55.138 -p 7777 -inf call-test.csv -sf uac-test404-noack.xml 10.55.55.137:5080 -rp 1000 -r 30 -l 8192 -m 3600 -bg",

"sudo sipp -i 10.55.55.138 -p 6668 -inf call-test.csv -sf uac-test-cancel1.xml 10.55.55.137:5080 -rp 1000 -r 10 -l 8192 -m 1200 -bg"

]

continueflag = 1

processes = []

commandUas = "sudo sipp -i 10.55.55.138 -p 5555 -sf uas-test180cps.xml"

p = subprocess.Popen(commandUas, shell=True)

processes.append(p)

while 1==continueflag:

for command in commands:

p = subprocess.Popen(command, shell=True)

processes.append(p)

time.sleep(180) # 等待3分钟

for p in processes:

p.wait()

测试

Sipp的配置脚本和python脚本放置到相同目录下。

启动python脚本。

sudo python sipp-auto.py

观察fs资源情况和sipp运行情况。

总结

sipp的github地址:https://github.com/SIPp/sipp

后续会有更多的压测方案和脚本慢慢写。

空空如常

求真得真

sipp3.6多方案压测脚本的更多相关文章

  1. 手把手用Monkey写一个压测脚本

    版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 允许有条件转载,转载请附带底部二维码. 一.为什么需要一个测试脚本? 昨天讲解了Android Monkey命 ...

  2. 基于Locust实现MQTT协议服务的压测脚本

    最近在忙业务的间隙,穿插着做了些性能测试. 一.背景简介 业务背景大概介绍一下,就是按照国标规定,车辆需要上传一些指定的数据到ZF的指定平台,同时车辆也会把数据传到企业云端服务上,于是乎就产生了一些性 ...

  3. jmeter压测脚本编写与静态文件处理

    一.压测脚本编写 概述:工具为谷歌浏览器-->F12-->Network,访问被测站点,通过其中的请求的地方来构造压测脚本 二.静态文件处理 概述:静态文件包括css/js/图片等,它们有 ...

  4. 一文揭秘测试平台中是如何将测试用例一键转化Jmeter压测脚本

    ​    ​接上篇,一键转化将接口测试平台测试用例转化成Jmeter压测脚本思路,这里我首先在java 上面做了一个简单的实验,看看 转化的中间遇到的问题,这里呢,我只是给了一个简单的demo 版本, ...

  5. JMeter扩展Java请求实现WebRTC本地音视频推流压测脚本

    WebRTC是Web Real-Time Communication缩写,指网页即时通讯,是一个支持Web浏览器进行实时语音或视频对话的API,实现了基于网页的视频会议,比如声网的Agora Web ...

  6. ab压力测试工具-批量压测脚本

    ab(Apache benchmark)是一款常用的压力测试工具.简单易用,ab的命令行一次只能支持一次测试.如果想要批量执行不同的测试方式,并自动对指标进行分析,那么单靠手工一条一条命令运行ab,估 ...

  7. 无界面运行Jmeter压测脚本 --后知者

    原文作者---后知者 原文地址:http://www.cnblogs.com/houzhizhe/p/8119735.html [后知者的故事]:针对单一接口压测时出现了从未遇到的问题,设好并发量后用 ...

  8. 【原】shell编写一个简单的jmeter自动化压测脚本

    在公司做压力测试也挺长时间了,每次测试前环境数据准备都需要话费较长时间,所以一直在考虑能不能将整个过程实现自动化进行,于是就抽空写了一个自动化脚本,当然这个脚本目前功能十分简陋,代码也不完善,很有很多 ...

  9. 无界面运行Jmeter压测脚本

    今天在针对单一接口压测时出现了从未遇到的问题,设好并发量后用调度器控制脚本的开始和结束,但在脚本应该自动结束时间,脚本却停不下来,手动stop报告就会有error率,卡了我很久很久不能解决,网络上也基 ...

  10. java编写jmeter压测脚本

    目前项目中接触的比较多的是接口测试,功能测个差不多后会对部分接口进行压测,采用的是java编写脚本,导入jmeter进行压测. 使用到的jmeter的相关包 写一个测试类,继承AbstractJava ...

随机推荐

  1. [ABC262B] Triangle (Easier)

    Problem Statement You are given a simple undirected graph with $N$ vertices and $M$ edges. The verti ...

  2. RDBMS与Hbase对比 HDFS与HBase对比 Hive与HBase对比

    RDBMS: HBASE: HDFS与HBase对比: Hive与HBase对比: Hive与HBase总结

  3. 华企盾DSC邮件服务器测试连接提示Bad login or password(账号密码错误)

    解决方法:出现该提示说明账号和密码有一个填错了,注意:这里的密码不是邮箱本身的密码,是授权码,具体可以在邮箱设置中查看,而且必须开启smtp服务才能正常使用.

  4. Javascript Ajax总结——其他跨域技术之图像Ping和JSONP

    在CORS出现之前,为实现跨域Ajax通信,开发人员利用DOM中能够执行跨域请求的功能,在不依赖XHR对象的情况下也能发送某种请求.1.图像Ping这里使用<img>标签.一个网页可以从任 ...

  5. nginx-通过配置不同的虚拟主机实现,不同的uri访问不同资源

    先来一个配置 再来另外一个 这两个地址对应的域名都配置解析了,并且解析的ipv4地址是你的服务器ip,且上面配置文件中的内容都在服务器做了相应的配置,对应的路径下的资源是需要准备好的(比如网站或图片或 ...

  6. Hugging Face 年度回顾:2023,开源大模型之年

    在 2023 年,大型语言模型(Large Language Models,简称 LLMs)受到了公众的广泛关注,许多人对这些模型的本质及其功能有了基本的了解.是否开源的议题同样引起了广泛的讨论.在 ...

  7. ElasticSearch之Get index API

    获取指定索引的基本信息. 命令样例如下: curl -X GET "https://localhost:9200/testindex_001?pretty" --cacert $E ...

  8. Vulntarget-b-wp

    Vulntarget-b 环境配置 centos7 用户 密码 root root vulntarget root 宝塔Linux面板http://192.168.0.104:8888/045b276 ...

  9. 如何从零开始实现TDOA技术的 UWB 精确定位系统(1)

    前言 这是一个系列文章,将向你介绍如何从零开始实现一个使用TDOA技术的 UWB 精确定位系统. 重要提示(劝退说明): Q:做这个定位系统需要基础么? A:文章不是写给小白看的,需要有电子技术和软件 ...

  10. Linux 485驱动通信异常

    背景 前段时间接到一个项目,要求用主控用485和MCU通信.将代码调试好之后,验证没问题就发给测试了.测试测的也没问题. 但是,到设备量产时,发现有几台设备功能异常.将设备拿回来排查,发现是485通信 ...