sipp3.6多方案压测脚本
概述
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多方案压测脚本的更多相关文章
- 手把手用Monkey写一个压测脚本
版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 允许有条件转载,转载请附带底部二维码. 一.为什么需要一个测试脚本? 昨天讲解了Android Monkey命 ...
- 基于Locust实现MQTT协议服务的压测脚本
最近在忙业务的间隙,穿插着做了些性能测试. 一.背景简介 业务背景大概介绍一下,就是按照国标规定,车辆需要上传一些指定的数据到ZF的指定平台,同时车辆也会把数据传到企业云端服务上,于是乎就产生了一些性 ...
- jmeter压测脚本编写与静态文件处理
一.压测脚本编写 概述:工具为谷歌浏览器-->F12-->Network,访问被测站点,通过其中的请求的地方来构造压测脚本 二.静态文件处理 概述:静态文件包括css/js/图片等,它们有 ...
- 一文揭秘测试平台中是如何将测试用例一键转化Jmeter压测脚本
接上篇,一键转化将接口测试平台测试用例转化成Jmeter压测脚本思路,这里我首先在java 上面做了一个简单的实验,看看 转化的中间遇到的问题,这里呢,我只是给了一个简单的demo 版本, ...
- JMeter扩展Java请求实现WebRTC本地音视频推流压测脚本
WebRTC是Web Real-Time Communication缩写,指网页即时通讯,是一个支持Web浏览器进行实时语音或视频对话的API,实现了基于网页的视频会议,比如声网的Agora Web ...
- ab压力测试工具-批量压测脚本
ab(Apache benchmark)是一款常用的压力测试工具.简单易用,ab的命令行一次只能支持一次测试.如果想要批量执行不同的测试方式,并自动对指标进行分析,那么单靠手工一条一条命令运行ab,估 ...
- 无界面运行Jmeter压测脚本 --后知者
原文作者---后知者 原文地址:http://www.cnblogs.com/houzhizhe/p/8119735.html [后知者的故事]:针对单一接口压测时出现了从未遇到的问题,设好并发量后用 ...
- 【原】shell编写一个简单的jmeter自动化压测脚本
在公司做压力测试也挺长时间了,每次测试前环境数据准备都需要话费较长时间,所以一直在考虑能不能将整个过程实现自动化进行,于是就抽空写了一个自动化脚本,当然这个脚本目前功能十分简陋,代码也不完善,很有很多 ...
- 无界面运行Jmeter压测脚本
今天在针对单一接口压测时出现了从未遇到的问题,设好并发量后用调度器控制脚本的开始和结束,但在脚本应该自动结束时间,脚本却停不下来,手动stop报告就会有error率,卡了我很久很久不能解决,网络上也基 ...
- java编写jmeter压测脚本
目前项目中接触的比较多的是接口测试,功能测个差不多后会对部分接口进行压测,采用的是java编写脚本,导入jmeter进行压测. 使用到的jmeter的相关包 写一个测试类,继承AbstractJava ...
随机推荐
- [ABC262B] Triangle (Easier)
Problem Statement You are given a simple undirected graph with $N$ vertices and $M$ edges. The verti ...
- RDBMS与Hbase对比 HDFS与HBase对比 Hive与HBase对比
RDBMS: HBASE: HDFS与HBase对比: Hive与HBase对比: Hive与HBase总结
- 华企盾DSC邮件服务器测试连接提示Bad login or password(账号密码错误)
解决方法:出现该提示说明账号和密码有一个填错了,注意:这里的密码不是邮箱本身的密码,是授权码,具体可以在邮箱设置中查看,而且必须开启smtp服务才能正常使用.
- Javascript Ajax总结——其他跨域技术之图像Ping和JSONP
在CORS出现之前,为实现跨域Ajax通信,开发人员利用DOM中能够执行跨域请求的功能,在不依赖XHR对象的情况下也能发送某种请求.1.图像Ping这里使用<img>标签.一个网页可以从任 ...
- nginx-通过配置不同的虚拟主机实现,不同的uri访问不同资源
先来一个配置 再来另外一个 这两个地址对应的域名都配置解析了,并且解析的ipv4地址是你的服务器ip,且上面配置文件中的内容都在服务器做了相应的配置,对应的路径下的资源是需要准备好的(比如网站或图片或 ...
- Hugging Face 年度回顾:2023,开源大模型之年
在 2023 年,大型语言模型(Large Language Models,简称 LLMs)受到了公众的广泛关注,许多人对这些模型的本质及其功能有了基本的了解.是否开源的议题同样引起了广泛的讨论.在 ...
- ElasticSearch之Get index API
获取指定索引的基本信息. 命令样例如下: curl -X GET "https://localhost:9200/testindex_001?pretty" --cacert $E ...
- Vulntarget-b-wp
Vulntarget-b 环境配置 centos7 用户 密码 root root vulntarget root 宝塔Linux面板http://192.168.0.104:8888/045b276 ...
- 如何从零开始实现TDOA技术的 UWB 精确定位系统(1)
前言 这是一个系列文章,将向你介绍如何从零开始实现一个使用TDOA技术的 UWB 精确定位系统. 重要提示(劝退说明): Q:做这个定位系统需要基础么? A:文章不是写给小白看的,需要有电子技术和软件 ...
- Linux 485驱动通信异常
背景 前段时间接到一个项目,要求用主控用485和MCU通信.将代码调试好之后,验证没问题就发给测试了.测试测的也没问题. 但是,到设备量产时,发现有几台设备功能异常.将设备拿回来排查,发现是485通信 ...