您可以捐助,支持我们的公益事业。

金额: 1元 10元 50元

姓名:

邮件:

电话:

公司:

说明:

认证码: 验证码,看不清楚?请点击刷新验证码 必填



  要资料 文章 文库 Lib 视频 Code iProcess 课程 认证 咨询 工具 讲座吧   专家招募  
会员   
 
   
 
  
每天15篇文章
不仅获得谋生技能
更可以追随信仰
 
 
     
   
 订阅
  捐助
美团如何从0到1构建压测工具
 
来源: 51CTO 发布于2016-10-28
来自于要资料   471 次浏览     评价:      
 

美团内部的RPC服务大多构建在Thrift之上,在日常开发服务的过程中,需要针对这些服务进行压力测试(以下简称压测)来发现潜在问题。常用的方法有:

◆使用一些脚本语言如:Python、Ruby等,读取线上日志构建请求,用多线程模拟用户请求进行压测。

◆使用开源工具进行压测。 然而,无论采取哪种方法,压测都是一个十分耗时而又繁琐的过程,主要痛点有:

◆需要写很多代码解析日志,还原请求,对于比较复杂的请求,解析很容易出错。

◆需要搭建脚本或者工具的运行环境,通常这一过程比较耗时。

◆由于打压方法没有统一,导致打压的结果指标比较混乱,有的结果甚至以终端输出的方式展示,非常不直观。

◆对一个应用的打压测试,由于环境、代码的问题,导致组内同学很难共享。

针对上述问题,提供一个简单好用的压测工具是十分有必要的。 是否有必要重复造轮子 在构建压测工具之前,对于一些现有的开源工具进行了调研。现在主流的压测工具主要有以下几个:

1.JMeter

JMeter是一个比较老牌的压测工具,主要针对HTTP服务进行打压,该工具在以下方面并不满足美团内部的压测需求:

◆默认不支持Thrift的打压测试。

◆需要本地安装,并且配置复杂。

◆对于用户操作并不友好

2.twitter/iago

iago 是一个由Twitter开源的压测工具,支持对HTTP、Thrift等服务进行压测,其主要问题如下:

◆对每个压测应用都需要创建一个项目。

◆压测结果并不直观。

◆流量重放依赖本地文件。

◆项目依赖于一个较老版本的Scala,搭建不便。

◆相关文档比较少。

除此之外,当时还考察了Gatling、Grinder、Locust等一些常见的压测工具,都因为适用场景和美团的需求有些出入而排除了。 综上,针对当前压测工具的一些现状,构建一个简单易用的压测工具还是很有必要的。

目标

针对之前提到的痛点,新的压测工具主要提供以下功能:

◆线上流量拷贝。

◆简单易用的操作界面(接入压测的时间应该控制在1小时以内)。

◆清晰的图表能反映压测应用的各项指标。

◆满足包括Thrift、HTTP等服务的压测需求。

如何构建

抽象

目标已经明确,怎么实现呢?首先是抽象压测的过程。 一个典型的压测过程如图所示,首先在init方法里面,进行一些初始化的工作,比如连接数据库,创建客户端等。接下来,在run方法里面发出压测请求,为了保证能够对服务产生足够的压力,这里通常采用多线程并发访问,同时记录每次请求的发起时间和结束时间,这两个时间的简单相减就能够得到每次请求的响应时间,利用该结果就可以计算出TP90、平均响应时间、最大响应时间等指标,等压测结束后,通过destroy方法进行资源回收等工作。

以上过程可以用接口表示,无论是压测Thrift服务还是HTTP服务,本质上都是这三个方法实现的不同。考虑到压测工具的灵活性和通用性,压测工具可以将这个接口交给打压测试的同学实现,而压测工具则重点实现多线程打压,打压结果的聚合等比较耗时的工作。

interface Runner { 
def init(Test app) // 初始化压测
def run(Test app, String log) // 每次打压请求,传入log方便构建请求
def destroy(Test app) // 压测完毕后,回收资源
}

拷贝流量

Thrift服务打压的难点之一就是如何简单地拷贝线上真实流量用来构建打压请求。一些大型的Thrift服务数据结构非常复杂,写打压脚本的时候,需要很多代码来解析日志,而且容易出错。 因此,提供一个简单好用的拷贝流量方法是十分有必要的。

