18720358503 在线客服 人才招聘 返回顶部
企业动态 技术分享 行业动态

分析美团內部所选用的网站工作压力检测计划方

2021-03-13分享 "> 对不起,没有下一图集了!">

美团內部的RPC服务大多数搭建在Thrift之上,在平常开发设计服务的全过程中,必须对于这些服务开展工作压力检测(下列简称压测)来发现潜伏难题。常见的方式有:

1.应用1些脚本制作語言如:Python、Ruby等,载入网上系统日志搭建恳求,用线程同步仿真模拟客户恳求开展压测
2.应用开源系统专用工具开展压测
但是,不管采用哪样方式,压测全是1个10分耗时而又繁琐的全过程,关键痛点有:

必须写许多编码分析系统日志,复原恳求,针对较为繁杂的恳求,分析很非常容易错误
必须构建脚本制作或专用工具的运作自然环境,一般这1全过程较为耗时
因为施压方式沒有统1,致使施压的結果指标值较为错乱,有的結果乃至以终端设备輸出的方法展现,十分不直观
对1个运用的施压检测,因为自然环境、编码的难题,致使组内同学很难共享资源
对于上述难题,出示1个简易功能强大的压测专用工具是10分必须的。

是不是必须反复造轮子
在搭建压测专用工具以前,针对1些现有的开源系统专用工具开展了调查。如今流行的压测专用工具关键有下列几个:

JMeter
JMeter是1个较为老牌的压测专用工具,关键对于HTTP服务开展施压,该专用工具在下列层面其实不考虑美团內部的压测要求:

1.默认设置不适用Thrift的施压检测
2.必须当地安裝,而且配备繁杂
3.针对客户实际操作其实不友善

twitter/iago
iago 是1个由Twitter开源系统的压测专用工具,适用对HTTP、Thrift等服务开展压测,其关键难题以下:

对每一个压测运用都必须建立1个新项目
压测結果其实不直观
总流量播放依靠当地文档
新项目依靠于1个较老版本号的Scala,构建麻烦
有关文本文档较为少
除此以外,那时候还调查了Gatling、Grinder、Locust 等1些普遍的压测专用工具,都由于可用情景和美团的要求一些进出而清除了。

综上,对于当今压测专用工具的1些现况,搭建1个简易易用的压测专用工具還是很必须的。

总体目标
对于以前提到的痛点,新的压测专用工具关键出示下列作用:

网上总流量复制
1.简易易用的实际操作页面(接入压测的時间应当操纵在1小时之内)
2.清楚的图表能反应压测运用的各项指标值
3.考虑包含Thrift、HTTP等服务的压测要求


怎样搭建
抽象性
总体目标早已确立,如何完成呢?最先是抽象性压测的全过程。
1个典型的压测全过程如图所示,最先在init方式里边,开展1些原始化的工作中,例如联接数据信息库,建立顾客端等。接下来,在run方式里边传出压测恳求,以便确保可以对服务造成充足的工作压力,这里一般选用线程同步高并发浏览,另外纪录每次恳求的进行時间和完毕時间,这两个時间的简易相减就可以够获得每次恳求的回应時间,运用该結果便可以测算出TP90、均值回应時间、最大回应時间等指标值,等压测完毕后,根据destroy方式开展資源收购等工作中。

以上全过程能够用插口表明,不管是压测Thrift服务還是HTTP服务,实质上全是这3个方式完成的不一样。考虑到到压测专用工具的灵便性和通用性性,压测专用工具能够将这个插口交到施压检测的同学完成,而压测专用工具则关键完成线程同步施压,施压結果的汇聚等较为耗时的工作中。

拷贝编码
编码以下:

interface Runner {
def init(Test app) // 原始化压测
def run(Test app, String log) // 每次施压恳求,传入log便捷搭建恳求
def destroy(Test app) // 压测结束后,收购資源
}


