最近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功能: 需要OpenSSL0.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请求包中即可。具体可以查看上面提供的场景文件。
这是我测试的结果:
 
                