引流压测在电商的实践与应用

发表于:2018-1-15 11:13

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:唯品会质量工程    来源:唯品会质量工程

  背景
  随着电商业务不断发展,由于线上后端服务版本迭代太快,导致线上性能遇到了从愈来愈多的挑战。事实上,不仅仅是电商,拥有大流量的服务提供商亦是如此,越来越需要提升垂直方向的性能体验。于是,性能调优往往会伴随在开发当中,作为优化项目展开。需要性能调优,势必要进行性能测试,性能测试有线上和线下两种方式,各有优缺点,并不像想象中容易展开。性能测试有线上和线下两种方式,各有优缺点:
  线上压测真实,但不能放大流量,过载后对业务有损
  线下灵活,可以做各种测试及debug,但真实性不足,准备性能测试的脚本,数据,依赖mock需要较长时间,整域压测通常需要2-3天,效率较低。
  以上列举的几点是让很多企业苦恼的主要困难,为了解决行业技术问题,我们花费了很多精力、人力、资源,我们测试团队研发出了复用性强、易于移植、高可用、高可靠的压测服务,我们称之为【引流压测】。引流压测旨在结合线上线下的优点,规避缺点,让性能压测既有真实性,灵活,同时最小化准备成本,提升效率。
  引流压测简介
  引流压测系统,每天定时通过janitors执行tcpdump采集流量,并rsync到隔离区落盘,在隔离区对流量进行解析,扇入作为压测请求数据源,扇出(底层依赖)作为mock数据源,通过ngrider读取压测源数据并发起压测,获得系统性能输出。
  方案构思
  在开发的前期,我们做了很多调研,因为我们必须知道我们要解决了痛点,才能跟住痛点去针对解决,只要梳理好,逐一击破,问题即可迎刃而解。首先我们针对现在的问题,尝试去提出自己的解决思路:
  >>生产禁止写操作,那有什么办法可以恢复写操作,或者支持写操作呢?
  搬至线下操作,线下同时支持读写请求,能够最大还原全站模型
  >>线下做的话,怎么解决环境依赖问题,或者没有太多物理服务器资源用于部署依赖服务?
  自开发MockServer,拦截所有下家请求,均走mock服务
  >>Mock服务不能还原线上的真实响应时延还有响应数据呀?
  在线上服务抓包,做好协议解析,即可获取目标服务器的扇出请求/响应文本/响应时间
  >>如果需要自动压测的话,那这些被压测的服务请求数据从哪儿来?
  如果使用线上抓包,那扇入和扇出可轻易区分出来,对于我们而言,扇入请求就是我们想要的
  >>线上抓包会涉及用户敏感信息,流入测试环境需要做脱敏,但是做脱敏又会破坏业务数据?
  申请可以隔离生产环境/测试环境的服务器环境,即可避免生产数据泄露
  >>既然可以线上抓包,复制流量了,那如何让整个压测过程自动化起来,让业务测试人员也方便操作?
  选用合适易上手的压测工具,界面操作,支持集成/定制/脚本开发,实现应用部署/压测/监控自动化
  基于线上问题,我们通过头脑风暴,得到了初步的解决思路构成:
  ●线上抓包(Tcpdump)产生二进制网络包,在应用层做扇入&扇出的协议解析
  ●开发Mock服务,模拟协议、接口响应、时延响应
  ●压测环境与生产|测试网络环境隔离
  ●选用可定制的压测工具
  ●经过和开发、运维、以及内部多番讨论后,决定了技术选型。
  技术选型
  采用JANITOR+TCPDUMP+PYTHON,实现流量采集、协议解析
  利用Janitor的Tcpdump插件,在指定目标服务器按照指定的配置参数进行抓包操作,将抓好的二进制网络包,通过自己编写python脚本做协议解析,输出明文数据。
  【名词解释】
  Janitor:是一款运维自研发的工具平台,通过插件化的形式,能够编写插件直接在目标服务器操作系统上执行程序
  使用FLUME做实时数据处理
  在数据解析的过程中,使用Flume可以实时处理增量的解析协议数据,通过此类异步的数据清洗分类方式能提高数据处理的效率,减少时间成本。
  【名词解释】
  Flume:Apache开源的实时数据流处理框架
  基于NETTY网络框架,开发基于HTTP/OSP协议的Mock服务应用
  利用Netty的异步高效网络处理机制,在此上开发出能够解析Http,Osp协议的mock服务,能利用生产抓包解析的数据做请求/响应匹配,从而达到高度匹配的效果。
  【名词解释】
  Osp协议:是公司内部自研发的RPC协议,基于Thrfit协议二次开发
  设置生产隔离区,避免数据脱敏
  经过和运维商量决定,申请一个位于生产隔离区的服务器群,此后的数据解析、应用、压测都将在此区域中进行。此区域中对生产环境|测试环境做了网络隔离,端口开放需额外申请,走防火墙流程。目前只申请了生产区域对生产隔离区的Rsync端口权限,用于传输抓包产生的二进制网络协议数据包。
  选择开源的NGRINDER,作为压测工具
  Ngrinder支持从机主控的分布式压测,可视化的在线网页端操作,学习门槛低,最重要的一点是支持Groovy/Python脚本定制压测主流程逻辑。
  【名词解释】
  Ngrinder:是由韩国技术公司开发的一款开源压测工具
  技术选型落定后,我们根据自己的需求梳理了一系列的业务流程,接下来我们开始最为精华的成果展示了。
  整体架构
  【引流压测】系统的逻辑架构图如上,主要包含五大模块:
  ●数据抓取层,监听抓取生产服务器的网络流量,包含http,thrift,osp,redis,mc等有网络通信的网络协议报文。配置好抓包参数,通过Janitor启动日常定时任务在目标服务器上使用tcpdump抓包,抓包后将生成的二进制网络文件传输至解析服务器。
  ●数据解析层,将二进制网络文件做传输层(TCP)与应用层协议解析,并将解析出的文本加工按指定的自定义格式做转换,再做进一步清洗分类,用以区分协议、扇入扇出。目前支持Http/Osp/Redis/Mc协议的解析。
  ●数据存储层。扇入扇出写入数据库,分别存储在对应的扇入表、扇出表。
  ●应用依赖层。包含应用依赖的Redis/Mc等公共服务的中间件,以及仿真下家依赖的Mock服务。Mock服务是基于Netty研发,用于仿真扇出的响应。主要利用数据库里的扇出请求报文与真实请求报文做匹配,并返回响应报文。性能评分:HTTP协议支持3w+QPS,OSP协议支持6w+QPS,作为下家依赖服务,性能基本能满足要求。
  ●压测层。使用开源的Ngrinder作为压测工具,持续集成自有服务,利用抓取的生产流量做性能回放。通过选择扇入流量请求,预刷Redis/Mc等中间件数据,对目标服务器发起请求压力,并实时监控目标服务器系统性能、计算业务性能指标,包含QPS、平均响应时间、CPU占用率、内存消耗、网卡IO等。
  通透地说,它的工作流程如下:
  1.选择生产目标服务器,进行抓包
  2.网络包解析成明文协议
  3.明文协议加工清洗处理,得到符合格式要求的扇入/扇出报文
  4.扇入/扇出报文入库
  5.获取扇入报文,按日生成压测数据文件
  6.压测工具(ngrinder)读取压测数据文件,远程启动被压测服务,MockServer,并将被压测服务下家依赖指向MockServer,与此同时向Redis/Mc刷入缓存数据预热
  7.ngrinder收集目标服务器系统性能数据,并统计业务性能指标
  8.输出性能报告
  整个流程实施过程中,可以做到数据准备自动化、服务部署自动化、压测自动化、性能数据收集自动化、报告生成自动化,而使用人员要做的就是,选择需要进行压测的域,触发开始压测的点击操作,压测工作即可自动开展,结束后就可以收到一份完整的性能展示报告。
  为了更形象地表达出自动化的引流压测流程,我们把实际的物理部署流程梳理出来,方便大家理解。
  应用
  应用实况:
  性能测试效率大大提升
  相比以前手工准备压测数据,手动部署服务,手动调整压测工作、手动监控,现在能做到数据准备自动化、服务部署自动化、压测监控自动化,只需要一键点击,即可开启线上引流自动压测
  聚合服务层、创新服务、H5活动等20+应用域接入了引流压测
  1111大促、店庆大促中,mapi、h5、创新服务等多个域使用了引流压测完成性能压测的工作,更多的业务测试人员都能轻易入手性能压测,实现了性能工作的去中心化
  健壮性、整站/接口、系统负载、CI等支持
  鉴于流量的丰富性、系统的多服务整合,引流压测能轻易帮助完成健壮性、整站/接口、负载、容量评估等性能测试工作,也提供接口方便做持续集成,完成日常迭代的性能冒烟/性能回归
  性能效果比对:
  性能压测指标与线上的偏差<20%,具有较高的置信度,有较好的推广价值
  总结
  在实施的过程中,我们也发现一些痛点:
  ●时序性问题。如商品的库存接口,会随着加购物车的操作,同个请求不同时间返回的库存信息都是不一样的,这对于测试具有时序特点的场景来说,是一大痛点
  ●上下文传递问题。调用链的上下文一致性无法保证,因目前是通过模糊匹配方式参与调用链环节,无法将源头的上下文传递至每个节点,故存在一定程度的失真
  ●本地缓存问题。java服务会用到JVM缓存,php服务会用到apcu缓存,这类缓存无法通过网络监听获得,故没法在离线环境还原线上本地缓存
  ●DB同步问题。应用更新迭代的过程中,DB的变更也会进行。尝试过按日同步DB备份,后因安全问题,被要求停止。对数据库依赖重的应用来说,更新不及时的DB,业务功能正确性无法保证
  下一步计划:
  ●接入Mercury。通过获得生产调用链信息,在回放过程中还原调用链,能解决时序性、上下文的问题
  ●基于Mysqlbin.log实现DB增量更新。解决DB同步问题
  ●加入性能对比。增加基准性能对比,历史性能趋势,可以更加快速判断性能优劣
  ●抓包集中管理。抓包配置页面,定时机制,发布窗口限制,抓包监控,用于更有效管理抓包操作。
  ●应用版本安装部署。接入cider安装包管理系统,更新指定版本,或者手动上传自定义安装包。
  ●可视化性能监控定位。将应用的每个服务组件的CPU,内存,网络,IO,以及组件自身的监控指标通过界面化形式展示出来,并实时反映异常指标,达到快速定位性能异常的效果。
  结束语
  技术提高生产力,引流压测很好的结合了线上线下的优点,最小化准备成本,性能结果具有较高的置信度,通过技术赋能测试人员,显著的提升性能测试能力,为系统的性能及质量保驾护航。感谢大家抽空阅读我们的技术分享,希望通过此分享能抛砖引玉,能引发大家对如何优化性能测试工作流程上的思考和实践,当前除了一些领先的科技企业外,有绝大部分是处于在摸索的阶段,也希望本文能够给在座阅读的有需要的各位,给予灵感上的启发以及工作上的支持,欢迎大家一起探讨,今后一起提升做到更好,再次谢谢大家。

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号