IPPBX-性能测试


kylinPET ...... SIPp-3.3 ...... SIPp3.3 在Cygwin1.7上编译
make  pcapplay_ossl
出现链接错误,需要这两个库 : "-lssl -lcrypto"    

                       //安装cygwin-1.7时 没有自动创建此动态库链接 手动补上

ln -s "E:\cygwin1.7\bin\cygssl-1.0.0.dll" ssl.dll
ln -s "E:\cygwin1.7\bin\cygcrypto-1.0.0.dll" crypto.dll

                       //Makefile 里路径补充
LIBS_Cygwin= -lcurses -lpthread -lstdc++  -L/usr/bin   -L/cygdrive/e/LAB/opengnu/wireshark-1.9.1/Wireshark-win32-libs/WpdPack/Lib

                       //用到这两个DLL 主要是宏定义的引入
make[1]:  进入目录 "/cygdrive/ e /LAB/ open /Svr_VoIP/SIP/performance/sipp-3.3"
g++     \
-o sipp sslinit.o sslthreadsafe.o send_packets.o prepare_pcap.o rijndael.o md5.o milenage.o auth.o xp_parser.o message.o scenario.o  screen.o call.o comp.o sipp.o stat.o actions.o variables.o infile.o  deadcall.o task.o socketowner.o listener.o opentask.o reporttask.o  watchdog.o -lcurses -lpthread -lstdc++ -L/usr/bin -L /usr/lib/WpdPack/Lib -L/cygdrive/ e /LAB/opengnu/wireshark-1.9.1/Wireshark-win32-libs/WpdPack/Lib   -lcrypto -lwpcap  
sslinit.o:sslinit.c:(.text+0x10): undefined reference to `_SSL_library_init'
sslinit.o:sslinit.c:(.text+0x20): undefined reference to `_SSL_load_error_strings'
sslinit.o:sslinit.c:(.text+0x38): undefined reference to `_SSL_CTX_new'
sipp.o:sipp.cpp:(.text+0x1b7): undefined reference to `_SSL_get_error'
sipp.o:sipp.cpp:(.text+0x2bd): undefined reference to `_SSL_CTX_get_cert_store'
sipp.o:sipp.cpp:(.text+0x34b): undefined reference to `_TLSv1_method'
sipp.o:sipp.cpp:(.text+0x353): undefined reference to `_SSL_CTX_new'
sipp.o:sipp.cpp:(.text+0x372): undefined reference to `_TLSv1_method'
sipp.o:sipp.cpp:(.text+0x37a): undefined reference to `_SSL_CTX_new'
sipp.o:sipp.cpp:(.text+0x3b3): undefined reference to `_SSL_CTX_load_verify_locations'

--------------------------------------------------------------------------------
                        //cygwin下 mount查看下 /usr/bin的实际代指路径

root@MICROSO-5M0HHTG  /lib
# mount
E:/cygwin1.7/bin on /usr/bin type ntfs (binary,auto)
E:/cygwin1.7/lib on /usr/lib type ntfs (binary,auto)
E:/cygwin1.7 on / type ntfs (binary,auto)

C: on /cygdrive/c type ntfs (binary,posix=0,user,noumount,auto)
D: on /cygdrive/d type ntfs (binary,posix=0,user,noumount,auto)
E: on /cygdrive/e type ntfs (binary,posix=0,user,noumount,auto)
F: on /cygdrive/f type ntfs (binary,posix=0,user,noumount,auto)
G: on /cygdrive/g type ntfs (binary,posix=0,user,noumount,auto)
I: on /cygdrive/i type ntfs (binary,posix=0,user,noumount,auto)
L: on /cygdrive/l type ntfs (binary,posix=0,user,noumount,auto)
       

SIPp-3.3用 vs+vgdb 调试
~、Cygwin环境下,利用vs+vgdb来调试SIPp工程:
  编译选项参看makefile 选用 "debug" 系列, 其中"pcapplay-ossl" 对应 " debug_pcap_cygwin" 。

