转转 双 11 大促压测 - 总结与收获

2024-03-25 23:08

本文主要是介绍转转 双 11 大促压测 - 总结与收获,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文由锦弟发表于TesterHome社区网站,原文链接

背景

大促压测(单场景,多场景,全链路)是基于生产环境和实际业务场景,模拟海量的用户请求和数据对整个业务链进行压力测试,并持续调优的过程。
随着公司业务的不断变更和新增,用户流量也在不断提升,系统框架的规模和复杂性也随之增加。生产环境服务的稳定性也越来越重要,服务性能问题,以及机器资源容量问题也越发明显。为了及时暴露各种性能问题,我们是基于生产环境进行全链路压测。接下来介绍一下双 11 大促,我们是如何做生产环境压测的

一:准备阶段

压测数据准备:

1、梳理业务,梳理压测页面、接口

2、分析动态参数、录制接口

3、构造压测动态参数数据

4、设定目标 QPS(zlj-压测接口预期指标&实际结果);

参考去年双 11 和今年 618 接口流量峰值设定双 11 接口目标 QPS(a x b x c):

a:去年双 11&今年 618 接口流量峰值

b:大促等级 1.2 倍

c:预防突发流量,按页面等级 5-10 倍

计算公式:(80%请求数  × 冗余系数) ÷ 20%时间 或 峰值时间 = TPS

接口预期 QPS:

问题回顾:

1、刷新用户 token,使用中台提供接口,跑 1w 用户时接口报错;token 缓存时间 1h 比较短,需要每小时刷新一次;

2、调试接口时,cookie 中 token 未带双引号,调试过程中出现 token 无效的情况;

解决方案:

1、token 生成可以通过数据构造的方式,调用生成 token 接口,直接生成 csv 文件;

2、压测数据文件的 token 统一带入双引号括起来;

相关服务梳理:

压测场景梳理:

 

二:执行阶段

时间周期:10 月 09 日 ~ 11 月 09 日

共执行 9 轮:单卖场 4 轮,双卖场 3 轮,全卖场 2 轮

压测申请

单卖场

压测目标:解决单接口性能问题,服务依赖限流调整到合适比例,机器调整到合适资源

最终结果:经过 4 轮压测不断优化调整,分别对 zljA 服务,zljB 服务,增加 cpu 核数与容器节点,对 zljC,zljD 增加 cpu 核数,使 QPS 达到预期目标;

卖场接口性能无太多问题,大部分为调用限流熔断,机器资源问题;

问题回顾:

1、每次调整限流都会出现遗漏;

2、每次调整完进行新一轮压测,又会出现新的限流服务;

解决方案:

1 轮压测后将不达标的接口罗列出来,将相关依赖服务整理出来,根据当前调用量分析是否需要调整;

双卖场

压测目标:双卖场接口达到预期,机器调整到合适资源,压出依赖服务瓶颈

最终结果:经过 3 轮压测,双卖场 QPS 均达到预期目标

问题回顾:

1、搜索瓶颈,双卖场同时压测线程过大时,搜索推荐服务超时异常较多

2、服务治理平台统计耗时不高,Nginx 报告统计耗时很高,无论线程数与压测机比例如何分配,都无法提升 QPS,最后发现网关对 token 有缓存机制,过期会透过缓存,导致数据库压力过大,且网关耗时没有被统计到;

3、接口录制时,按页面流量比例设置的线程,线程中包含多个接口,导致其中某个接口耗时高时,影响到其他接口

解决方案:

1、搜索、推荐测降级、卖场熔断部分推荐列表、卖场商列做缓存

2、每小时刷新一次 token

3、后续压测全部按单接口单线程录制(吐槽:修改起来会比较麻烦,建议压测平台提供一键修改线程数)

全场景

压测目标:接口达到预期

问题回顾:

1、会场促销接口耗时较高,陈年代码修复起来比较困难

2、第一轮全场景,搜索推荐服务瓶颈,导致压测无法继续,短时间没有排查出问题

3、红包异常较多,数据库出现瓶颈

解决方案:

各业务线配合优化调用链路和请求调用量

三:整理压测报告

压测报告内容:

资源配置

数据文件

当前轮次压测总结(达标内容,不达标内容,问题原因,需要跟进负责人);上一轮修复问题验证结果

压测记录(标记不符合接口)

统计场景中超时异常较多的接口,依赖服务及调用函数

压测记录截图

示例:

 

四:总结复盘

接口双 11 预期&压测结果&实际业务高峰

压测峰值&业务峰值

五:成长心路历程

从 0 到 1,学习进步

刚接触压测的时候,只知道一些理论知识;接到需求后不知如何设计压测方案,也不知道压测的目标是什么,只能先熟悉压测平台的使用,以及录制压测脚本、执行;看一看服务资源占用,压测报告 QPS,接口耗时;就连压测报告也不知道要输出哪些内容突出哪些重点;

寻找方向,突破成长

通过几次日常摸底压测,逐渐了解不同的压测目的,制定的目标与计划也有所不同;像新接口的日常摸底需要关注单接口的瓶颈,大促活动的压测需要关注整体的 QPS;在压测过程中逐渐了解各监控平台的使用,开始关注数据在整个链路中各流程节点的消耗;

例如:搜索商列接口,通过服务治理平台,可以了解到它调用的服务,和调用的函数,也可以查到它对应的耗时时间,通过比对依赖服务的耗时,找到可以优化的内容;

总结问题,技术精进

学会总结压测过程中经历的问题(配置问题、限流问题、异常问题、GC、耗时较长修复),总结压测过程中可以提高效率的问题(完善压测计划,各监控平台使用),总结遇到问题时开发如何去排查;

可以快速的提升自己对服务之间依赖关系的了解,学会如何利用各监控平台内容去定位问题;

分析每次压测过程中大家关注的内容,整理出可以在压测报告中体现的重点;

通过多次压测后,哪些内容会对压测结果造成影响,可以提前做好配置准备;

例如:提前申请调用量,告知开发开启熔断、降级等等


收获前沿测试开发技术 · 学习先进质量管理方法 · 结识测试大咖行业精英

这篇关于转转 双 11 大促压测 - 总结与收获的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/846541

相关文章

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO