sipp3.6对freeswitch进行压力测试
一、安装sipp
1、下载地址:
https://github-production-release-asset-2e65be.s3.amazonaws.com/13161657/99df6100-9216-11e9-9439-d9c9f5284379?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20200904%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20200904T024024Z&X-Amz-Expires=300&X-Amz-Signature=df9c9aeba4b219e5a3c6ea4cd0cbb76785900829a5294ac6d72f5c7ba4409f9b&X-Amz-SignedHeaders=host&actor_id=30207023&key_id=0&repo_id=13161657&response-content-disposition=attachment%3B%20filename%3Dsipp-3.6.0.tar.gz&response-content-type=application%2Foctet-stream
2、安装依赖包
yum install ncurse* yum install openssl* yum install lksctp* yum install libpcap*
3、安装sipp3.6
tar -xvzf sipp-xxx.tar.gz cd sipp ./configure --with-sctp --with-pcap --with-openssl make
4、验证安装
sipp -v
二、环境设置
1、修改系统openfile限制
(1)vim /etc/security/limits.conf,添加:
* soft nofile 32768
* hard nofile 65535
(2)vim /etc/pam.d/login,添加:
session required /lib/security/pam_limits.so
(3)命令行输入:
ulimit -s unlimited
ulimit -a
2、修改freeswitch配置
(1)cd /etc/freeswitch/autoload_configs,编辑vim switch.conf.xml
# 修改 <param name="max-sessions" value="100000"/> <param name="sessions-per-second" value="10000"/>
(2)修改拨号正则,cd /etc/freeswitch/dialplan,修改某个profile:
<?xml version="1.0" encoding="utf-8"?>
<include>
<extension name="Balance_load">
<condition field="destination_number" expression="^([2-6][0-9][0-9][0-9])$">
<action application="export" data="dialed_extension=$1"/>
<action application="set" data="sip_h_History-Info=${sip_history_info}"/>
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="callId=${uuid}"/>
<action application="bridge" data="{absolute_codec_string=pcma,callId=${uuid}}sofia/webphonetest/$1@${local_ip_v4}:56148" />
</condition>
</extension>
</include>
其中,@172.200.115.13:56148是被叫IP和端口
(3)添加default配置文件。
cd /etc/freeswitch/directory/default # 3000 5999为自己需要的用户 for i in `seq 2000 5999`; do sed -e "s/1000/$i/g" 1000.xml > $i.xml ; done
(4)添加白名单,无需鉴权
cd /etc/freeswitch/autoload_configs vim acl.conf.xml # 进入编辑模式修改 <list name="domains" default="deny"> <!-- domain= is special it scans the domain from the directory to build the ACL --> <node type="allow" domain="$${domain}"/> <!-- use cidr= if you wish to allow ip ranges to this domains acl. --> <node type="allow" cidr="192.168.200.0/24"/> <!--新增此行. --> <node type="allow" cidr="10.10.81.0/24"/> </list>
三、配置文件
1、uac.csv
SEQUENTIAL 2000;2050;[authentication username=2000 password=1234] 2001;2051;[authentication username=2001 password=1234] 2002;2052;[authentication username=2002 password=1234] 2003;2053;[authentication username=2003 password=1234] 2004;2054;[authentication username=2004 password=1234] 2005;2055;[authentication username=2000 password=1234] 2006;2056;[authentication username=2001 password=1234] 2007;2057;[authentication username=2002 password=1234] 2008;2058;[authentication username=2003 password=1234] 2009;2059;[authentication username=2004 password=1234] 2010;2060;[authentication username=2000 password=1234] 2011;2061;[authentication username=2001 password=1234] 2012;2062;[authentication username=2002 password=1234] 2013;2063;[authentication username=2003 password=1234] 2014;2064;[authentication username=2004 password=1234] 2015;2065;[authentication username=2000 password=1234] 2016;2066;[authentication username=2001 password=1234] 2017;2067;[authentication username=2002 password=1234] 2018;2068;[authentication username=2003 password=1234] 2019;2069;[authentication username=2004 password=1234] 2020;2070;[authentication username=2000 password=1234] 2021;2071;[authentication username=2001 password=1234] 2022;2072;[authentication username=2002 password=1234] 2023;2073;[authentication username=2003 password=1234] 2024;2074;[authentication username=2004 password=1234] 2025;2075;[authentication username=2000 password=1234] 2026;2076;[authentication username=2001 password=1234] 2027;2077;[authentication username=2002 password=1234] 2028;2078;[authentication username=2003 password=1234] 2029;2079;[authentication username=2004 password=1234] 2030;2080;[authentication username=2000 password=1234] 2031;2081;[authentication username=2001 password=1234] 2032;2082;[authentication username=2002 password=1234] 2033;2083;[authentication username=2003 password=1234] 2034;2084;[authentication username=2004 password=1234] 2035;2085;[authentication username=2000 password=1234] 2036;2086;[authentication username=2001 password=1234] 2037;2087;[authentication username=2002 password=1234] 2038;2088;[authentication username=2003 password=1234] 2039;2089;[authentication username=2004 password=1234] 2040;2090;[authentication username=2000 password=1234] 2041;2091;[authentication username=2001 password=1234] 2042;2092;[authentication username=2002 password=1234] 2043;2093;[authentication username=2003 password=1234] 2044;2094;[authentication username=2004 password=1234] 2045;2095;[authentication username=2000 password=1234] 2046;2096;[authentication username=2001 password=1234] 2047;2097;[authentication username=2002 password=1234] 2048;2098;[authentication username=2003 password=1234] 2049;2099;[authentication username=2004 password=1234]
2、uas.csv
SEQUENTIAL 2050;;[authentication username=2050 password=1234] 2051;;[authentication username=2051 password=1234] 2052;;[authentication username=2052 password=1234] 2053;;[authentication username=2053 password=1234] 2054;;[authentication username=2054 password=1234] 2055;;[authentication username=2050 password=1234] 2056;;[authentication username=2051 password=1234] 2057;;[authentication username=2052 password=1234] 2058;;[authentication username=2053 password=1234] 2059;;[authentication username=2054 password=1234] 2060;;[authentication username=2050 password=1234] 2061;;[authentication username=2051 password=1234] 2062;;[authentication username=2052 password=1234] 2063;;[authentication username=2053 password=1234] 2064;;[authentication username=2054 password=1234] 2065;;[authentication username=2050 password=1234] 2066;;[authentication username=2051 password=1234] 2067;;[authentication username=2052 password=1234] 2068;;[authentication username=2053 password=1234] 2069;;[authentication username=2054 password=1234] 2070;;[authentication username=2050 password=1234] 2071;;[authentication username=2051 password=1234] 2072;;[authentication username=2052 password=1234] 2073;;[authentication username=2053 password=1234] 2074;;[authentication username=2054 password=1234] 2075;;[authentication username=2050 password=1234] 2076;;[authentication username=2051 password=1234] 2077;;[authentication username=2052 password=1234] 2078;;[authentication username=2053 password=1234] 2079;;[authentication username=2054 password=1234] 2080;;[authentication username=2050 password=1234] 2081;;[authentication username=2051 password=1234] 2082;;[authentication username=2052 password=1234] 2083;;[authentication username=2053 password=1234] 2084;;[authentication username=2054 password=1234] 2085;;[authentication username=2050 password=1234] 2086;;[authentication username=2051 password=1234] 2087;;[authentication username=2052 password=1234] 2088;;[authentication username=2053 password=1234] 2089;;[authentication username=2054 password=1234] 2090;;[authentication username=2050 password=1234] 2091;;[authentication username=2051 password=1234] 2092;;[authentication username=2052 password=1234] 2093;;[authentication username=2053 password=1234] 2094;;[authentication username=2054 password=1234] 2095;;[authentication username=2050 password=1234] 2096;;[authentication username=2051 password=1234] 2097;;[authentication username=2052 password=1234] 2098;;[authentication username=2053 password=1234] 2099;;[authentication username=2054 password=1234]
3、regclient_set_c_port.xml
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE scenario SYSTEM "sipp.dtd"> <scenario name="regclient"> <Global variables="c_port" /> <nop hide="true"> <action> <assignstr assign_to="EXP" value="3600" /> </action> </nop> <send> <![CDATA[ REGISTER sip:[remote_ip] SIP/2.0 Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch] From: <sip:[field0]@[remote_ip]>;tag=acknnkkg.[call_number] To: <sip:[field0]@[remote_ip]> Call-ID: [call_id] CSeq: 1 REGISTER Contact: <sip:[field0]@[local_ip]:[$c_port]> Max-Forwards: 70 Subject: Reg Performance Test user-agent: SIPp client Expires: [$EXP] Content-Length: 0 ]]> </send> <recv response="401" optional="true" auth="true" next="auth" > </recv> <recv response="403" optional="true" next="END"> </recv> <recv response="404" optional="true" next="END"> </recv> <recv response="200" next="END" timeout="5000"> </recv> <label id="auth" /> <send retrans="500"> <![CDATA[ REGISTER sip:[field0]@[remote_ip]:[remote_port] SIP/2.0 Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch] From: [field0] <sip:[field0]@[remote_ip]:[remote_port]>;tag=[call_number] To: [field0] <sip:[field0]@[remote_ip]:[remote_port]> Call-ID: [call_id] CSeq: 2 REGISTER Contact: sip:[field0]@[local_ip]:[local_port] Max-Forwards: 70 Subject: Reg Performance Test user-agent: SIPp client Expires: [$EXP] [field2] Content-Length: 0 ]]> </send> <recv response="200" next="END" timeout="5000"> </recv> <label id="END"/> <nop hide="true"> </nop> <!--<Reference variables="microseconds,seconds" />--> <!-- Definition of the response time repartition table (unit is ms) --> <ResponseTimeRepartition value="50, 200"/> <!-- Definition of the call length repartition table (unit is ms) --> <CallLengthRepartition value="500, 5000"/> </scenario>
4、caller_with_auth.xml
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE scenario SYSTEM "sipp.dtd"> <scenario name="caller_with_auth"> <!--执行命令样例:sipp -sf caller_with_auth.xml xx.x.x.xx:5060 -p 5066 -inf caller.csv -m 1 -d 10000 -oocsn ooc_default--> <!--发送INVITE消息,设定重传定时器为1000ms,同时启动定时器invite--> <send retrans="1000" start_rtd="invite"> <![CDATA[ INVITE sip:[field1]@[remote_ip] SIP/2.0 Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch] From: "[field0]" <sip:[field0]@[remote_ip]>;tag=[call_number]zhg8 To: "[field1]"<sip:[field1]@[remote_ip]> Call-ID: [call_id] CSeq: 1 INVITE Contact: <sip:[field0]@[local_ip]:[local_port]> User-Agent: SIPp client mode version [sipp_version] Allow: INVITE,PRACK,ACK,UPDATE,CANCEL,BYE,OPTIONS,INFO,SUBSCRIBE,REFER,NOTIFY Max-Forwards: 70 Content-Type: application/sdp Content-Length: [len] v=0 o=SIPp [pid][call_number] 8[pid][call_number]8 IN IP[local_ip_type] [local_ip] s=SIPp Normal Call Test t=0 0 m=audio [media_port] RTP/AVP 0 8 c=IN IP[media_ip_type] [media_ip] a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000 a=ptime:20 a=sendrecv ]]> </send> <recv response="100" optional="true"> </recv> <!-- <recv response="401" auth="true"> --> <!-- </recv> --> <!-- 部分呼叫鉴权可能为407 --> <!-- <recv response="407" option="true" auth="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-3] From: "[field0]" <sip:[field0]@[remote_ip]>;tag=[call_number]zhg8 To: "[field1]"<sip:[field1]@[remote_ip]>[peer_tag_param] Call-ID: [call_id] CSeq: 1 ACK Contact: <sip:[field0]@[local_ip]:[local_port]> Max-Forwards: 70 Subject: normal call scenario user-agent: SIPp client mode version [sipp_version] Content-Length: 0 ]]> </send> <send retrans="1000" start_rtd="invite"> <![CDATA[ INVITE sip:[field1]@[remote_ip] SIP/2.0 [last_Via:] From: "[field0]" <sip:[field0]@[remote_ip]>;tag=[call_number]zhg8 To: "[field1]"<sip:[field1]@[remote_ip]> Call-ID: [call_id] CSeq: 2 INVITE [field2] Contact: <sip:[field0]@[local_ip]:[local_port]> User-Agent: SIPp client mode version [sipp_version] Allow: INVITE,PRACK,ACK,UPDATE,CANCEL,BYE,OPTIONS,INFO,SUBSCRIBE,REFER,NOTIFY Max-Forwards: 70 Content-Type: application/sdp Content-Length: [len] v=0 o=SIPp [pid][call_number] 8[pid][call_number]8 IN IP[local_ip_type] [local_ip] s=SIPp Normal Call Test t=0 0 m=audio [media_port] RTP/AVP 0 8 c=IN IP[media_ip_type] [media_ip] a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000 a=ptime:20 a=sendrecv ]]> </send> <!--1xx响应均为可选接收消息,且接收到临时响应后,即可停止invite定时器的计时--> <!--收到4xx/5xx错误响应后,直接进入呼叫失败--> <!-- <recv response="100" optional="true" rtd="invite"> </recv> <recv response="183" optional="true" rtd="invite" next="normal"> </recv> <recv response="403" optional="true" rtd="invite" next="err_ack"> </recv> <recv response="407" optional="true" rtd="invite" next="err_ack"> </recv> <recv response="415" optional="true" rtd="invite" next="err_ack"> </recv> <recv response="480" optional="true" rtd="invite" next="err_ack"> </recv> <recv response="486" optional="true" rtd="invite" next="err_ack"> </recv> <recv response="500" optional="true" rtd="invite" next="err_ack"> </recv> <recv response="503" optional="true" rtd="invite" next="err_ack"> </recv> --> --> <recv response="180" optional="true" rtd="invite" next="normal"> </recv> <label id="normal"/> <recv response="200" rtd="invite"> <action> <ereg regexp="m=audio ([0-9]*)" search_in="msg" check_it="true" assign_to="junk,callee_media_port" /> </action> </recv> <nop hide="true"> </nop> <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]@[remote_ip]>;tag=[call_number]zhg8 To: "[field1]"<sip:[field1]@[remote_ip]>[peer_tag_param] Call-ID: [call_id] CSeq: 2 ACK Contact: <sip:[field0]@[local_ip]:[local_port]> Max-Forwards: 70 Subject: normal call scenario user-agent: SIPp client mode version [sipp_version] Content-Length: 0 ]]> </send> <!--使用rtp_stream循环播放PCMA音频 <nop hide="true"> <action> <exec rtp_stream="pcap/g711a.pcap,-1,0"/> </action> </nop> --> <!--使用rtp_stream循环播放PCMU音频 <nop hide="true"> <action> <exec rtp_stream="pcap/g711u.pcap,-1,0"/> </action> </nop> --> <!--使用play_pcap单次播放PCMA音频--> <nop hide="true"> <action> <exec play_pcap_audio="pcap/g711a.pcap"/> </action> </nop> <!--使用play_pcap单次播放PCMU音频 <nop hide="true"> <action> <exec play_pcap_audio="pcap/g711u.pcap"/> </action> </nop> --> <!--媒体流传输完毕后,暂停发送BYE结束呼叫,在执行命令中增加参数-d 指定暂停时间:如-d 10000暂停10秒--> <pause /> <send start_rtd="bye"> <![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]@[remote_ip]>;tag=[call_number]zhg8 To: "[field1]"<sip:[field1]@[remote_ip]>[peer_tag_param] Call-ID: [call_id] CSeq: 3 BYE Max-Forwards: 70 Subject: normal call scenario Content-Length: 0 ]]> </send> <recv response="200" rtd="bye" next="END"> </recv> <!--异常结束,复用err_ack流程--> <label id="err_ack"/> <send> <![CDATA[ ACK sip:[field1]@[remote_ip]:[remote_port] SIP/2.0 [last_Via:] From: "[field0]" <sip:[field0]@[remote_ip]>;tag=[call_number]zhg8 To: "[field1]"<sip:[field1]@[remote_ip]>[peer_tag_param] [last_Call-ID:] CSeq: 2 ACK Max-Forwards: 70 Subject: normal call scenario user-agent: SIPp client mode version [sipp_version] Content-Length: 0 ]]> </send> <!--正常结束--> <label id="END"/> <nop hide="true"> </nop> <!--如果存在定义了但未被使用的变量,可以在下面语句的双引号中增加,避免运行时报错--> <Reference variables="junk,callee_media_port" /> <!--definition of the response time repartition table (unit is ms) --> <ResponseTimeRepartition value="50, 200,1000,2000,4000,10000"/> <!--definition of the call length repartition table (unit is ms) --> <CallLengthRepartition value="500, 1000, 10000"/> </scenario>
5、callee_with_bye.xml
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE scenario SYSTEM "sipp.dtd"> <scenario name="callee_with_bye"> <!--用于模拟局内被叫侧用户的正常业务流程 媒体类型:PCMU 呼叫挂机:主叫方(60秒超时后主动发BYE拆话)--> <!--执行命令样例:sipp -sf callee_with_bye.xml -p 5068--> <!--定义全局状态机,如果收到OPTIONS消息,则跳转至options标签处--> <recv request="OPTIONS" optional="global" next="options"> </recv> <recv request="INVITE"> <!--参数caller_num、callee_num和caller_tag用于主叫未挂机,BYE接收超时主动发BYE的流程--> <action> <ereg regexp="sip:(.*)@(.*)>;tag=(.*)" search_in="hdr" header="From: " check_it="true" assign_to="junk,caller_num,domain,caller_tag" > </ereg> <ereg regexp="sip:(.*)@.*>" search_in="hdr" header="To: " check_it="true" assign_to="junk,callee_num" > </ereg> </action> </recv> <!--增加间隔20ms,避免偶现系统不发送100响应的问题--> <pause hide="true" milliseconds="20"/> <send> <![CDATA[ SIP/2.0 100 Trying [last_Via:] [last_From:] [last_To:] [last_Call-ID:] [last_CSeq:] Contact: <sip:[local_ip]:[local_port];transport=[transport]> Content-Length: 0 ]]> </send> <!--增加间隔20ms,避免偶现系统不发送180响应的问题--> <pause hide="true" milliseconds="20"/> <send> <![CDATA[ SIP/2.0 180 Ringing [last_Via:] [last_From:] [last_To:];tag=[call_number] [last_Call-ID:] [last_CSeq:] Contact: <sip:[local_ip]:[local_port];transport=[transport]> Content-Length: 0 ]]> </send> <!--设置发送200后等待ACK的重传周期为1秒,如果1秒内收不到ACK则进行200的重传--> <send retrans="1000" start_rtd="ack"> <![CDATA[ SIP/2.0 200 OK [last_Via:] [last_From:] [last_To:];tag=[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 0 8 a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000 a=ptime:20 ]]> </send> <!--设置等待ACK的超时定时器为30秒,如果30秒内收不到ACK则呼叫超时失败而结束--> <recv request="ACK" rtd="ack" timeout="30000" /> <!--使用rtp_stream循环播放PCMA音频 <nop hide="true"> <action> <exec rtp_stream="pcap/g711a.pcap,-1,0"/> </action> </nop> --> <!--使用rtp_stream循环播放PCMU音频 <nop hide="true"> <action> <exec rtp_stream="pcap/g711u.pcap,-1,0"/> </action> </nop> --> <!--使用play_pcap单次播放PCMA音频--> <nop hide="true"> <action> <exec play_pcap_audio="pcap/g711a.pcap"/> </action> </nop> <!--使用play_pcap单次播放PCMU音频 <nop hide="true"> <action> <exec play_pcap_audio="pcap/g711u.pcap"/> </action> </nop> --> <recv request="BYE" timeout="60000" ontimeout="send_bye"/> <send next="END"> <![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> <label id="options"/> <send next="END" > <![CDATA[ SIP/2.0 200 OK [last_Via:] [last_Call-ID:] [last_From:] [last_To:];tag=telpo-options[call_number] [last_CSeq:] [last_Contact:] user-agent: SIPP version [sipp_version] subject: reg performance link-status: I am alive Content-Length: 0 ]]> </send> <!--主叫未挂机,BYE接收超时,被叫主动发BYE--> <label id="send_bye"/> <send start_rtd="bye"> <![CDATA[ BYE sip:[$caller_num]@[local_ip]:[local_port] SIP/2.0 Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch] From: "[$caller_num]" <sip:[$caller_num]@[local_ip]>;tag=[call_number] To: "[$callee_num]"<sip:[$callee_num]@[local_ip]>;tag=[$caller_tag] Call-ID: [call_id] CSeq: 2 BYE Max-Forwards: 70 Subject: normal call scenario Content-Length: 0 ]]> </send> <recv response="200" rtd="bye"> </recv> <label id="END"/> <Reference variables="junk,domain" /> <!-- definition of the response time repartition table (unit is ms)--> <ResponseTimeRepartition value="50, 200"/> <!-- definition of the call length repartition table (unit is ms)--> <CallLengthRepartition value="500, 1000, 10000"/> </scenario>
四、命令
sipp -sf regclient_set_c_port.xml 172.29.50.60:5050 -i 172.29.50.60 -p 26000 -inf uac.csv -r 5 -rp 1000 -l 5 -m 100 sipp -sf regclient_set_c_port.xml 172.29.50.60:5050 -i 172.29.50.60 -p 56148 -inf uas.csv -r 5 -rp 1000 -l 5 -m 100 sipp -sf callee_with_bye.xml -i 172.29.50.60 -p 56148 -trace_err sipp -sf caller_with_auth.xml 172.29.50.60:5050 -i 172.29.50.60 -p 26000 -inf uac.csv -r 10 -rp 1000 -l 30 -m 100 -d 60000 -oocsn ooc_default -trace_err -aa # -r:并发数量 #-rp:并发的时间,单位ms,例如:-r 800 -rp 1000,就是每秒800并发 #-l:设置同时呼叫的最大数目;一旦达到此值,流量将被限制直到打的通话数下降;默认值3*call_duration(s)*rate #-m:通话总数,当设置的通话数完成时,停止测试并退出; #-d:自定义的通话时长,单位ms #-aa:针对INFO, UPDATE 和 NOTIFY消息,进行200 OK自动回复应答;