~、路径更正
Build Settings                : make.exe 所在路径确认
Intellisense Directories      : Cygwin 中的 usr/include 等等头文件、库的路径        //似乎只能追加,无法对旧的路径进行编辑修改




测试样例 ...... SIPp 测试案例 ...... 示例:SIPp3.3+FreeSwitch1.2.23

软交换        :FreeSwitch-1.2.23
               vc 2008                          // 有些库直接借用 vc2012编译生成的
软话机        :eyeBeam1.5.18                  // 不同终端,发送INVITE包 SDP 描述数据的封装不同

测试准备
用SIPp做测试的时候需要准备以下8个文件:

UAC端:uac.sh, uac.xml, uac.csv

uac.sh:调用sipp命令,并传入相应参数脚本文件,模拟UAC(例如主叫),当然也可不准备此文件直接输入sipp命令执行程序,但是写成文件执行更加方便可靠;
uac.xml:根据需要编写的uac侧的sip信号流程;
uac.csv:用于uac.xml需要引入的相应数据;


UAS端:reg.sh, reg.xml ; uas_noreg.sh, uas_noreg.xml ; uas.csv

reg.sh:调用sipp命令,并传入相应参数的脚本文件,模拟UAS注册,当然也可不准备此文件直接输入sipp命令执行程序,但是写成文件执行更加方便可靠;
reg.xml:根据需要编写的注册流程,主要配合uas流程使用;
uas_noreg.sh:调用sipp命令,并传入相应参数的脚本文件,模拟UAS(例如被叫),当然也可不准备此文件直接输入sipp命令执行程序,但是写成文件执行更加方便可靠。
uas_noreg.xml:根据需要编写的uas侧的sip信号流程。
uas.csv:用于reg.xml和uas.xml中需要引入的相应数据。

注意:uas中,reg.xml和uas_noreg.xml中的内容不能合并在同一个xml中,或者会导致收不到invite;


网文参考:  Linux-SIPp3.3测试FreeSwitch-(一)~(七)
http://www.51testing.com/?uid-130600-action-spacelist-type-blog-itemtypeid-27867



注意端口号设置
如题。
因为,此案例中将UAS端分成两个包(reg.xml + uas_noreg.xml)发送,各自对应的 reg.sh 与 uas_noreg.sh 的端口号,注意要设成一样,
否则 UAS 端收不到 UAC 端的数据包。

另外,端口号最好手动设置  抓包时便于观察 容易分出 C/S 端 。

----------------------------------------
本案例 :        UAS端口 12346   UAC端口 12345

错误日志排查列表 ...... 488 Not Acceptable Here + INCOMPATIBLE_DESTINATION
* 488 Not Acceptable Here + INCOMPATIBLE_DESTINATION

(1)错误日志摘要(uac_7196_errors.log)
SIP/2.0 488 Not Acceptable Here
Reason: Q.850;cause=88;text="INCOMPATIBLE_DESTINATION"

(2)异常反应
屏幕提示           :     while expecting '180' (index 10), received 'SIP/2.0 488 Not Acceptable Here
实际软话机上观察 :    eyeBeam1.5上 振铃时未设置自动应答, 掉话,未接通 很多个"Missed Call "

(3)处理方法:

测试时,注意要用终端设备或软话机可以接受的 SDP包 ,且保持uac/uas两边SDP一致;
可事先用两个话机拔叫一次,拔通抓包后拷贝出SDP数据,覆盖uac.xml 及 uas_noreg.xml场景文件中各自"INVITE"方法里的SDP部分。


uas 测试场景 ...... 401 Unauthorized
~、注意 uas.csv 帐号用例格式写法
之前:
SEQUENTIAL
1000;[authentication username=1000 password=1234]
1001;[authentication username=1001 password=1234]
1002;[authentication username=1001 password=1234]


