如何做压测?

简介: 压测的一般流程和方法是什么?需要关注哪些数据指标?如何推算后端需要支持的qps?本文分享总结压测过程中需要注意的问题,希望对同学们有所启发,欢迎讨论~

image.png

作者 | 冬恒
来源 | 阿里技术公众号

一 压测目标

在开始做压测计划之前,一定要先明确压测的目标是什么,虽然最终的目标肯定都是优化系统的性能,但是不同的出发点,可能需要采取不同的方法。

一般来说,可能有以下一些目的:

image.png

1 挖掘系统瓶颈点,优化系统性能

尤其对新系统上线,缺乏性能基线数据,此时压测一般没有明确的qps/rt等指标,而是通过不断施压,不断逼近系统的极限,从而暴露问题,修复问题。

2 建立性能基线

主要是为了收集系统当前的最大性能指标,一般会根据业务特点,先确定对rt和错误率的容忍度,然后通过压测推算出能够支持的最大qps, 并发量等。

同时可以结合性能指标和监控数据,来建立合理的预警机制,设立系统水位报警项,限流阈值,弹性策略等。

量化系统能力/SLA等 (比如在竞标中引用)。

3 性能回归

对于已上线系统,或者性能需求明确的系统,可以根据线上实际的运行情况,确定系统需要支撑的qps/rt, 然后在涉及性能影响前做回归校验,确保性能满足预期。

4 系统稳定性

更侧重在一定压力的情况下,系统是否能长时间稳定持续的提供SLA保障。

一般可以考虑将压力设定到业务峰值的80%,持续施压。

5 网络/线路延迟稳定性等

在一些特殊的业务场合,对延迟的容忍度极小,比如DNS解析,CDN服务,多人实时在线游戏,高频交易等等,需要网络质量,尤其是不同线路(电信/联通/教育网/...)间的差异。

二 压测对象

明确了压测目标后 ,就是确定要压什么,来实现目标。

一般来说,压测对象可以这么分:

image.png

  • 后端
    • 单api
    • 单业务逻辑场景
  • 前端
    • 单request
    • 单操作
    • 单页
    • 整体页面平均情况

三 压测数据

压测过程中,一般主要关注一下数据指标:

1 starter/client

image.png

最重要的三个指标:

  • qps
  • rt
  • 成功率

其他的:

  • 页面平均响应时间 (重要)。
  • 并发量(其实没那么重要,主要还是qps)。
  • 最大用户同时在线数 (用户登录系统,一般不需要额外压测,除非业务场景特殊)。
  • 网络质量(延迟,波动等,不展开)。

2 server

主要是监控数据:

image.png

  • cpu usage
  • load
  • mem
  • jvm/fullGC
  • 连接数(netstat)
  • disk io (iostat / iotop)

四 压测结果分析

一般是随着压力的增加(并发请求的增加)探究qps/rt/成功率三者的关系,从而找到系统的平衡点,如果能结合服务端的监控数据,就更好。

image.png
image.png
image.png

五 压测工具

1 jmeter

concurrent Thread Group

image.png

java sampler

image.png
image.png

composite chart

可以将多个chart组合到一个chart中,并且坐标系会自动伸缩,方便在一个图中展示结果。

image.png

六 性能指标推算方法

以上都是一些系统向的指标数据,其实对用户来说是不感知,或者说也是没有意义的。那什么样的数字是有意义的呢?举个例子:

如果你提供的是一个在线的网页服务,那用户可能关心的是,你的系统在保证不察觉卡顿的情况下(系统的SLA, 实际可能容忍存在偶发的页面错误重试)能承受多少人并发使用。

如果你提供的是个结算系统,那用户可能关心的是,在保证交易有效性的情况下(不能出错,但是可以偶发超时重试,同样是系统的SLA),每秒可以处理多少笔订单。

举例分析:

1 基本算法

image.png

