平时在做应用的压力测试时,我们会关注应用的TPS、支持的并发能力、RT、JVM等指标,当然还有一系列的硬件指标。而SIP服务器与我们平时的应用服务器会有一些差别,SIP服务器(FreeSWITCH是一种SIP服务器)会负责会话的建立及音视频数据的传输和编解码,我们知道一通电话呼叫所持续的时间,长则上百上千秒,短则只有一两秒,所以在SIP服务器的压力测试上,虽然依然存在TPS、并发能力等指标,但是与我们平时理解的概念会稍微有一些区别,但是透过现象看本质,其实是一回事。
为了讲清楚SIP压测的指标,得先介绍几个术语:
Channel
FreeSWITCH本身是一个背靠背的用户代理,因此通过FreeSWITCH建立的一个呼叫,会存在多个数据链路,我们称之为Channel,比如一个单呼可能只有一个Channel,而一个双呼则有两个Channel,一个电话会议则可能有N个Channel
CPS
Call Per Second,每秒能够处理的通话数,它代表的是每秒钟FreeSWITCH能够建立或者释放Channel的能力
通过以上两个指标,又可以衍生出其他一系列指标,比如:
BHCA
Busy Hour Call Attempt,即最大忙时试呼次数,比如系统每秒能处理30个Channel的建立与释放,每个呼叫持续30秒,那么系统的最大并发数就是30×30=900,而系统每小时能处理的呼叫数就是30×3600=108000,即为BHCA值
通过上面几个指标的介绍,可以发现,其实对于SIP服务器本身来讲,CPS和Channel并发数是比较重要的2个指标,我们可以简单的把CPS理解成TPS,而Channel并发数理解成并发能力。
CPS之所以重要,是因为SIP建立通话大致可以分为2个阶段。第一个阶段,通信双方就接下去要建立的RTP流所采用的端口和音视频编解码技术等方面进行协商;第二阶段,通信双方根据之前协商好的信息,建立RTP长连接,进行通话的数据传输。其中第一阶段对CPU、内存等服务器指标会有一定的消耗抖动,而这之后的第二阶段消耗趋于稳定,因此CPS是考虑服务器性能基线的一个重要指标。
目前操作下来的SIP压测主要有2个目的,一个是为了摸清在特定硬件配置的情况下,服务器稳定运行时FreeSWITCH能够获得的最大CPS和Channel并发值,另一个则是在和外部SIP对接的时候,压测对方提供的线路能力是否符合要求。
先讲外部SIP对接时候的压测,这个相对简单一些。
for i in `seq 100`
do
fs_cli -x 'bgapi originate 呼叫字符串 &playback(/tmp/alicom.wav);'
done
恩,就是一个shell脚本,这个脚本的目的是压测对方是否有100个Channel并发的能力。
fs_cli是FreeSWITCH的一个命令行client,使用它来执行一串FreeSWITCH命令bgapi originate 呼叫字符串 &playback(/tmp/alicom.wav);
,这个命令的意思是采用后台执行api的方式(bgapi),来进行一个呼叫,呼叫接通后播放一个音频文件。
这里呼叫的号码是经过处理的,对方服务器会将该号码的话务路由到我们自己的平台,然后进行应答。/tmp/alicom.wav这个音频文件时长40多秒,因此我们可以理解成这100个Channel将会持续存在40多秒,而在这期间,我们可以再建立到自己手机的通话,来判断此时的一个通话质量情况,是否清晰、是否流畅等。
而要摸清在特定硬件配置的情况下,服务器稳定运行时FreeSWITCH能够获得的最大CPS和Channel并发值,采用shell脚本的方式就会显得力不从心了。这里需要介绍一个新的工具SIPp。
SIPp是一个很好的SIP测试工具,它可以对SIP协议及服务器性能进行比较全面的测试。篇幅原因,本文只讨论SIPp内置的一些测试场景,关于如何定制或编写SIPp测试场景文件,可以查阅SIPp官方文档或者本文档的附录
假设我们想对IP地址为x.x.x.x的FreeSWITCH进行压测,只需要使用这个命令:
sipp -sn uac -r 1 -d 10000 -rtp_echo x.x.x.x:5080
上述命令中,“-sn uac”表示使用SIPp默认的场景文件(它将作为一个UAC,即SIP客户端);“-r 1”表示每秒发一个呼叫请求;“-d 10000”表示每个请求持续10000毫秒(即10秒);“-rtp_echo”表示将收到的RTP流原样发回去(相当于FreeSWITCH中的echo App);最后的参数表示发到FreeSWITCH服务器A的5080端口
上述命令运行后,可以通过键盘上的1、2、3、4等按键控制界面上显示的统计信息,包含呼叫次数,成功、失败次数及各种时长信息等
要注意的一点是SIPp默认使用的被叫号码为service,因此需要在被测FreeSWITCH上进行Dialplan配置,或者也可以使用-s参数指定一个其他的被叫号码
在SIPp施压的情况下,结合服务器的硬件性能数据,可以不断的调整CPS和持续时间,来最终获取在特定硬件配置的情况下,服务器稳定运行时FreeSWITCH能够获得的最大CPS和Channel并发值。 关于音视频的编解码测试,只需要在FreeSWITCH或者呼叫字符串中指定编解码方式,然后采用上述的压测方式即可,压力测试、稳定性测试的方式也于此类似,只是关注的验证点不同而已,这里就不展开讲了