报错:  while expecting '200' (index 3), received 'SIP/2.0 401 Unauthorized

纠正:(可加上自己做为目标号,或随便写一个目标号"1002")        

SEQUENTIAL
1000;1002;[authentication username=1000 password=1234]                
1001;1002;[authentication username=1001 password=1234]
1002;1002;[authentication username=1002 password=1234]

uac 测试场景



415 Unsupported Media Type + 481 Call Does Not Exist
415错误处理 :

(*) uac.csv 里每一行用户号码 须事先已在服务端开户过
之前:4个号都未添加

SEQUENTIAL
152;19002;[authentication username=152 password=7d83c157ea9c4c21da1a0e7ab05c21b9]
153;138721;[authentication username=153 password=7d83c157ea9c4c21da1a0e7ab05c21b9]

之后:改用默认已有的20个号

SEQUENTIAL
1000;1011;[authentication username=1000 password=1234]
1001;1012;[authentication username=1001 password=1234]        

(*)uac.csv 文件要求是unix格式,用dos2unix工具转换。
参见代码 Infile.cpp 模块中有提及此要求: "Each line should be terminated with a '\n'"

这一点 在cygwin平台上 容易忽略掉。
如果不转换格式 而最后一行数据又没有"\r\n"符的话,会造成只有最后一行用例可以用,能收到软交换成功的回复,而其他行的不能用的假象,
不能用的每一个用例都被回复:

"while expecting '100' (index 9), received 'SIP/2.0  415  Unsupported Media Type " ,以及
"Dead call [email protected] (aborted at index 9), received 'SIP/2.0  481  Call Does Not Exist "


480 Temporarily Unavailable + Reason: Q.850; MANDATORY_IE_MISSING
~、 头域与消息体之间的空行注意保留


INVITE  sip:[field1]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: [field0] ;tag=[call_number]
To: [field1]
Call-ID: [call_id]
CSeq: 2 INVITE
Contact: sip:[field0]@[local_ip]:[local_port]
Max-Forwards: 70
Subject: Performance Test
[field2]
Content-Type: application/sdp
Content-Length: [len]
                 // 头域与消息体之间的空行不小心去掉,服务端回复 480错误,及" "MANDATORY_IE_MISSING "错误:( uac_5604_errors.log
v=0
o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]
s=-
b=AS:84
c=IN IP[local_ip_type] [local_ip]
t=0 0
a=X-nat:0
m=audio [auto_media_port] RTP/AVP 98
a=sendrecv
a=rtpmap:98 iLBC/8000
a=fmtp:98 mod=30
]]>





网页上拷贝的场景文件使用前处理
~、自网页面上拷贝的场景文件处理
(1)脚本(.sh)、数据(.csv)需先转化成unix格式的格式再执行,xml 场景配置可不必转换。

root@MICROSO-5M0HHTG  /cygdrive/ e /LAB/ open /Svr_VoIP/SIP/performance/sipp-3.3/test/test-fs
# ./uas_noreg.sh 100
./uas_noreg.sh: line 2: %HTML_CONTENT%apos;\r': command not found
./uas_noreg.sh: line 4: %HTML_CONTENT%apos;\r': command not found
./uas_noreg.sh: line 6: %HTML_CONTENT%apos;\r': command not found
./uas_noreg.sh: line 7: syntax error in conditional expression
'/uas_noreg.sh: line 7: syntax error near `]]
'/uas_noreg.sh: line 7: `if [[ $# -eq 0 ]]

root@MICROSO-5M0HHTG  /cygdrive/ e /LAB/ open /Svr_VoIP/SIP/performance/sipp-3.3/test/test-fs
# dos2unix uas_noreg.sh
dos2unix: converting file uas_noreg.sh to Unix format ...

(2)去掉数据段之间的空行。
A、  XML场景文件 里的数据段 不能有空行,否则数据封包格式错误。   即去掉 ""  之间的空行
B、  CSV用例数据 :SEQUENTIAL与数据行、 及各数据行之间都不要留空行。