复制总流量
Thrift服务施压的难点之1便是怎样简易地复制网上真正总流量用来搭建施压恳求。1些大中型的Thrift服务数据信息构造十分繁杂,写施压脚本制作的情况下必须许多编码来分析系统日志,并且非常容易错误。 因而出示1个简易功能强大的复制总流量方式是10分必须的。

在这里压测专用工具出示了1个叫VCR(录相机)的专用工具来复制总流量。VCR可以将网上的恳求编码序列化后写到Redis里边。

考虑到到客户必须查询实际恳求和易用性等要求,最后选择了JSON文件格式做为编码序列化和反编码序列化的协议书。另外必须布署在生产制造自然环境,以便减少对网上服务的危害,这里采用了单进程多线程写的方法来复制总流量。

汇聚数据信息
运用施压进行后,必须1些指标值来评定压测結果,普遍的指标值有:

1.最大回应時间
2.均值回应時间
3.QPS
4.TP90
5.TP50
压测专用工具选用了 InfluxDB 来进行数据信息的汇聚工作中。
以TP90为事例,仅必须1行查寻就可以完成要求。

SQL Code拷贝內容到剪贴板
  1. SELECT PERCENTILE(response_time, 90) FROM test_series GROUP BY time(10s)  

构架
总体而言,全部施压全过程以下:

实践活动
复制总流量
美团內部的服务大多数应用Java来搭建,VCR以Maven Package的方法出示给客户。

对客户来讲只必须2行编码能够复制总流量。

以便不危害网上服务,一般选择单台设备开展总流量复制工作中。

Java Code拷贝內容到剪贴板
  1. public class TestAppRPC implements TestApp.Iface {   
  2.   
  3.     private Vcr _vcr = new Vcr("testapp"); // 特定复制总流量的key   
  4.   
  5.     @Override  
  6.     public TestResponse echo(TestRequest req) throws TException {   
  7.         _vcr.copy(req); // 复制实际操作   
  8.         long start = System.currentTimeMillis();   
  9.         TestResponse response = new TestResponse();   
  10.         return response;   
  11.     }   
  12. }  

1旦总流量复制进行后,根据Web页面,客户可以查询系统日志的搜集状况和一条系统日志的详细信息。

压测逻辑性完成
压测专用工具选用Groovy来开展撰写。对每一个运用来讲,只必须完成runner插口便可以完成对运用的施压。

拷贝编码
编码以下:

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

以Thrift服务为例:

Java Code拷贝內容到剪贴板
  1. class TestServiceRunner implements Runner {   
  2.   
  3.     RPCService.Client _client   
  4.     TTransport _transport;   
  5.   
  6.     @Override  
  7.     def init(Test app) {   
  8.         def conf = app.config // 载入运用配备   
  9.         _transport = new TFramedTransport(new TSocket(conf.get("thrift_service_host") as String, conf.get("thrift_service_port") as int))   
  10.         TProtocol protocol = new TBinaryProtocol(_transport)   
  11.         _client = new RPCService.Client(protocol)   
  12.         _transport.open()   
  13.     }   
  14.   
  15.     @Override  
  16.     def run(Test app, String log) {   
  17.         TestRequest req = Vcr.deSerialize(log, TestRequest.class// 将复制总流量反编码序列化   
  18.         _client.echo(req) // 推送恳求   
  19.     }   
  20.   
  21.     @Override  
  22.     def destroy(Test app) {   
  23.         _transport.close() // 关掉服务   
  24.     }   
  25. }  

建立运用
完成以上插口后,便可以对运用开展施压了。

客户能够根据Web页面建立运用,除必填配备之外,客户能够依照运用灵便配备。

特性指标值
客户能够根据直观的图表来查询运用的各种各样特性指标值。

完毕语
压测专用工具上线以来,早已接入了20好几个运用,进行数百次施压试验,如今运用的接入時间仅必须15~30分钟。确保了美团服务的平稳和节约了开发设计同学的時间,使大伙儿道别了过去繁琐冗杂的施压检测。

欢迎对这层面有兴趣爱好的同学1起探讨。

"> 对不起,没有下一图集了!">
在线咨询