此处pv表意不清,实为后端日志统计的后端api的调用次数,如果有前端统计的一般意义上的pv(page visit),基本原理相同,可以简单换算一下,pv * x-ratio = 后端调用次数。

  1. 获取现场每日asapi PV/UV的均值/峰值。
  2. 取Max(PV峰值*0.8,每日PV均值)作为目标PV', PV'时段的UV值作为实际并发用户参考值N', 计算PV'/perMinute/N'作为每分钟用户操作触发api次数O'。
  3. 根据以下规则换算成后端需要支持的qps:
  • 3.1 模型假设:2/8原则——每日有80%的PV发生在20%的工作时间内(ratio=0.8)。
  • 3.2 假设页面单个请求映射到后端api请求比例为1:10,假设一天working hour为8小时 (e=10)。
  • 3.3 假设一般用户,高峰期每分钟操作页面10次 (o=10)。
  • 3.4 根据现场日PV计算支持N'用户并发操作需要的qps:PV' * ratio/(working hour∗60∗60∗(1−ratio) )= qps
  • 3.5 根据现场峰值小时级PV计算支持N'用户并发操作需要的qps:PV' * ratio/(1∗60∗60∗(1−ratio) ) = qps
  1. 根据压测qps推算能够支持的最大用户同时使用数:
  • 4.1 同样基于上述公式,根据上述假设,1分钟内,每个用户操作10次,每次前端操作对应后端10个api:
    • 1分钟PV = N 10 10
    • N 10 10 / 60 = qps ==> N = qps * 0.6
  • 4.2 如果按照小时为单位推算,1个小时内,每个用户操作页面100次,每次前端操作对应后端10个api:
    • 60分钟PV = N 100 10
    • N 100 10 / 6060 = qps ==> N = qps 3.6

2 正向推演

如果现场环境数据表明,高峰期9:00~10:00有50人登录过系统,pv累计10000,那么根据(3.1),系统整体qps >= 11+ 才能维持当前用户量正常使用。

3 反向推演

如果家里环境压测结果表明,随机API调用qps=30, 保持上述假设,参照(4.2),即可支撑18人高峰期同时操作。

4 不严谨的地方

上述算法针对随机API按照1:1计算,实际上调用肯定是不均匀的,可以根据现场的数据统计下api的调用分布,压测是模拟相同的调用分布尽量贴近实际。

另外用户每分钟操作页面次数,和每次前端请求对应后端api的膨胀比都是预估出来的,虽然可以根据模型做近似,但是不如直接根据现场数据计算出来准确。

七 其他考量

  • 链路跟踪能力,分析瓶颈点
    • api log
    • eagleye-traceId

image.png

  • 缓存对数据库的影响
    • 是否需要压到db层,要考虑压测场景。
    • 是否需要创造海量的随机压测数据 (比如针对单用户的缓存优化场景,单一用户的性能不能用来推送多用户并发的场景)。
  • 同步接口异步接口的压测 (staragent)
    • 主要考验后台任务处理能力(异步任务提交即时返回了)。
  • 系统不同层次的限流设置对API的影响
    • 比如有业务层的限流如Sentinel, Nginx层的限流如X5, 或者其他基于LVS的限流等。
  • 消息通信,尤其是广播消息。
  • 数据库,尤其是写一致性。
  • 复杂场景的长链路调用。
  • Nginx/Tomcat的配置对请求的影响。
  • 容易忽视的对象序列化/反序列化对性能的影响。
  • 热点数据。
