最近SIP电话项目功能部分已经基本完成,但是甲方对服务器有很多性能部分的要求,这个项目的上一个人主要工作就是功能的实现,剩下的压力测试就就落到了我身上。主要使用SIPp对FreeSwitch服务器进行压力测试。

SIPp简介

SIPp是一个测试SIP协议性能的工具软件。这是一个GPL的开放源码软件。

它包含了一些基本的SIP用户代理工作流程(UACUAS,其中UAC指主动发起呼叫端,UAS指接收呼叫端),并可使用INVITE和BYE建立和释放多个呼叫。它也可以读XML的场景文件,即描述任何性能测试的配置文件。它能动态显示测试运行的统计数据(呼叫速率、信号来回的延迟,以及 消息统计)。周期性地把CSV统计数据转储,在多个套接字上的TCP和UDP,利用重新传输管理的多路复用。在场景定义文件中可以使用正规表达式,动态调整呼叫速率。

SIPp可以用来测试许多真实的SIP设备,如SIP代理,B2BUAs,SIP媒体服务器,SIP/x网关,SIP PBX,等等,它也可以模仿上千个SIP代理呼叫你的SIP系统。

简单的说,SIP能够模拟多个UAC以及被UAS,使用XML文件描述SIP流程,这样就能够对服务器进行性能测试。

下载以及安装

下载

SIPp的网址:http://sipp.sourceforge.net/,这里可以下载最新版的SIPp软件,并且有英文资料可供查阅

SIPp可以在这里下载

安装

SIPp可以在LinuxCygwin上面,当然,SIPpLinux上性能要比Cygwin上好。在LinuxSIPp提供了源码包安装,因此安装之前需要编译,以下编译环境不可缺少:

  • C++编译器
  • curse库或者ncurse库
  • 如需要pcap功能:需要libpcap以及libnet
  • 如需要支持TLS功能: 需要OpenSSL 0.9.8以上版本
  • 如需要支持SCTP: 需要lksctp-tools
  • 对于需要支持统计分布的暂停:需要开源科学计算库(Gnu Scientific Libraries)

根据项目的需求,我需要pcapOpenSSL功能,因此安装过程如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1. 安装编译环境
yum –y install gcc-c++
yum –y install ncurses-devel
yum –y install openssl-devel

为了安装libpcap,还需安装以下两个开发包。
yum –y install flex
yum –y install bison

2. 下载并安装libpcap开发包。
http://www.tcpdump.org/release/libpcap-1.5.3.tar.gz
./configure && make && make install

3. 安装完毕后,就可以开始sipp的配置和安装了。
./configure –with-pcap –with-openssl
make && make install

可以使用sipp -v查看sipp版本号以测试sipp是否安装成功

测试sipp是否成功安装
测试sipp是否成功安装

对注册功能进行性能测试

注册功能的测试较为简单,此测试本没有必要,因为FreeSwitch服务器与SIP客户端不是一直保持连接,而是每隔一段时间客户端往FreeSwitch发送Register消息来随时更新自己的位置。这样的话并不涉及到性能,但是之后的UAS需要用到注册的功能实现,所以在此就把注册功能的压力测试一并做了。

前面说了,SIPp主要依靠场景文件来实现功能。场景文件指的是一个XML文件,在这个文件里描述了SIP的相关流程,比如注册、被叫以及主叫流程。

注册用的UAC文件

XML文件描述的流程如下:

注册测试流程
注册测试流程

为了防止200消息丢失,因此最后暂停2s用于接收重发的200消息

我所使用的sipp命令如下

sipp -r 300 -rp 1000 -i 192.168.0.160 -sf register.xml -inf user.csv 192.168.0.128 -aa

  • -r 300 -rp 1000每秒钟发起300个呼叫,也就是300caps
  • -i 192.168.0.160用于设置本地IP地址,用于填充XML文件中的local_ip,指定Contact:Via:,和From:的地址
  • -sf用于加载指定的外部场景文件(UAC文件)
  • -inf user.csv用于指定场景文件中所使用的数据,之后会有更详细的解释
  • 192.168.0.128用于指定FreeSwitch服务器地址

关于SIPp其他参数的使用可以参考官方文档

所使用的数据文件user.csv内容如下

1000;[authentication username=2000 password=1234]

其中1000是注册号码,在XML文件里面使用field0来引入

authentication username=2000 password=1234用于服务器鉴权使用,如上方的注册流程图所示,在客户端第一次发送请求注册之后,服务器会回应401 Unauthorized消息要求鉴权,一般要求使用md5方式加密注册账号、密码以及401消息中对应的nonce字段,当然,SIPp已经将这些加密过程做好了,我们只需要提供账号密码即可。在XML场景文件中使用field1来引入输入数据到第二次INVITE请求包中即可。具体可以查看上面提供的场景文件。

这是我测试的结果:

测试结果
测试结果