做压力测试有很多让人头疼的问题,例如:数据构造、机器准备、发压机性能差、带宽不够等;目前越来越多的服务引入的子服务、微服务的概念,这给性能测试增加了另一个问题——子服务mock,今天来分享一个解决方案;
1、子服务不能是限制被测服务最大并发数的影响因素;2、子服务尽可能的返回真实数据;
第一种 直接使用线上的后端服务进行压测
优点
:近线上状态;代价极小;缺点
:上子服务的稳定性、数据统计、引入脏数据等;第二种 部署完整的后端测试环境
优点
:与线上隔离;测试结果基本与线上环境一致,测试结果相对准确;缺点
:部署成本极高;要保证子服务性能的话会造成资源浪费;第三种 部署部分子服务
优点
:与线上隔离;部署成本相对较小;缺点
:测试结果有出入,后端性能可能是瓶颈;第四种 使用测试平台mock后端接口数据
优点
:与线上隔离;缺点
:mock平台一般性能较弱,测试结果有出入;mock平台的逻辑规则会有一定的学习成本;以上是一般的解决方案,下面说一种个人觉得是性价比最高的解决方案;
第五种 使用nginx cache mock子服务返回内容;
优点
:与线上隔离;子服务返回内容与线上一致;可保证后端性能不是瓶颈;缺点
:必须使用固定的一组请求(请求数量在几万的量级应该没问题);第一步 配置proxy规则
proxy_cache_path /search/nginx/cache/ levels=1:2 keys_zone=ldd-test-cache:154m max_size=3g inactive=24h ;
/search/nginx/cache/
存放缓存文件的位置levels
将缓存文件存到2级目录keys_zone
这条缓存配置名及可以储存多少个key(1m可以存储8000个key)max_size
最大缓存空间,达到最大值时会删除最少使用的keyinactive
未被访问多久就清除key第二步 添加具体缓存location
server
{
listen *:80;
root html;
server_name mock.ldd.com;
access_log /search/odin/nginx/logs/${server_name}_access_log main;
location / {
proxy_pass http://test.ldd.com;
proxy_cache ldd-test-cache;
proxy_cache_key $uri;
proxy_cache_valid any 1m;
}
}
proxy_pass
将通过请求test.ldd.com的相同地址获得key valueproxy_cache
使用的cache规则proxy_cache_key
使用请求的哪部分作为keyproxy_cache_valid
此处是对所有返回码缓存1分钟非cache(后端是django写的mock服务)
Running 10s test @ http://XXX.XXX.XXX/test
10 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 204.41ms 258.53ms 1.79s 90.69%
Req/Sec 33.00 20.35 111.00 59.69%
2846 requests in 10.01s, 0.92MB read
Socket errors: connect 0, read 0, write 0, timeout 18
Requests/sec: 284.33
cache
Running 10s test @ http://XXX.XXX.XXX/test
10 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 24.92ms 141.65ms 1.89s 97.72%
Req/Sec 13.11k 6.64k 46.53k 70.50%
1159141 requests in 10.10s, 459.63MB read
Socket errors: connect 0, read 0, write 0, timeout 48
Requests/sec: 114765.82