美团点评技术沙龙011 - 团购系统流量和容量评估实践
Post on 16-Apr-2017
493 views
TRANSCRIPT
大促活动前团购系统 � 流量预算和容量评估实践 � 丁媛 � � 2016-09-10 �
目录 � 大促活动前团购系统 �
流量预算和容量评估实践 �
01
02
03
04
05
背景介绍 �
流量预算 �
容量评估——压力测试策略 �
容量评估——压力测试方法 �
总结展望 �
团购移动 �
到店综合平台 �
团购主频道 �
2013
2014
2015
2016
会员卡 �
个人介绍 �
丁媛 �
到店综合用户端测试组 � �
综合平台 �
单日交易额 �
1亿 �
日均订单量 �
百万 � 流量最高峰 � 移动交易额 �
占比超过90% �
引言 �
瞬时流量 �
吃货节 � 免费玩 �
免费吃 �
立减 �
秒杀 �
红包 �
抢购 � 热点团单 �
核心路径 �
大促活动的特点 �
团购WEB �
IOS/Android
团单服务 �
团单库 �
缓存集群
团购系统架构演进 � � 早期的团购系统 �
API层 �
Service层 �
数据持久层 �
数据缓存层 �
200+ � API接口 �
5月17号是个好日子, �
我们策划了一场超级大促~ �
预计流量要翻20倍~ � 好赞 �
但是。。系统扛不住啊 �
开 � 发 �
运 � 营 �
好啊 � 加几台? �
大促活动来啦, �
运维哥哥给扩容加机器啊 �
开 � 发 �
运 � 维 �
要制定扩容计划, �
我们集群容量多少啊 � 压力测试?? � 线上?线下?都很难 �
开 � 发 �
测 � 试 �
。。。 �
算了 � 拍个脑袋, �
两个应用各扩300台吧 �
开 � 发 �
运 � 维 �
团购WEB应用 �
IOS/Android
团单库 �
团单服务 �
缓存集群B
团购系统架构的演进 � 现在的团购系统 �
价格服务 � 属性导航服务 �
团购商户服务 �
团单库存服务 �
缓存集群A 缓存集群C
团单基础库 � 团单属性库 �
MAPI/WEB
Service层 �
数据持久层 �
数据缓存层 �
基础服务 � 团购详情服务 �
团单库存库 �
团单详情应用 �
IOS/Android
MAPI/WEB
Service层 �
数据持久层 �
基础/价格服务包 � 团单属性导航包 �
数据缓存层 � 缓存集群A
团单基础库 � 团单库存库 � 团单属性库 �
缓存集群C
团单交易应用 � 个人中心应用 �
团单聚合服务包 �
团单库存服务包 �
缓存集群B
团购系统架构的演进 � 现在的团购系统 �
团购WEB应用 �
团购系统架构的演进 �
9月17号是个好日子, �
我们策划了一场超级大促~ �
预计流量要翻20倍~ �
运 � 营 �
好赞! �
但是。。估计系统扛不住啊 �
开 � 发 �
好啊 � 加几台? �
大促活动又来啦, �
运维哥哥给扩容加机器啊 �
开 � 发 �
运 � 维 �
还可以通过分层压测评估系统容量 �
我们要有一份 �
详细的流量预算数据 �
开 � 发 �
测 � 试 �
好的,没问题! �
请根据我们提供的扩容计划表,
给核心路径应用加机器 �
开 � 发 �
运 � 维 �
� � — �
�
集群现有机器数 � � � = � 扩容机器数 � X � � 余量系数 �
单机容量 �
大促活动前的准备 �
活动峰值流量 �
目录 � 大促活动前团购系统 �
流量预算和容量评估实践 �
01
02
03
04
05
背景介绍 �
流量预算 �
容量评估——压力测试策略 �
容量评估——压力测试方法 �
总结展望 �
平时的流量 � 大促时的流量 � vs
大促活动的核心路径 �
h5活动页 � 团购详情页 � 提交订单页 �
大促活动的核心路径 �
h5活动页 � 团购详情页 � 提交订单页 �
团购WEB �
� � � � � � � � � IOS/Android �
MAPI/WEB �
Service层 �
数据持久层 �
基础/价格服务包 � 团单属性导航包 �
数据缓存层 �
团单聚合服务包 �
缓存集群TG �
团单基础库 � 团单库存库 � 团单属性库 �
缓存集群TGD �
团单库存服务包 �
缓存集群DealBase �
大促时核心路径架构图 �
团购详情应用有6个基础模块,占应用访问量的97% � � � � � � � � � 核心路径 �
• 团购基本信息接口 � • 团购详情须知接口 � • 团购适用商户接口 �
非核心路径 � • 本店其他团购推荐接口 � • 看了又看接口 � • 网友点评接口 �
第一步:根据活动页每个按钮的位置 � � → � � 梳理APP � Native页面每个接口的调用 �
活动流量预算 �
活动流量预算 �
团购详情接口 �
IOS/Android
本店其他团购推荐 � 团购适用商户接口 � 看了又看接口 � 网友点评接口 �
团购基本信息接口 �
团购详情页6个基础模块的接口之间调用顺序 �
第二步:梳理接口之间的调用顺序以及接口内部的调用链 �
活动流量预算 �
第三步:通过代码分析和CAT堆栈,梳理接口依赖的服务及服务调用次数 �
团购基础信息API 团购商户API
团单基础服务 � 团单详情服务 � 团单收藏服务 � 团单商户服务 �
团单价格历史服务 � 团单价格服务 � 团单库存服务 �
缓存集群TG 缓存集群DealBase 缓存集群TGD
团单基础库 � 团单属性库 � 团单库存库 �
团单后台服务 �
团购详情API
团单属性服务 �
1 5
1
7
28
97%
1
7 7 7
创建订单、⽀支付等其他场景
团购基础信息API 团购商户API
团单基础服务 � 团单详情服务 � 团单收藏服务 � 团单商户服务 �
团单价格历史服务 � 团单价格服务 � 团单库存服务 �
缓存集群TG 缓存集群DealBase 缓存集群TGD
团单基础库 � 团单属性库 � 团单库存库 �
团单后台服务 �
团购详情API
团单属性服务 �
1 1
7 2 1 1 1
2 7 7 7
7 711
74 7114 2428
97% 99%
99.9% 85% 5% 98%
创建订单、⽀支付等其他场景
1 5
大促活动核心路径流量模型下,设详情页的流量为单位1,此时流量构成如下: � �
• 访问服务次数: �
活动流量预算 �
服务 � 访问次数 �
团购基础服务 � 7 �
团购详情服务 � 1 �
团购价格服务 � 7 �
团购属性读服务 � 2 �
团购库存读服务 � 7 �
团购商户服务 � 1 �
团购后台服务 � 2 �
团购历史服务 � 7 �
团购收藏服务 � 1 �
在大促活动流量模型下,设详情页的流量为单位1,此时流量构成如下: � �
• 访问cache次数: �
• 访问DB次数: �
活动流量预算 �
缓存系统 � 访问次数 �
memcached-A � 7 �
memcached-B � 11 �
memcached-C � 7 �
数据库 � 访问次数(不考虑缓存) �
团购基础库 � 49 �
团购属性库 � 11 �
团购库存库 � 7 �
活动流量预算——扩容计划表 �
done
� � — �
�
集群现有机器数 � � � = � 扩容机器数 � X � � 余量系数 �
单机容量 �
大促活动前的准备 �
活动峰值流量 �
目录 � 大促活动前团购系统 �
流量预算和容量评估实践 �
01
02
03
04
05
背景介绍 �
流量预算 �
容量评估——压力测试策略 �
容量评估——压力测试方法 �
总结 �
34
系统容量评估——压力测试 �
• 压测目的 �
• 压测环境 �
• 压测类型 �
压测策略 �
• 压测方法 �
• 压测场景 �
• 压测数据 �
压测过程 � 压测结论 �
• 数据采集 �
• 监控告警 �
是否可以通过水平扩容来提升集群容量,系统瓶颈在哪? �
集群容量 �
监控指标应该如何设置, � 若超过阈值告警机制是否生效? �
监控告警 � 数据库能承担的压力是多少? �
DB容量 �
应用的单机容量是多少? � 单机容量 �
系统容量评估——压测目的 �
ℜ
36
系统容量评估——压力测试 �
理想 �
• 线上压测 �
• 系统全链路压测 �
• 一次压测解决问题 �
�
现实 �
• 线上压测有风险,成本高 �
• 时间紧(活动测试、版本发布
和压力测试并行) �
• 全链路压测依赖服务多,参与/
周知人员多 �
• 全链路可以压出系统瓶颈,但
是不能提供单机容量 �
保证压测数据有效性的基础上,做性价比最高的压力测试 �
系统容量评估——压测环境 �
BETA环境 � PPE环境 � 线上环境 � PTP环境 �
硬件环境 �
数据可靠 �
稳定 �
易用 �
风险 �
PTP性能测试环境 �
• 机器数量有限 � � à � � 基于Docker的虚拟机器池 �
• 维护成本很高 � � à � � 一键部署被测应用 �
• 资源利用率低 � � à � � 定期环境清理 �
PTP性能测试环境 �
• 解决传统的性能测试环境存在的问题 �
PTP性能测试环境——硬件环境 �
• 与线上机器配置一致 �
• 同步线上JVM配置 �
PTP性能测试环境——数据可靠性 �
• 同步线上数据库/表 �
如何部署依赖的服务?
p 直接依赖服务 �
p 间接依赖服务 �
p 数据库依赖 �
p 公共服务 �
p 手动添加 �
PTP性能测试环境——智能依赖 �
• 智能依赖模块 �
• 环境搭建流程 �
新建测试 � 项目 �
智能拉取 � 依赖 �
配置项目 � 参数 �
配置测试 � 环境 �
初始化 � 测试环境 �
p Web页面入口 �
p 查找被测服务 �
p 获取直接依赖 �
p 获取间接依赖 �
p 手工添加依赖 �
p 测试名称 �
p 上传jmx测试脚本 �
p 上传数据文件 �
p 上传流量包等 �
p 选择被测机器CPU �
p 选择被测机器内存 �
p 选择被测应用版本 �
p 申请机器 �
p 检查依赖DB �
p 部署被测应用 �
p 部署直接依赖服务 �
p 部署间接依赖服务 �
p 查看部署日志 � 监控系统CAT:Dependency实时报表 � 代码管理系统CODE �
容量评估方法——PTP性能测试环境 �
直接获取的依赖服务不全怎么办?
回流依赖模块 �
预跑 � 回流 � 正式测试 �
p 直接执行测试脚本 � p 获取缺失的依赖 �
p 循环调用部署模块 �
p 继续回流分析 �
p 直至无依赖缺失 �
p 正式执行测试脚本 �
p 展示实时性能数据 �
监控系统CAT:Problem
PTP性能测试环境——依赖回流 �
• 数据可靠性 �
p 硬件环境灵活配置 � ✓ �
p 数据库可以随时同步线上数据 � ✓ �
p 施压机和被测应用都可以是集群✓ �
• 稳定性 �
p 专职专用,不会影响正常的功能测试 � ✓ �
p 自动部署依赖应用的稳定版本✓ �
p 支持泳道配置,可以同时压测多个服务✓ �
• 易用性 �
p 支持Jmeter、Tcpcopy等压测方法✓ �
�
50
系统容量评估——压力测试 �
• 压测目的 �
• 压测环境 �
• 风险成本 �
压测策略 �
• 压测方法 �
• 压测场景 �
• 压测数据 �
压测过程 � 压测结论 �
• 数据采集 �
• 数据分析 �
• 监控告警 �
51
系统容量评估——压测方法 �
p 线上压测方法——逐步减小集群规模 �
- 通过逐台摘机器的方法,使得单台机器的访问量不断提升,来达到压力测试的目的。 �
- 优点:应用无需读写接口分离 �
- 缺点: �
- 1.逐个摘机器有风险 � � � �
- 2.对流量规模有要求,不能太小,否则压不到瓶颈 � �
- 3.需要运维人员的密切配合。 �
52
系统容量评估——压测方法 �
p 线上压测方法——线上Tcpcopy �
- 在集群中挑选A、B两台机器,A为被压机,B为施压机。 �
- 将A配置一个泳道(机器不对外提供服务),通过Tcpcopy将B的流量逐渐放大至A。 �
- 优点:流量比例、风险小,可以随时修改放大倍数 � �
- 缺点: �
1、要求被压的服务只能是纯读服务,不能有写接口,否则会带来脏数据 � �
2、Tcpcopy工具限制,放大40倍会挂掉,若线上流量太小。 �
则需要首先摘掉部分机器以提高单机的QPS �
53
系统容量评估——压测方法 �
p 线下压测方法——性能测试平台 �
p 模拟线上机器配置、JVM配置 �
p 模拟线上接口请求比例 �
p 模拟线上接口请求参数分布 �
p 模拟线上缓存命中率 �
54
系统容量评估——压力测试 �
• 压测目的 �
• 压测环境 �
• 风险成本 �
压测策略 �
• 压测方法 �
• 压测场景 �
• 压测数据 �
压测过程 � 压测结论 �
• 数据采集 �
• 数据分析 �
• 监控告警 �
系统容量评估——压测场景 �
实例一 �
• 团购基础查询服务提供了两种查询方式:单个查询和批量查询 �
• 设计测试场景时需要考虑两种接口的比例分布 �
• 使用jmeter比例控制器做控制 �
系统容量评估——压测场景 �
实例二 �
• 团购基础查询服务的批量接口参数个数 �
• 需要设计调用批量查询接口时传入的团单id个数 �
系统容量评估——压测场景 �
实例三 � • 针对对应用性能有影响的参数类型、逻辑分支设计场景 � • 例如团购销量查询服务区分品类 �
- A品类团单要展示聚合销量、B品类团单要展示分城市销量 �
- 不同的逻辑分支,查询不同的缓存和数据库 �
p 压力测试数据的构造 �
- 线上流量tcpdump,到性能测试环境做流量翻倍回放 �
- 采取MAPI � Nginx � access � log回放机制,对用户真实访问行为进行回放 �
- 人工构造数据 �
�
系统容量评估——压测数据 �
系统容量评估——压测数据 �
• 被测应用:团购详情WEB应用(纯读服务) �
• 压测环境:性能测试环境 �
• 压测数据:tcpdump复制线上流量在性能环境做回放 �
• 压测方法: �
实例一 �
- 选择合适的时间段(流量不要太低) �
- dump流量时间足够长,流量翻倍时数据离散度需满足要求 �
系统容量评估——压测数据 �
• 被测应用:个人中心WEB应用(读+写) �
• 压测环境:性能测试环境 �
• 压测数据:nginx � access � log �
• 压测方法: �
实例二 �
- 将最近通过app的访问nginx � access � log进行分类(读、写) �
- 线上到线下token的解析问题 �
系统容量评估——压测数据 �
Nginx � access日志 �
系统容量评估——压测数据 �
• 被测应用:团购基础信息服务 �
• 压测环境:性能测试环境 �
• 压测数据:人工构造数据(csv文件) �
• 压测方法: �
实例三 �
- 人工构造的数据应模拟线上的缓存命中率 �
- 缓存命中率比线上环境偏低,需要进行缓存预热 � �
- 缓存命中率比线上环境偏高,需要尽量模拟线上团单的离散程度 �
p 压力结果数据的采集 �
- CAT � Heartbeat � / � Transacation �
- PTP性能测试平台监控报告 �
- Jconsole/ � VisualVM � (推荐,集成多个JVM命令的可视化工具) �
- JVM命令:jstack/jstat/jmap �
系统容量评估——压测结果采集 �
64
系统容量评估——压测结果采集 �
� � — �
�
集群现有机器数 � � � = � 扩容机器数 � X � � 余量系数 �
单机容量 �
大促活动前的准备 �
活动峰值流量 �
扩容计划表 �
目录 � 大促活动前团购系统 �
流量预算和容量评估实践 �
01
02
03
04
05
背景介绍 �
活动流量预算 �
系统容量评估——压力测试策略 �
系统容量评估——压力测试过程 �
总结 �
68
总结 �
流量预算 �
容量评估 � 从
上到
下评
估流
量 �
从下
到上
提供
能力
�
保证大促期间核心路径用户体验 �
69
Thank � You �