偶然看到了阿里中间件Dubbo(http://t.cn/R53tm9q)的性能测试报告。我觉得这个性能测试报告让人觉得做这个性能测试的人根本不懂性能测试。我觉得这份检测报告会把大众引到沟里,所以想写这篇文章,做一点科普。首先,这份检测报告存在的主要问题如下:全部采用平均值。老实说,平均值非常疯狂。响应时间与吞吐量TPS/QPS无关。而且只测试了低速率的情况,这是完全错误的。响应时间和吞吐量与成功率无关。平均为什么不靠谱关于平均为什么不靠谱,相信大家在看新闻的时候,经常能看到平均工资、平均房价、平均支出等字眼,就知道为什么平均不靠谱了向上。(这些都是数学游戏,对于理工科的学生来说,应该天生就有免疫力。)软件的性能测试也是一样的,平均数不靠谱。这里可以参考这篇详细的文章《Why Averages Suck and Percentiles are Great》(http://t.cn/R53cChA),这里简单说一下。我们知道,在进行性能测试时,测试得到的结果数据并不总是相同的,而是有高有低。如果计算平均值,就会发生这种情况。如果,10次测试后,9次是1ms,而1次是1s,那么平均数据就是100ms。显然,这根本不能反映性能测试的情况。可能1s请求是异常值,是噪音。所以我们会看到有的评委打分时会把最高分和最低分去掉,然后再计算平均值。此外,中位数(Mean)可能比平均值稍微可靠一些。所谓中位数,就是将一组数据按大小顺序排列,位于中间位置的数称为这组数据的中位数。中位数,这意味着至少50%的数据低于或高于该中位数。当然,最正确的统计方法是使用百分比分布统计。即TP——英文TopPercentile,TP50表示50%的请求小于某个值,TP90表示90%的请求小于某个时间。比如:我们有一组数据:[10ms,1s,200ms,100ms],我们从小到大排序:[10ms,100ms,200ms,1s],所以我们知道TP50是requestceil的50%(4*0.5)=2时间小于100ms,TP90为90%请求ceil(4*0.9)=4时间小于1s。所以:TP50为100ms,TP90为1s。我之前在路透社做的金融系统响应时间性能测试的要求是:99.9%的请求必须小于1ms,所有请求的平均时间必须小于1ms。有两个限制。为什么要将响应时间(延迟)与吞吐量(Thoughput)挂钩?如果只看吞吐量,不看响应时间是没有意义的。我的系统可以top100,000个请求,但是响应时间达到了5秒。这样的系统已经不可用了,这样的吞吐量是没有意义的。我们知道,当并发量(吞吐量)增加时,系统会越来越不稳定,响应时间波动会越来越大,响应时间会越来越慢,吞吐率也会越来越高。越来越难了(如下图),包括CPU占用率。所以,当系统变得不稳定时,吞吐量就没有意义了。吞吐量只有在系统稳定时才有意义。因此,吞吐量的值必须有对卡的响应时间。例如:当TP99小于100ms时,系统最大可承载的并发数为1000qps。这意味着我们必须不断地测试不同的并发数,以找到软件最稳定时的最大吞吐量。我们应该不难理解为什么要把响应时间吞吐量和成功率挂钩。如果请求不成功,我们仍然会做毛性能测试。比如我说我的系统并发可以达到10万,但是失败率是40%,那么10万并发完全是个笑话。性能测试的容错率应该非常低。对于一些关键的系统,请求成功的次数必须是100%,一点都不能含糊。如何严谨的做性能测试一般来说,性能测试应该统一考虑几个因素:ThoughputThroughput,Latency响应时间,资源利用率(CPU/MEM/IO/Bandwidth...),成功率,系统稳定性。下面的性能测试方法基本来源于我的老东家汤森路透,一家做实时金融数据系统的公司。首先,你要定义一个系统的响应时间延迟,建议是TP99,还有成功率。比如路透社的定义:99.9%的响应时间必须在1ms以内,平均响应时间在1ms以内,100%的请求成功。第二,在此响应时间约束内找到最高吞吐量。测试数据需要有大中小各种大小的数据,可以混用。最好使用来自生产线的测试数据。第三,在这个吞吐量下做浸泡测试,例如:用第二步测试得到的吞吐量连续7天连续测试压力系统。然后收集CPU、内存、硬盘/网络IO等指标,检查系统是否稳定。比如CPU稳定,内存占用也稳定。那么,这个值就是系统的性能四、求出系统的极限值。例如:在成功率为100%的情况下(不管响应时间长短),系统可以维持10分钟的吞吐量。五、做爆破试验。用第二步得到的吞吐量执行5分钟,再用第四步得到的limit值执行1分钟,再回到第二步的吞吐量执行5分钟,再执行中的权限值第四步1分钟。如此来回一段时间,比如2天。收集系统数据:CPU、内存、硬盘/网络IO等,观察它们的曲线,以及对应的响应时间,确保系统稳定。(注:在Reuters中,Reuters将第二步得到的吞吐量乘以66.7%作为系统的软报警线,80%作为系统的硬报警线,限制值仅用于处理突发情况peaks)锁起来很烦吗?是的,只是因为,这就是工程,工程是科学,科学是严谨的。欢迎大家分享自己的性能测试经验和方法。