sipp 测试样例-FS
[ /_Svr_VoIP/SIP/performance/ sipp-3.3 /test/test-0908-2 ]
../../sipp -sf reg.xml -inf reg1.csv -p 6067 -i 192.168.1.31 -m 50 192.168.1.31:5060



sipp 测试样例-AS
压力测试 大呼测试
功能测试 小叫测试
呼损
Asterisk 略写为 AS  
===============================================================================================

[\_Svr_VoIP\SIP\performance\sipp-3.3.990-elastix\test1\sipp-1.1r8\register_yes-authentication]
-sf register_yes_authentication-AS1.8.23.xml -inf register_yes_authentication.csv -i 192.168.3.36 -p 6690 192.168.3.139



===============================================================================================

./sipp -r 1 -i 192.168.3.60 -l 1 -sf test/uac-media.xml -inf test/test-call.csv 192.168.3.32


[ test-0908 ]
../sipp.exe -sf reg.xml -inf test.csv -p 6078 -i 192.168.3.60 192.168.3.32


[test-0908-2]
./sipp -sf reg.xml -inf reg1.csv -p 6067 -i 192.168.3.60 -m 50 192.168.3.32:5060   //主叫
./sipp -sf reg.xml -inf reg2.csv -p 6068 -i 192.168.3.60 -m 50 192.168.3.32:5060   //被叫
./sipp -sf uac.xml -inf reg1.csv -p 6067 -i 192.168.3.60 -m 50 192.168.3.32:5060        //uac
./sipp -sf uas.xml -inf reg2.csv -p 6068 -i 192.168.3.60 -m 50 192.168.3.32:5060        //uas

[test-0908-3]
sipp -sn uac 192.168.3.32:5060 -r 1 -rp 3000 -inf data.csv -p 7098 -i 192.168.3.60 -s 8001 -sf uac.xml -m 1000 -l 900
sipp -sn uas 192.168.3.32:5060 -inf data.csv  -i 192.168.3.60 -p 8890 -s 8001 -sf uas.xml


使用SIPp进行SIP压力测试
使用SIPp进行SIP压力测试
                                                                       
2008-03-26

目录
1          简介         2
2          安装         2

SIPp
http://sipp.sourceforge.net/                 (快)
https://github.com/SIPp/sipp/releases         

SIPp :  SIP服务端压力测试工具

源码分析 ...... 源码编译
SIPp  可安装在   Linux    Cygwin  上面,   其他   Unix  版本可能也可以安装使用,但在每一个
发布周期中并未被测试。   不过   Cygwin  上面性能没有   Linux  上面好,且   SIPp  只能在运行于
windows xp  或更高   windows  版本的   Cygwin  上面运行。在   Linux  环境中,   SIPp  以源代码的形
式提供,在使用   SIPp  之前需要编译   SIPp ,在编译之前需要如下依赖组件:
C++ Compiler
curses or ncurses library
For TLS support: OpenSSL >= 0.9.8
For pcap play support: libpcap and libnet
For SCTP support: lksctp-tools
For distributed pauses: Gnu Scientific Libraries
在编译   SIPp  时,有如下四个选项:
不包含对   TLS   SCTP    PCAP  的支持
# tar -xvzf sipp-xxx.tar
# cd sipp
# ./configure
# make

包含   TLS  支持
# tar -xvzf sipp-xxx.tar
# cd sipp
# ./configure --with-openssl
# make

包含   PCAP play  支持
# tar -xvzf sipp-xxx.tar
# cd sipp
# ./configure --with-pcap
# make

包含   SCTP  支持
# tar -xvzf sipp-xxx.tar
# cd sipp
# ./configure --with-sctp
# make

或者组合支持以上功能
# tar -xvzf sipp-xxx.tar
# cd sipp
# ./configure --with-sctp --with-pcap --with-openssl
# make


