之家性能压测平台PTS

语言: CN / TW / HK

总篇131篇 2022年第6篇

前言

818 全球汽车夜晚会直播对于汽车之家而言是一年中最重要的活动,活动期间用户集中参与直播活动,流量突增数倍,对于线上服务压力承载、底层基础服务都是一年中最大的挑战,为了保障当天活动顺利进行,在活动前,云平台结合各业务方一起进行了一轮又一轮的全链路压测演练来科学评估活动期间线上服务存在的隐患。承载此次演练的基础服务便是今天要介绍的之家压测平台PTS。本文将介绍PTS的的架构设计、关键举措和实践效果。

架构图

之家PTS由用户端、调度服务、资源管理、日志收集、指标计算、压测报告等核心模块组成,并且平台具备分布式压测能力,通过流量回放等方式模拟海量用户真实的业务场景,超过平时数十倍的流量对业务服务进行集中请求,探测业务服务的性能瓶颈,推进解决隐患,确保服务稳定性。

图1 -PTS流程架构图

压测系统的流程架构图,如图一所示,用户在页面注册要压测的接口信息称为一个场景,场景运行会提交到压测任务分发调度服务,调度服务请求docker swarm集群获取可用资源容器资源,开始压测,JMeter产生的请求日志写入服务器指定目录,被Flume实时收集到Kafka,借助实时计算平台Flink任务统计当前场景的压测指标,通过Redis Sink写入Redis,用户可以在压测详情页实时观测压测指标。接下来分别介绍核心的几个概念。

组件流程图

图2 -组件流程图

压测单元

一个Docker镜像实例为一个压测单元,其中包含两个关键模块:RPC服务、JMeter压测包,RPC服务负责压测调度实时获取容器内压测情况,JMeter负责发压,压测产生的日志写入虚机公共目录,虚机的Flume负责收集日志写入Kafka。

图3 -压测单元

RPC服务

PTS的RPC模块采用gRPC框架实现,gRPC是谷歌开源的一款跨平台、高性能的PRC框架,gRPC通过protobuf定义接口,从而可以更加严格的接口约束,并且protobuf会将数据序列化为二进制,减少传输的数据量,性能优势明显。

PTS实现的RPC服务主要有几个核心接口功能:

  • 发送配置文件 send_conf_file()

  • 发送Jar包 send_jar_file(),采用解压并行传输

  • 执行命令 同步:exec_command() 、异步:async_exec_command()

  • 启动JMeter run_jmeter()

日志规范

存放目录与命名规范:统一挂载/data/log,命名由时间戳+任务ID组成,方便收集和排障。

图4 -日志目录

日志内容示例:

图5 -日志内容

单条日志会记录一次请求的完整地址、参数、method、response code 、开始结束时间,发送和接收的字节数。

Docker Swarm

Swarm是Docker公司推出的管理Docker集群的平台,支持多Master保障高可用,并可以通过各类Docker Client直接与Swarm通信,相比较k8s更轻量更容易维护,我们818活动期间总的压测集群规模为270台虚机,分布在2个机房廊坊和亦庄,通过调度服务判断发压机房,最大同时运行的镜像有近2000个,状态、通信、监控都是由Swarm来管理和协调,前后进行10轮压测,单轮QPS达到500w,Swarm稳定无故障,相对可靠。

图6 -swarm集群

流量抓包

之家日志格式常见的有两种,一种为Nginx日志(字符串),一种是网关日志(JSON格式),日志会实时收录到Kafka,流量抓包任务启动时开始Kafka消费,通过用户接口等信息进行过滤,有条数或时长两种抓包策略。

流量抓包配置示例:

图7 -流量抓包配置

压测类型

平台支持四种压测类型:自定义请求、gRPC、原生、流量回放。

  • 自定义请求

图8 -自定义类型设置

施压配置,通过以往的压测经验,线程数与吞吐量的最佳比例1:2 - 1:5。

图9 -施压配置

  • gRPC测试

平台支持grpc类型的接口压测,除了常规的参数设置,核心的配置是需要用户上传proto文件。

  • 原生测试

原生压测支持高阶用户上传自定义JMeter配置文件.jmx,服务端自动解析,根据参数配置自动启用分布式压测

  • 流量回放测试

图10 -流量回放类型

压测报告

通过FlinkSQL计算,压测报告已经做到秒级统计更新指标,压测过程中实时查看压测接口的压力情况,第一时间跟进出现的异常。

图11 -压测报告

分布式压测

当前发压策略为1000线程数对应一个容器资源,当用户设置线程数N超过1000时,后台计算需要M = (N/1000+1)容器资源 ,生成JMX时动态设置线程数(ThreadGroup.num_threads)和发压量(throughput),发送到分发调度服务,向Swarm申请M个容器,当申请成功后,调用gRPC服务初始化每个容器的发压环境,状态满足后,开始发压。

 图12 -分布式分压

压测实践

一次818活动前的压测任务,都是对PTS的一次大考,今年的818前后我们进行了10轮压测,单轮压测场景超过200个,单场景最大QPS达到100w,压测集群270个节点,最后一轮压测通过率100%,最终PTS顶住压力圆满完成818压测工作。

整个压测过程中,我们做到了全链路监控,核心资源和节点都配置实时看板。第一时间处理异常情况(活动集中压测时开启)。

 图13 -818压测机器实时监控

图14 -818压测实时看板

总结

之家性能压测平台PTS自上线以来,已支持多个业务线日常压测场景,并很好的完成了公司818活动的压测任务,不过现在整个压测流程长环节多,涉及的中间件也非常多,后续我们将Swarm集群升级托管到K8s,提升机器资源利用率并能减轻自身运维压力,二次开发JMeter日志不落盘直接写入Kafka,缩短流程提升效率减少Flume的维护。还有公网的异地多机房发压、发压过程中的动态host等场景支持。

欢迎大家留言给我们提出宝贵意见,感谢。

作者简介

汽车之家

张凯

云平台部

2019年加入汽车之家,任职于云平台部,云基础平台研发团队,负责AutoBDP大数据平台的规划与建设。

阅读更多

▼ 关注「 之家技术 」,获取更多技术干货 

「其他文章」