01 背景
目前在中通性能测试主要分为线上和线下压测两种方案,在反复实践过程中我们渐渐发现这两种方案都有着各自不足之处,且为压测工作带来了很多不便。以下就线上和线下压测的不足分析,谈谈中通是如何一步步改进压测方案并解决问题。
在线下压测试过程中,为了减少与真实环境物理资源上的差异,公司采取的是针对CPU与内存进行等比缩放的策略,如果是计算密集型应用,线上环境总的CPU核数为80,线下压测环境总CPU核数为8核,则为10:1的线上线下等比缩放策略,如果是IO(目前只看内存)密集型应用,线上内存总量如果为80G,线下压测环境内存总量为8G,也同样是10:1的线上线下等比缩放策略。
很明显这种等比缩放策略在高TPS目标的压测场景下会失真,TPS目标越高,则失真越严重,因为我们并不能对网络、中间件、数据库等一系列的因子也同样做出等比缩放。
在线上压测时,多以读接口为主,只有相当少量的写接口会做线上压测,这少量的写接口通常也需要被压应用的开发人员进行代码改造,以避免大量的压测数据对业务数据造成污染。
所以这种线上压测方式无法大范围应用,同时这种对代码硬改造的方式,也增加了压测成本与风险,导致大家通常不愿意面对线上压测,更不用提联合上下游一起进行线上全链路压测了,而这种不敢在线上大量压测的思维,也导致更多压测被放在线下以等比缩放的方式进行,其后果则是压测结果的失真,在2012年,某厂正是因为测试环境等比缩放压测,导致网络流量数据失真,引发了线上故障,才促使其下决心走上了线上全链路压测的道路。
因为有上述问题,公司引入了线上全链路压测产品,其特点是使用压测JavaAgent探针以字节码方式植入应用,这样业务应用则无须硬编码,就可以自动识别和兼容压测流量,并进行分流,将缓存和存储数据存储到影子区域,实现物理隔离压测数据,避免造成生产数据污染,就技术方案上看,线上全链路压测产品最核心的功能其实就是两点:流量染色与保障数据安全,示意图如下:
压测流量链路示意图
02 全链路压测部署&核心配置
-
将pradar-agent.zip包上传到需要接入应用所对应的服务器/home/admin目录下,并直接解压.
-
修改对应应用的启动脚本( 通常在发布平台中修改),将修改后的后面这个命令添加到java -jar xxx.jar 的-jar之前( -javaagent:/home/admin/pradar-agent/agent/pradar-core-ext-bootstrap-1.0.0.jar -Dpradar.project.name=该应用应用名 )
-
重新启动应用
在pradar-web操作页面的应用管理页,查看是否成功上报:
agent安装完全成后,在具体实施时,如果压测入口是http接口,则在请求头中带上“User-Agent:PerfomanceTest”,如果入口是dubbo接口,则在AttachementArgs中带上“p-pradar-cluste