Reference
SIP\performance\文档\SIPp使用手册中文版 中译版.pdf
 

http://blog.163.com/hlz_2599



热键

按键  作用
+  以 1 倍于 rate_scale 的速率增加呼叫
-  以 1 倍于 rate_scale 的速率减少呼叫
*  以 10 倍于 rate_scale 的速率增加呼叫
/  以 10 倍于 rate_scale 的速率减少呼叫
c  进入命令控制模式
q  待所有呼叫完成后退出 sipp
Q  立即退出 sipp
s  转储当前状态到日志文件(仅当使用了-trace_screen 参数时)
p  暂停当前工作
1  显示脚本页面
2  显示统计页面
3  显示响应时间分布页面
4  显示变量页面
5  显示 TDM 页面
6-9  Display the second through fifth repartition screen.


命令

在命令模式,可以使用单个命令控制 SIPp 的动作。命令模式比热键更灵活,只不过需
要手动输入命令,SIPp 提供了如下命令(在运行过程按热键 c 进入):

命令                  描述
dump tasks  把错误信息转储到日志文件
set rate x  设置呼叫率
set rate-scale x  设置呼叫速率步长(rate-scale)
set users x  设置同时在线的用户数(仅在指定了参数-users 时生效)
set limit x  设置呼叫速率上限(等同于参数-l)
set hide  Should the hide XML attribute be respected?
set display  改变视图,在主脚本页面和 ooc 脚本页面之间切换
set index  是否显示脚本视图中的索引信息
trace  开启或关闭错误显示,仅对 "error",  "logs",  "messages",  and "shortmessages"有效。


Scenario 编写 ...... 6.1 创建客户端(类似 UAC) 脚本
客户端脚本以 send " 命令开始,示例如下:

INVITE sip:  [service]  @ [remote_ip]  [remote_port]  SIP/2.0
Via: SIP/2.0/ [transport] [local_ip]  [local_port]
From: sipp [local_ip]  [local_port]  >;tag= [call_number]
To: sut [service]  @ [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=-
t=0 0
c=IN IP [media_ip_type] [media_ip]
m=audio  [media_port]  RTP/AVP 0
a=rtpmap:0 PCMU/8000
]]>


关键词

       关键词            默认值                  说明
[service]           service                 由参数 -s  传递,一般用来指定单个主被叫
[remote_ip]                     远端设备地址
[remote_port]         5060                 远端设备端口   。可以在脚本中使用偏移量,如 [remote_port+3]
[transport]           UDP                 指定传输层协议,   UDP/TCP ,由参数 -t  决定

