今天对图谱系统做压力测试,没有用ab或loadrunner测试工具,自己写的python,因为会取一些不同的公司id。方法是先将所有待测试公司的id取出来,划分成N等份,然后起N个进程(因为python的多线程有GIL的限制),每个进程分别执行每一份中的数据,打印出每个请求的日志,最后汇总后在分析数据时发现一些问题,比如测试结果数据如下:
进程1 | 1秒 | 2秒 | 2秒 | 8秒 | 3秒 |
进程2 | 1秒 | 1秒 | 1秒 | 2秒 | 3秒 |
进程3 | 2秒 | 2秒 | 2秒 | 3秒 | 1秒 |
上面的表格表示三个进程每个进程各执行了五次操作及耗时,我是这样计算的:
第一种计算方法:总请求数除以总耗时,由于三个进程是并行执行的,所以我取了耗时最多的进程一的耗时作为总耗时,所以总耗时等于(1+2+2+8+3),吞吐量为15/16=0.93,即每秒可以处理0.93个请求
第二种计算方法:平均响应时间为所有的时间加起来除以15为(16+8+10)/15=2.26,即平均每进程每秒可以0.44个请求,由于是三个进程再乘以3,每秒应该可以处理1.32个请求,即吞吐量是1.32
注意上面,我算出了两个吞吐量,第一种使用总请求数除以测试程序执行的总耗时理论上应该也没有什么问题,为什么这两个数据会出现矛盾呢,到底是哪里出现了问题????
问题的根源是这种测试方法是错误的,因为虽然每个进程分到了同样的请求数,但可能因为不同的公司的图谱返回的数据量(后台的计算量)大不相同,所以会出现大量的高耗时的id被分配到了同一个进程中,上面的进程二、三其实早已经结束了但进程一还在执行,这段时间其实只有一个进程在请求,而我取总耗时肯定是取整个测试的所有进程都结束的时间,所以计算出来的吞吐量显然就小了。
正确的做法是:将所有的id放到一个队列中,多个测试进程从队列中拿测试的id,这样可能最大限度的保证多个测试进程结束的时间一致,不会出现只有一个测试进程在长时间的单独工作。
压力测试中三个重要的指标:
吞吐量:由下面两个指标决定;
响应时间:一次调用的时间,主要看该调用的计算复杂度,返回的数据量大小;
并发用户数:可以同时接受多少用户的并必访问,主要看后台服务器开了多少个线程来处理,及缓存队列的大小;
计算公式:吞吐量=并发用户数*响应时间