在这里压测工具提供了一个叫VCR(录像机)的工具来拷贝流量。VCR能够将线上的请求序列化后写到Redis里面。

考虑到用户需要查看具体请求和易用性等需求,最终选取了JSON格式作为序列化和反序列化的协议。同时,需要部署在生产环境,为了降低对线上服务的影响,这里采取了单线程异步写的方式来拷贝流量。

聚合数据 应用打压完成后,需要一些指标来评估压测结果,常见的指标有:

◆最大响应时间

◆平均响应时间

◆QPS

◆TP90

◆TP50

压测工具采用了 InfluxDB 来完成数据的聚合工作。

以TP90为例子,仅需要一行查询就能实现需求。

SELECT PERCENTILE(response_time, 90) FROM test_series GROUP BY time(10s) 

架构

整体而言,整个打压过程如下:

实践

拷贝流量

美团内部的服务大多使用Java来构建,VCR以Maven Package的方式提供给用户。

对用户来说只需要2行代码就可以拷贝流量。

为了不影响线上服务,通常选取单台机器进行流量拷贝工作。

public class TestAppRPC implements TestApp.Iface { 

private Vcr _vcr = new Vcr("testapp"); // 指定拷贝流量的key

@Override
public TestResponse echo(TestRequest req) throws TException {
_vcr.copy(req); // 拷贝操作
long start = System.currentTimeMillis();
TestResponse response = new TestResponse();
return response;
}
}

一旦流量拷贝完成后,通过Web界面,用户能够查看日志的收集情况和单条日志的详情。

压测逻辑实现

压测工具采用Groovy来进行编写。对每个应用来说,只需要实现runner接口就可以实现对应用的打压。

interface Runner { 
def init(Test app)
def run(Test app, String log)
def destroy(Test app)
}

以Thrift服务为例。

class TestServiceRunner implements Runner { 

RPCService.Client _client
TTransport _transport;

@Override
def init(Test app) {
def conf = app.config // 读取应用配置
_transport = new TFramedTransport(new TSocket(conf.get("thrift_service_host") as String, conf.get("thrift_service_port") as int))
TProtocol protocol = new TBinaryProtocol(_transport)
_client = new RPCService.Client(protocol)
_transport.open()
}

@Override
def run(Test app, String log) {
TestRequest req = Vcr.deSerialize(log, TestRequest.class) // 将拷贝流量反序列化
_client.echo(req) // 发送请求
}

@Override
def destroy(Test app) {
_transport.close() // 关闭服务
}
}

创建应用

实现以上接口后,就可以对应用进行打压了。

用户可以通过Web界面创建应用,除了必填配置以外,用户可以按照应用灵活配置。

性能指标

用户可以通过直观的图表来查看应用的各种性能指标。

结束语

压测工具上线以来,已经接入了20多个应用,完成数百次打压实验,现在应用的接入时间仅需要15~30分钟。保证了美团服务的稳定和节省了开发同学的时间,使大家告别了以往繁琐冗长的打压测试。

 

   
 订阅
  捐助
相关文章

性能测试十问:测试经理篇
web前端性能优化进阶路
性能测试综述
VS2010中自动化测试—Web性能测试
相关文档

性能测试
性能测试执行之测试脚本录制
性能测试进阶1-流程篇
性能测试进阶2-方案篇
相关课程

性能测试方法与技术
使用LoadRunner进行性能测试
Android应用的性能测试
基于Android的单元、性能测试
 

LoadRunner性能测试基础
软件测试结果分析和质量报告
面向对象软件测试技术研究
设计测试用例的四条原则
功能测试中故障模型的建立
性能测试综述
更多...   

性能测试方法与技术
测试过程与团队管理
LoadRunner进行性能测试
WEB应用的软件测试
手机软件测试
白盒测试方法与技术

相关咨询服务
建立软件测试规范
性能评测与调优

某博彩行业 数据库自动化测试
IT服务商 Web安全测试
IT服务商 自动化测试框架
海航股份 单元测试、重构
测试需求分析与测试用例分析
互联网web测试方法与实践
基于Selenium的Web自动化测试
更多...   
 
 
 
 
 
每天2个文档/视频
扫描微信二维码订阅
订阅技术月刊
获得每月300个技术资源
 
 

关于我们 | 联系我们 | 京ICP备10020922号 京公海网安备110108001071号