[local_ip]                   主机本地地址  ,  可以由参数 -i  指定
[local_ip_type]                   ip  版本
[local_port]         由系统随机分配   可由   -p  指定,可以在脚本中使用偏移量,如 [local_port+3]
[len]                             sdp  长度, 用于 " Content-Length " 头域,   sipp  自动生成或者手动指定,可以添加偏移量,如 [len+3

[call_number]                   呼叫索引,     开始,每增加一个呼叫递增   1
[cseq]                           初始值为   1 ,可以使用参数   -base_cseq  手动指定初始值。
[media_ip]                       本地媒体流   ip ,可以由   -mi  参数指定
[media_ip_type]                 本地媒体流   ip  版本
[media_port]                     本地媒体流端口,可由   -mp  指定,可以设置偏移量 [media_port+3]

[auto_media_port]               自动指定媒体流端口,仅用于   pcap 。该参数使多个呼叫的音频和视频端口从 -mp  指定的端口开始,并给每个新的呼      叫分配端口。   SIPp  默认支持 10000    rtp  流并发
[last_*]                         此关键词用于从接收的上一个   sip  消息中提取指定头域(如果存在)   的值。比如 [last_to] 则表示从接收的上一      个   sip  消息中提取   To  域的消息保存到 [last_to] 中并应用。

[field0-n                                                                         
file=        
line=]                   从从外部文件   csv  加载值,   file  表示选择从命令行中指定的   csv  文件的一个文件作为外部文件,   line 定义选择的 外部文件的起始行,   field 选择字段

[file                                
name=]                 把指定的文件中内容全部插入到   sip  消息中。由于空格符,回车符及换行符不被某些关键词识别,所以插入的文件 需要被精确地编辑成你想要的格式才行,否则会有乱码。

[timestamp]                         当前时间戳,与错误日志的时间戳格式一样
[last_message]                     上一个收到的消息
[$n]                               用于插入定义的呼叫变量   n
[authentication]                   用于认证头(   authentication head ),这个关键词可以使用参数,书写格式为:   [authentication e=myusername password=mypassword] ,如果没有指定用户名(   username ),则需使用命令行参数 -au  或者 -s  指定;如果没有指定密码
                                       (   password ),则需使用命令行参数 -ap  指定
[routes]                           如果在   recv  命令中已设置 rrs " 属性为   true ,则 Record-Route " 头被存储在关键词   [route] 中,
                                       可使用 [routes] 调用。

[next_url]                         如果在   recv  命令中已设置 rrs " 属性为   true ,则 [next_url]  中包含   Contact  头中的内容
[branch]                           生成一个由 (z9hG4bK) + call number + message  索引   组成的   branch id  到脚本中。如果你想要使用与之前的消息一 样的   branch id ,你可以使用偏移量指定,如 [branch-N]
[msg_index]                         在脚本中提供消息号
[cseq]                              提供接收到的上一个请求消息中的   CSeq  值,可以使用 [cseq+1] 来递增该值。

[clock_tick]                         在消息中包含   sipp  的内部时钟
[pid]                                指定   sipp    pid ,即进程号
[sipp_version]                       在消息中包含   sipp  的版本

[tdmmap]                            在呼叫消息中包含   tdm  映射值
[fill]                              使用字符填充消息

[users]                             如果在命令行中指定了   -users  参数,   则这个关键词表示当前已经运行的用户的数量
[userid]                           如果在命令行中指定了   -users  参数,   则这个关键词表示当前正在运行的用户的   id (范围为   users-1

                                                


6.2 创建服务端(类似 UAS) 脚本
脚务端脚本以 recv " 命令开始,语法规则和可用命令跟客户端脚本的是一样的,不过
在服务端脚本中会用到很多的 [last_*] 关键词,举个例子如下:

SIP/2.0 180 Ringing
[last_Via:]
[last_From:]
[last_To:] ;tag= [call_number]
[last_Call-ID:]
[last_CSeq:]
Contact: [local_ip] : [local_port] ;transport= [transport] >
Content-Length: 0
]]>

在这个脚本中是准备回复   180  消息,而且该   180  消息中的一些内容是从上一个接收的
invite  中提取出来的。


