最近SIP电话项目功能部分已经基本完成,但是甲方对服务器有很多性能部分的要求,这个项目的上一个人主要工作就是功能的实现,剩下的压力测试就就落到了我身上。主要使用SIPp对FreeSwitch
服务器进行压力测试。
SIPp简介
SIPp是一个测试SIP协议性能的工具软件。这是一个GPL的开放源码软件。
它包含了一些基本的SIP用户代理工作流程(UAC
和UAS
,其中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
可以在Linux
和Cygwin
上面,当然,SIPp
在Linux
上性能要比Cygwin
上好。在Linux
上SIPp
提供了源码包安装,因此安装之前需要编译,以下编译环境不可缺少:
- C++编译器
- curse库或者ncurse库
- 如需要
pcap
功能:需要libpcap
以及libnet
- 如需要支持
TLS
功能: 需要OpenSSL
0.9.8以上版本 - 如需要支持
SCTP
: 需要lksctp-tools
- 对于需要支持统计分布的暂停:需要开源科学计算库(Gnu Scientific Libraries)
根据项目的需求,我需要pcap
和OpenSSL
功能,因此安装过程如下
1 | 1. 安装编译环境 |
可以使用sipp -v
查看sipp
版本号以测试sipp
是否安装成功
对注册功能进行性能测试
注册功能的测试较为简单,此测试本没有必要,因为FreeSwitch
服务器与SIP
客户端不是一直保持连接,而是每隔一段时间客户端往FreeSwitch
发送Register
消息来随时更新自己的位置。这样的话并不涉及到性能,但是之后的UAS
需要用到注册的功能实现,所以在此就把注册功能的压力测试一并做了。
前面说了,SIPp
主要依靠场景文件来实现功能。场景文件指的是一个XML
文件,在这个文件里描述了SIP
的相关流程,比如注册、被叫以及主叫流程。
此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
请求包中即可。具体可以查看上面提供的场景文件。
这是我测试的结果: