蜜果私塾:使用
記錄人:阿蜜果
記錄時間:2010-7-21
1. 使用場景
筆者最近需要對新做的一個SBC(Ssession Border Controller,會話邊界控制器)進行大呼測試。所做的SBC包括兩個模塊:CN和VN,CN模塊做信令轉發,VN模塊主要做媒體轉發,SBC用于解決SIP和媒體流的NAT穿越問題。
SBC服務器為雙網卡機器,IP地址為:192.168.2.47和125.39.155.110,UAS服務器的IP為192.168.2.66。UAC所在機器(筆者機器)的IP為125.39.155.107。
UAC往SBC服務器發INVITE消息,SBC接收到消息后,由CN模塊將消息轉發給UAS服務器,并轉發UAS發過來的信息給UAC,呼叫建立后,UAS和UAC的媒體流的轉發由SBC的VN模塊來做。
UAC(125.39.155.107)< -------------------> SBC (192.168.2.47、125.39.155.110)<----------------->UAS(192.168.2.66)
在該大呼測試中,UAC由筆者機器的Sipp軟件來做,UAS是另一臺經過測試的穩定的服務器,它在收到SBC的INVITE消息后,發100、180、200,并放一段音。
2. uac.xml編輯
因為我們需要在媒體包、所帶的音頻Codec等、另外流程等上有一些不同,所以還需要準備自定義的uac.xml。在Sipp的安裝目錄(eg. C:"Program Files"Sipp_3.1)新建uac.xml文件,該文件內容編寫如下:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE scenario SYSTEM "sipp.dtd">
<!-- This program is free software; you can redistribute it and/or -->
<!-- modify it under the terms of the GNU General Public License as -->
<!-- published by the Free Software Foundation; either version 2 of the -->
<!-- License, or (at your option) any later version. -->
<!-- -->
<!-- This program is distributed in the hope that it will be useful, -->
<!-- but WITHOUT ANY WARRANTY; without even the implied warranty of -->
<!-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -->
<!-- GNU General Public License for more details. -->
<!-- -->
<!-- You should have received a copy of the GNU General Public License -->
<!-- along with this program; if not, write to the -->
<!-- Free Software Foundation, Inc., -->
<!-- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -->
<!-- -->
<!-- Sipp default 'uac' scenario. -->
<!-- -->
<scenario name="Basic Sipstone UAC">
<send retrans="500">
<![CDATA[
INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port]
From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]
To: sut <sip:[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: 136
v=0
o=user1 53655765 2353687637 IN IP4 127.0.0.1
s=-
t=0 0
m=audio [media_port] RTP/AVP 8
c=IN IP4 [media_ip]
a=rtpmap:8 PCMA/8000
]]>
</send>
<recv response="100"
optional="true">
</recv>
<recv response="180" optional="true">
</recv>
<recv response="200" rtd="true">
</recv>
<!-- Packet lost can be simulated in any send/recv message by -->
<!-- by adding the 'lost = "10"'. Value can be [1-100] percent. -->
<send>
<![CDATA[
ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port]
From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]
To: sut <sip:[service]@[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>
<nop>
<action>
<exec play_pcap_audio="pcap/g711a.pcap"/>
</action>
</nop>
<!-- This delay can be customized by the -d command-line option -->
<!-- or by adding a 'milliseconds = "value"' option here. -->
<pause/>
<!-- The 'crlf' option inserts a blank line in the statistics report. -->
<send retrans="500">
<![CDATA[
BYE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port]
From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]
To: sut <sip:[service]@[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>
<!-- 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>
該流程表示的意思是首先由uac主動往外發INVITE,接著期望收到100、180、200信息,UAC收到SBC的200 OK信息后,往SBC發送ACK信息,接著往服務器發送pcap/g711a.pcap的RTP包信息。接著開始pause,pause的是時間是uac啟動時所帶的d參數(在后續章節帶了該參數)。等待d(s)后,往服務器發BYE消息,并期待得到服務器的200 OK信息,流程結束。
上面腳本中的“[]”中都是用戶帶入的一些參數,若未指定,系統會自動指定。
1) remote_ip:服務器的IP,本實例中指定為125.39.155.100;
2) remote_port:服務器的端口,本實例中指定為5040;
3) local_ip:UAC的IP,未指定時,使用UAC所在主機的IP,本例中指定為192.168.4.20;
4) local_port:UAC的端口,本例中指定為6060;
5) call_number:主叫號碼,本實例中通過-s參數指定為01077778888;
6) transport:未指定,默認為udp;
7) call_id:Call-ID,由系統生成,未指定。
……
注意如下這段腳本:
<nop>
<action>
<exec play_pcap_audio="pcap/g711a.pcap"/>
</action>
</nop>
這段表示接通后UAC向服務器發送的RTP包,筆者使用的是Sipp安裝目錄pcap下的g711.pcap包,也可以自己錄制。
3. 媒體包準備
在測試過程中常常需要攜帶RTP流,此時需要有對應的RTP流文件,Sipp安裝目錄pcap下有一些默認的RTP流文件,若不滿足條件,也可以自行錄制,錄制好后,可在wireshark中過濾好需要的包后,點擊“Save As”另存到Sipp安裝目錄/pcap目錄。
4. 測試結果分析
選擇“開始”->“程序”->“Sipp_3.1”->“start sipp”,在彈出的窗口中可以先運行如下語句先試呼叫一個:
sipp -sf uac.xml -m 1 -i 192.168.4.20 -d 5000 -p 6060 -s 01077778888 -rtp_echo 125.39.155.110:5040
其中:
1)-sf后跟的是自定義的uac的腳本文件;
2)-m后跟的是呼叫次數;
3)-i后跟的是本機IP(該參數可以不加,默認使用本機IP);
4)-p后跟的是本地的端口;
5)-d后跟的是暫停的秒數,可“2. uac.xml”
6)-s后跟的是助教號碼;
7)rtp_echo表示需要對方發送RTP;
8)125.39.155.110:5040表示的服務器的IP和端口。
一個試呼成功后,可以開始進行大呼,此時可以去掉-m參數。命令如下:
sipp -sf uac.xml -i 192.168.4.20 -d 5000 -p 6060 -s 01077778888 -rtp_echo 125.39.155.110:5040
另外在SBC服務器開三個窗口觀察當前的運行情況,分別使用如下命令:
1)inmon: 觀察SCF的load值等情況(我們公司平臺的一個命令);
2)vmstat 3:主要觀察id列等,一般要穩定在idle 70%以上;
3)top: 實時查看當前cpu的占用排位情況。
將caps值加到25,運行一段時間后,筆者觀察到top、vmstat 3的情況比較穩定,測試基本情況如下:
1)sipp uac窗口:
從該結果中可看出,雖然有重復現象,但是重發布多,而且沒有“Timout”和“Unexpected Msg”,總體算正常。
2)vmstat 3運行基本情況:
從上圖可以看出,idle值太低,基本在57%,離70%還有距離;
3)top運行基本情況:
從上圖中可以看出,sbcvn模塊所占CPU比較高,需要重點優化效率,sbc的VN模塊基本在12%,只是負責信令轉發,所以瓶頸在 VN模塊。
4)inmon運行基本情況:
inmon的load值一般在17%,而且比較穩定,沒有突然居高位,并持續居高位的情況,CN模塊比較穩定。
5. 參考文獻
《sip使用秘籍-v1.2》阮班勇:
http://wenku.baidu.com/view/632ac7c758f5f61fb73666c5.html