6.3 动作( Actions)
在一个 recv " 或者 recvCmd " 命令中,可以执行一些动作,目前支持如下动作:
正则表达式(   ereg
记录日志(   log
执行外部命令(如系统命令),内部命令,以及播放   pcap  文件(   exec
执行双精度变量算术运算
给变量赋字符串值
比较双精度变量
跳到脚本的指定索引
  csv  文件中查找指定词
鉴权
改变一个呼叫的网络地址


1) 正则表达式
  SIPp  中使用正则表达式可以实现如下功能:
提取   SIP  消息中的内容并存储到变量中以在后续中用到
检查   SIP  消息中的某些内容是否满足要求
SIPp  中的正则表达式满足   PSIX 1003.2  规范。


特别提示一下:在同一个动作( action )中可以同时使用多个正个表达式。举例说明如
下:
第一个动作(   First action ):
提取接收到的   sip  消息中的第一个   ipv4  地址
检查我们是否能够成功提取该   ip  地址
将该   ip  地址赋给呼叫变量     2
第二个动作(   Second action ):
提取接收到的消息的   Contact 
将提取的   contact  头分配给变量   6



运行参数

在线帮助:使用 sipp -h 可查看

脚本文件参数

脚本文件参数

-sd         导出内嵌的脚本文件
-sf         加载自定义的脚本   XML  格式
-oocsf         加载   out-of-call  脚本
-oocsn          加载   out-of-call  脚本
-sn         使用默认(内置)脚本,如果不指定参数,则默认是   uac ,可用的参数如下:
uac :标准   uac
uas :简单   uas
regexp :带正则表达式的   uac
branchc
brahchs
3pcc-C-A
3pcc-C-B
3pcc-B
3pcc-A


常用运行参数
-aa         使能   SIPp    INFO, UPDATE and NOTIFY  自动回   200ok

-inf         在呼叫过程中,从一个外部   CSV  文件引入值到脚本中去。文件的第一行表明数据的读取顺序。

-r         设置呼叫速率(设置多少个呼叫每秒)

-l         设置最大的并发呼叫量
-m         设置本轮最大的呼叫个数,当   sipp  达到该指定值会自动退出
-users         指定同时进行的呼叫个数


-f         设置在屏幕上的统计报告频率,默认为  





性能测试建议

12.1  使用 SIPp 做性能测试的建议

SIPp 本身就是被设计用来做性能测试, 通常情况下能够满足中等并发中等呼叫速率的测试场景。
如果测试时满足下列条件,则可以用 SIPp 来测试高并发、高呼叫速率的场景:
l 使用 Linux 系统来达到高并发。Windows 版本(使用 CYGWIN)性能不够高
l 尽量不使用消息跟踪功能,消息跟踪(如-trace_msg, -trace_logs 等)仅用于调试而不是性能测试
l 理解 SIPp 的内部调度机制,并使用命令行参数-timer_resol,  -max_recv_loops 和 -max_sched_loops 来调整 SIPp,使运行在最佳状态。

SIPp内部机理

12.2 SIPp 内部调度机制

SIPp 持续地执行 loop 直到遇到让它停止执行的条件,如运行过程中按 q 键,或达到最大的呼叫量等等。
几个可以对 sipp 的性能进行微调的命令行参数如下:

l    定时器精确度(timer_resol) :默认的定时器精确度是 1ms,这也是 sipp 所能支持的最高的精确度,如果调大了精确度会导致 SIPp 处理不过来
l   max_recv_loops  和 max_sched_loops:max_recv_loops 是 sipp 在单位时间内所能读取的最大消息量,
 max_sched_loops 是单位时间内所能处理的最大呼叫量,在呼叫量很大的测试时可以调大这两个值,
 不过要注意,调大这两个值后会对 cpu 的占用带来较大的影响
l   watchdog_interval,  
   watchdog_minor_threshold,       watchdog_major_threshold,
    watchdog_minor_maxtriggers,  watchdog_major_maxtriggers
  watchdog 是用来监视 sipp 是否已经挂死的,可以适当调大这些值

网文摘录 ...... 用SIPp实现的测试话机被叫的脚本
自动测试话机作为被叫的稳定性。
主叫过程的测试需要开发支持,应该有两种办法,
一是SIPp作为主叫,话机作为被叫,被叫几秒后,自动接通,然后主叫放一些音频文件;
二是话机作为主叫,SIPp作为被叫,收到INVITE直接接通,然后放一段音频,然后挂断。

#! /bin/sh

>results.txt

while true; do

       ./sipp -sf ben_send_register.xml -inf register.csv -m 1 -t u1 -i 192.168.1.40 -p 5060 192.168.1.2

       ./sipp -sf ben_response_notify.xml -m 1

       ./sipp -sf ben_send_invite.xml -inf register.csv -r 1 -rp 10000 -s 8001 -m 360 -t u1 -i 192.168.1.40 -p 5060 192.168.1.2

       if test $? -ne 0
               then
                       echo `date` >> results.txt
                       echo Test failed >> results.txt

               else
                       echo `date` >> results.txt
                       echo Test succeeded >> results.txt
       fi

用Sipp 对Asterisk 进行性能测试
公司需要, 对Asterisk 进行一定的性能测试.

测试目标:
   1.  IVR 支持多少路
   2.  一对一通话, 支持多少路
   3.  不同编解码的性能影响.
   4. 通话中,录音, 支持多少路.

   测试工具: sipp  http://sipp.sourceforge.net/
   辅助工具: Xlite

   SIP rfc:  http://www.ietf.org/rfc/rfc3261.txt
   RTP for AV  http://www.ietf.org/rfc/rfc3551.txt

   环境:
   CPU: xeon 5110 1.6G*2 , 1 G MEM 物理机
   Asterisk-1.4.7

   Asterisk 基本操作:
   启动: safe_asterisk, 或者asterisk -vvvc
   如果是后台启动, 连接监控: astersisk -r
   关闭: 在控制栏输入 stop now

   Asterisk 配置:
   关注两个配置文件(/etc/asterisk):
   sip.conf         // sip 分机号设置
   extensions.conf   // dail plan 设置, 控制呼入后是什么动作

   sip.conf 添加2000 个分机号, 以便模拟1000 人呼叫(呼叫,应答)

   [1000]
   type=friend
   host=dynamic
   context=incoming   //和extensions.conf 中对应
   canreinvite=no   //如果设置为yes, 双方通话信息会直接进行, 而不通过asterisk. 设置成no,表示所有交互都通过Asterisk.

   [1001]
   type=friend
   host=dynamic
   context=incoming
   canreinvite=no

   extensions.conf  这里列举了多种呼叫计划, 包括IVR,  拨号通话, 通话录音等.

   [incoming]
   ;play hello world forever
   exten => _XXXX,1,answer()
   exten => _XXXX,2,playback(hello-world)
   exten => _XXXX,3,goto(OneToOne,_XXXX,1)
;[typetest]
   ;exten => 1111,1,Wait(2)
   ;exten => 1111,2,Record(/tmp/asterisk-recording:gsm)
   ;exten => 1111,3,Hangup
   ;exten => 1112,1,Wait(2)
   ;exten => 1112,n,Playback(/tmp/asterisk-recording)
   ;exten => 1112,n,Hangup

   ;[typetest2]
   ;exten => _XXXX,1,answer()
   ;exten => _XXXX,2,dial(sip/${EXTEN},10,r)

   ;[typetest3]
   ;exten => 999,1,answer()
   ;exten => 999,2,dial(sip/${EXTEN},10,r)
   ;exten => 999,1,Meetme(1234,i,123456)

   ;[OneToOne]
   ;exten => _XXXX,1,answer()
   ;exten => _XXXX,2,mixmonitor(test${EXTEN}.wav|av(0)V(0))
   ;exten => _XXXX,3,dial(sip/${EXTEN},10,r)
   ;exten => _XXXX,4,Hangup
   ;exten => _XXXX,3,Record(/tmp/asterisk-recording${EXTEN}:gsm)

   ;[IVR]
   ;exten => _XXXX,1,answer()
   ;exten => _XXXX,2,playback(hello-world)
   ;exten => _XXXX,3,goto(IVR,_XXXX,2)

   Sipp 基本操作:

   sipp 涉及三个文档(以呼入后,就不停播放IVR 语音):

   *.bat   批处理命令,方便调用, 其中 -m 参数表示

   sipp -sf a16.xml -inf a16.csv -p 5062 -m 200 -i 172.16.3.199 10.0.1.4:5060 -trace_err

   *.xml   // 具体的操作, 核心部分, 下篇具体介绍xml 文件

   *.csv  // xml 里面引用的参数, 以便发起不同呼叫

   SEQUENTIAL
   2001;1002;
   2003;1003;
   2200;1200;

你可能感兴趣的:(软件产品开发)