基于弹性伸缩集群的云负载测试技术
2020-07-09颜硕彦晋文明李昌建
颜硕彦 晋文明 李昌建
摘 要:为保障线上软件系统服务质量的可靠性,有必要对其进行有效的负载测试。随着云计算技术的发展,基于云端资源发起的负载测试可以方便大规模客户端负载的生成,且容易实施。然而,目前研究缺少相关实现参考,导致这样的云测试系统难以构建。文章提出了一套基于OpenStack的云负载测试平台实现方案,介绍了基于弹性伸缩集群的云负载测试技术,为实现基于云的负载测试系统提供了实现参考。
关键词:负载测试;云测试系统;OpenStack;弹性伸缩;测试集群
中图分类号:TP311 文献标识码:A 文章编号:2096-4706(2020)02-0098-04
Abstract:For online software systems,it is often necessary to conduct load testing to ensure the reliability of their services. With the development of cloud computing technology,launching load testing based on cloud resources can facilitate large-scale client-side load generation,and testing is easy conduct. However,existing research lack of relevant implementation reference,which results in these cloud testing systems are difficult to build. This paper proposes a set of cloud load testing platform implementation scheme based on OpenStack,introduces the cloud load testing technology based on elastic scaling cluster,and provides a reference for realizing the cloud-based load testing system.
Keywords:load testing;cloud testing system;OpenStack;elastic scaling;test cluster
0 引 言
负载测试作为软件测试的一种,是为了检测系统在负载方面的相关问题从而对系统进行评估的过程[1],是保障大型线上软件系统服务质量可靠性的有效手段[2]。随着云计算技术的发展,一些测试人员把负载测试迁移到云上[3],依托于云端资源发起负载测试可以方便大规模客户端负载的生成,同时降低负载测试的实施难度。文献[4]设计了一种准入控制和任务调度算法,实现云性能测试服务平台资源的共享管理和动态分配。文献[5]为保证分布式系统测试的可靠性,提出了云测试环境D-Cloud,实现自动化系统配置和测试流程。文献[6]提出了一个用于Web服务的负载测试平台,使得负载测试过程尽可能接近实际运行场景。文献[7]提出的云测试平台能够实现按需分配硬件资源,无需重新配置测试环境。
现有研究主要关注云测试系统的任务调度、测试自动化、负载测试真实性等方面,对系统实现层面的研究较少,导致云测试系统的构建缺乏实现参考。鉴于此,基于校内的“基于云计算服务设施测试系统”项目的研究成果,本文提出了一套基于OpenStack的云负载测试平台实现方案,介绍了基于弹性伸缩集群的云负载测试技术,依托于测试云中弹性伸缩的测试集群来发起负载测试,保证用于发起客户端负载的云测试主机数量总是弹性地根据实际测试需求动态分配,避免了测试资源的浪费。本文为构建经济高效的云负载测试系统提供了一套实现参考。
1 云负载测试平台体系结构
本文提出了一个面向云环境的云负载测试平台体系结构,平台按照CloudTest、TestAgent、WebAPP、VM Monitor等几大物理模块进行组织,其总体物理结构如图1所示。
CloudTest为测试控制中心,控制整个测试的执行流程,并提供各类测试活动的管理功能。TestAgent为测试执行程序,是发起客户端负载、具体实施负载测试的主要模块。WebAPP为待测目标应用,用于模拟负载测试的服务器。VM Monitor为監控程序,用于监控云虚拟主机的资源使用。Dashboard为前端程序,它是一个基于ExtJS框架编写的Web页面,提供用户与平台交互的视图。
本文将测试云部署在以OpenStack[8]为代表的底层云计算IaaS(基础服务设施)上,通过在云虚拟主机上运行TestAgent测试执行程序,在IaaS云上构建一个PaaS(平台即服务)层,对外提供统一的测试服务TaaS(测试即服务)层。相关结构的示意图如图2所示,底层通过OpenStack等软件栈搭建一个包含物理主机和虚拟主机的IaaS云环境。测试系统在虚拟主机上安装TestAgent测试执行程序来发起测试,并通过一个TestManager调度各个TestAgent和向IaaS云发送控制命令,构建一个专用于测试的服务层。TestAgent可完成虚拟用户模拟、客户端性能数据采集等工作。上层云测试平台只需与TestAgent和IaaS控制中心沟通,而无需直接面对物理设备。对最终用户而言,只需访问测试云的管理中心TestManager即可完成所有测试工作,而无需处理复杂的底层操作细节。
OpenStack是一个开源的云计算管理平台项目,提供了一套IaaS解决方案,通过计算组件(Nova)、对象存储组件(Swift)、身份服务(Keystone)组件和镜像服务组件(Glance)等主要组件来协同完成计算资源分配、调度和回收等工作。OpenStack使用Dashboard组件为用户提供了如图3所示的Web界面,管理员可以赋予用户权限去操作这个Web界面来上传镜像、配置实例和创建虚拟实例等。在物理主机上搭建OpenStack需要部署不同组件,不同组件的功能如表1所示。
2 基于云的弹性伸缩测试集群
云负载测试平台通过在测试云中构建云测试集群来发起客户端负载,对待测目标应用进行网络调用。云测试集群由一定数目的云测试主机构成,其中云测试主机是指部署在OpenStack上且安装有测试执行程序TestAgent的虚拟主机实例。OpenStack支持iso、qcow2、ova等多种类型的镜像,使用测试主机镜像(qcow2镜像)来创建云测试主机。如图4所示的流程提供了制作测试主机的OpenStack镜像的主要流程,该镜像主要由测试执行程序Linux操作系统、TestAgent测试执行程序以及测试执行环境三部分构成,其中Linux操作系统提供镜像程序运行的平台,测试执行环境用于提供TestAgent运行的环境支撑。云测试主机的创建除了需要镜像的支撑,还需要一系列基础资源的支持,如网络、路由、Flavor、安全组等。本文定义云测试主机为一个五元组
为保证测试云灵活地生成各类不同规模的客户端负载,同时避免资源浪费,本文提出了一种测试集群的弹性伸缩机制,来更好地利用基础测试资源。该弹性伸缩机制需要事先估计负载测试任务在目标负载规模下所需要的云测试主机数量,并对云测试主机进行自适应的申请、释放控制等,以适应实际的测试需要。
首先根据负载测试所需云测试主机的数量在测试云中分配虚拟测试主机,构建用于发起负载的客户端集群。该步骤中,将按需进行虚拟测试主机分配。假设需要K个虚拟主机来作为客户端发起负载测试,而当前测试云中仅有少于K的活跃云测试主机,则测试过程将要求测试云弹性地分配更多云测试主机,确保可用的云测试主机数量大于K。而如果当前云测试主机数量大于K,且有L个云测试主机已经相当长时间内未被使用,则测试云将自动释放这些虚拟测试主机以减少当前的资源占用。如此,用于发起客户端负载的云测试主机的数量总是弹性地根据实际测试需要来控制,而不用像传统的性能测试需要事先构建一个规模固定的测试集群。
在实施负载测试的过程中,测试云始终对各个云测试主机的实际资源使用情况进行监控。一旦发现某云测试主机上的CPU、内存等占用达到上限阈值,则自动调用测试云的API来分配更多的云测试主机。如此,即使测试起初所判定需要的云测试主机数量不够准确,也能够自适应地对云测试主机数量进行调整,始终保证当前拥有的云测试主机能够满足指定规模负载的发起需要。客户端测试主机的分配和弹性伸缩过程如图5所示。云测试主机的弹性分配和释放最终通过底层云环境的控制接口实现。在OpenStack云中,Nova模块提供虚拟主机的申请和释放REST接口,通过发送REST服务调用命令为Nova后台服务,即可实现测试云的主机控制功能。对于虚拟测试主机而言,其弹性伸缩是通过测试云的相关控制逻辑来实现的,而不是通过云自身直接提供的弹性伸缩机制。
3 云负载测试的执行
云负载测试平台按照测试脚本、测试用例的概念体系来管理负载测试活动。在每个测试脚本中,使用testBegin()和testEnd()原语调用标识脚本的开始和结束,该原语对的执行时间范围也是脚本的执行时间,可用该时间来了解被测应用的性能。FunkLoad测试脚本基于Python的WebUnit框架來描述用户对Web应用的访问,该脚本主要记录对Web应用进行访问过程中的HTTP报文,通过重放这些HTTP报文,实现回归测试。以图6所示的FunkLoad脚本为例,一个脚本可用actionBegin()和actionEnd()原语切分为若干不同的子活动,即一个较大的脚本可能包含一系列相对独立的活动。例如,对Web应用的访问可能包括login、view、submit等多个不同步骤。如此,可以为每个步骤搜集执行时间、数据通信量的统计信息,更具细粒度地考查被测应用的执行表现。
测试用例表达对待测目标应用的测试配置,此处的测试用例主要是负载测试,包含负载测试的相关环境和执行配置选项,包以及负载测试过程中的负载变化策略等。每个测试用例包含一个或多个测试脚本,这些测试脚本描述了对待测目标应用的不同访问方式,多个测试脚本构成了对云应用的测试剖面,反映一个负载测试主要关注待测目标应用中哪些功能的性能表现。用户选取测试脚本、创建测试用例来完成负载测试活动的配置。
用户配置好的负载测试活动被提交至测试控制中心,控制中心根据负载测试活动中的负载规模在测试云上请求分配一定数目的云测试主机,并将负载测试活动分配到对应的云测试主机上执行。云测试主机在接收到负载测试活动后,解析配置的负载变化策略的信息,按照负载变化策略在指定的时间节点上生成预设规模的客户端负载,每个负载依赖于相应的脚本执行引擎,发起对待测目标应用的网络调用,待测目标应用执行客户端负载中的动作并给出响应,由云测试主机收集测试执行数据并汇总给测试控制中心,形成对待测目标应用性能的分析与评估。在测试执行过程中,测试控制中心会收集测试集群中每个云测试主机汇报的监控数据,分析监控数据来判断云测试主机的资源是否达到阈值上限,从而进行动态的伸缩。
4 结 论
本文提出了一套基于OpenStack的云负载测试平台实现方案,分别介绍了云负载测试平台体系结构、测试集群的构建和负载测试活动的执行,实现了一种基于弹性伸缩集群的云负载测试技术,在测试过程中保证用于发起客户端负载的云测试主机数量,弹性地根据实际测试需求动态分配,避免了测试资源的浪费,为构建经济高效的云负载测试系统提供了实现参考。
参考文献:
[1] JIANG Z,HASSAN A. A Survey on Load Testing of Large-Scale Software Systems [J]. IEEE Transactions on Software Engineering,2015,41(11):1.
[2] SCHULZH,ANGERSTEINT,HOORN A V. Towards Automating Representative Load Testing in Continuous Software Engineering [C]//ICPE18:ACM/SPEC International Conference on Performance Engineering. Association for Computing Machinery,2018:123-126.
[3] HARIKRISHNA P,AMUTHANA. A survey of testing as a service in cloud computing [C]// 2016 International Conference on Computer Communication and Informatics (ICCCI). IEEE,2016.
[4] 李萱,王伟,张文博,等.基于云的Web应用性能测试服务平台 [J].计算机系统应用,2013,22(10):33-38.
[5] HANAWA T,BANZAI T,KOIZUMI H,et al. Large-Scale Software Testing Environment Using Cloud Computing Technology for Dependable Parallel and Distributed Systems [C]// Third International Conference on Software Testing,Verification and Validation,ICST 2010,Paris,France,April 7-9,2010,Workshops Proceedings. IEEE Computer Society,2010.
[6] YAN M,SUN H,WANG X,et al. Building a TaaS platform for web service load testing [C]// 2012 IEEE International Conference on Cluster Computing. IEEE,2012:576-579.
[7] 丁小盼,周浩,贺珊,等.基于OpenStack的云测试平台及其性能分析研究 [J].软件,2015,36(1):6-10.
[8] 李知杰,赵健飞.OpenStack开源云计算平台 [J].软件导刊,2012,11(12):10-12.
作者簡介:颜硕彦(1994-),男,汉族,江苏淮安人,硕士研究生,研究方向:软件分析与测试;晋文明(1994-),男,汉族,安徽当涂人,硕士研究生,研究方向:软件分析与测试。