相关文章
|
消息中间件 Java 中间件
秒懂消息队列MQ,万字总结带你全面了解消息队列MQ
消息队列是大型分布式系统不可缺少的中间件,也是高并发系统的基石中间件,所以掌握好消息队列MQ就变得极其重要。接下来我就将从零开始介绍什么是消息队列?消息队列的应用场景?如何进行选型?如何在Spring Boot项目中整合集成消息队列。
25460 10
秒懂消息队列MQ,万字总结带你全面了解消息队列MQ
|
监控 前端开发 Java
错误码如何设计才合理?
对于错误码的设计,不同的开发团队有不同的风格习惯。本文分享阿里文娱技术专家长统对于错误码的看法,希望从错误码使用的不同场景讨论得到一个合理的错误码规约,得到一个面向日志错误码标准和一个面向外部传递的错误码标准。
12153 3
错误码如何设计才合理?
|
8月前
|
存储 安全 Java
Spring Security 入门与详解
Spring Security 是 Spring 框架中的核心安全模块,提供认证、授权及防护功能。本文详解其核心概念,包括认证(Authentication)、授权(Authorization)和过滤器链(Security Filter Chain)。同时,通过代码示例介绍基本配置,如 PasswordEncoder、UserDetailsService 和自定义登录页面等。最后总结常见问题与解决方法,助你快速掌握 Spring Security 的使用与优化。
1958 0
|
8月前
|
安全 Java API
什么是用于 REST API 的 Bearer Token以及如何通过代码和工具进行调试
Bearer Token 是一种基于 OAuth 2.0 的身份验证机制,广泛应用于 REST API 的授权访问中。它通过在 HTTP 请求头中传递令牌,确保用户凭据安全传输并验证。本文深入解析了 Bearer Token 的概念、实现步骤及调试方法,包括其无状态特性、灵活性与安全性优势。同时,提供了 Java 实现示例和使用 Apipost、cURL 等工具测试的实践指导,帮助开发者掌握这一核心技能,保障 API 系统的安全与高效运行。
|
NoSQL Java 应用服务中间件
大厂面试必备:如何轻松实现分布式Session管理?
这篇文章介绍三种分布式Session的实现方案:基于JWT的Token、基于Tomcat的Redis和基于Spring的Redis。JWT方案通过生成Token存储用户信息,实现无状态、可扩展的会话管理,但可能增加请求负载且数据安全性较低。Tomcat与Redis结合,通过配置Tomcat和Redis,实现Session集中管理和高性能存储,但配置相对复杂。Spring整合Redis适用于SpringBoot和SpringCloud项目,集成方便,扩展性强,但同样依赖外部Redis服务。每种方法有其优缺点,适用场景不同。作者小米是一个技术爱好者,欢迎关注其微信公众号“软件求生”获取更多技术内容
827 4
|
11月前
|
Prometheus 监控 Cloud Native
高频面题: 你们线上 QPS 多少?你 怎么知道的?
本文由45岁资深架构师尼恩撰写,针对高级开发和架构师面试中的高频问题提供详细解答。文章涵盖了QPS、TPS、RT等性能指标的定义及计算方法,详解了如何配置Prometheus与Grafana监控系统QPS,并提供了应对高并发场景(如双十一抢购)的系统部署策略。此外,还分享了多个大厂面试真题及解决方案,帮助读者在面试中充分展示技术实力,提升求职竞争力。建议收藏并深入学习,为面试做好充分准备。更多内容可参考《尼恩Java面试宝典》及相关技术圣经系列PDF。
|
存储 安全 Java
【SpringSecurity】快速入门—通俗易懂
【SpringSecurity】快速入门—通俗易懂
319 0
|
Kubernetes 架构师 Java
史上最全对照表:大厂P6/P7/P8 职业技能 薪资水平 成长路线
40岁老架构师尼恩,专注于帮助读者提升技术能力和职业发展。其读者群中,多位成员成功获得知名互联网企业的面试机会。尼恩不仅提供系统化的面试准备指导,还特别针对谈薪酬环节给予专业建议,助力求职者在与HR谈判时更加自信。此外,尼恩还分享了阿里巴巴的职级体系,作为行业内广泛认可的标准,帮助读者更好地理解各职级的要求和发展路径。通过尼恩的技术圣经系列PDF,如《尼恩Java面试宝典》等,读者可以进一步提升自身技术实力,应对职场挑战。关注“技术自由圈”公众号,获取更多资源。
|
缓存 算法 关系型数据库
深度思考:雪花算法snowflake分布式id生成原理详解
雪花算法snowflake是一种优秀的分布式ID生成方案,其优点突出:它能生成全局唯一且递增的ID,确保了数据的一致性和准确性;同时,该算法灵活性强,可自定义各部分bit位,满足不同业务场景的需求;此外,雪花算法生成ID的速度快,效率高,能有效应对高并发场景,是分布式系统中不可或缺的组件。
3867 2
深度思考:雪花算法snowflake分布式id生成原理详解
|
人工智能 安全 数据管理
当云计算遇上AI 智能、协同、数实融合,正在走入现实
文章指出,人工智能作为关键技术正在深刻改变生活和工作方式,并强调多云管理平台对AI算力的重要支持。阿里云提出打造AI时代最开放的云,强调AI将带来全行业深刻变革。同时,文章介绍了下一代云的发展趋势,强调PaaS层将成为下一代智能云的核心能力,以及企业对云的需求变化。此外,文章还讨论了云边协同和多云协同在不同行业的应用,以及云计算和AI结合对市场的影响。文章最后指出,随着AI、VR等技术加速发展,市场对云计算需求的增长是一个几何级数的增长,预示着巨大的发展空间。https://mp.weixin.qq.com/s/wMUjrVHVRGtF64-xqqCzIA