软件压力测试和性能测试分析方法论

2023-11-04

压测和性能分析方法论

  性能测试基础

  性能测试的常见分类

  性能测试。用来验证系统的性能是否满足设计的预期,一般来说对系统的压力会比较小,不会压垮系统,只是进行简单的验证。

  负载测试。通过不断施加负载压力,寻找系统最优的处理能力,最好的性能状态,达到最大的性能指标。通常说来,负载测试的结果比性能测试的结果高一点。

  稳定性测试。可以认为是负载测试的一个子集,长时间不均匀的施压,然后看系统的各项指标是否都正常。

  压力测试:是我们常见的,一般我们将压测都是指这个,用来确定系统能够抗住的最大容量是多少,压力测试一般都会压到系统最大能够承受的点,然后得出一个峰值结论。

  压测类型和施压模式

  压测类型一般分为单服务压测和全链路压测两种压测类型。

  而我们常见的施压模式有以下两种:

  ·并发模式(以用户角度来模拟用户模式)

  并发是指并发用户数,从业务角度来模拟同时在线的用户数,从而达到预期的并发量,要计算吞吐的话还需要做个转换。但是在某些场景比较符合场景的预期

  · RPS 模式(以请求的吞吐量角度来模拟吞吐模式)

  RPS(Requests Per Second)是指每秒请求数。RPS 模式即“吞吐量模式”,通过设置每秒发出的请求数,从服务端的角度出发,直接衡量系统的吞吐能力,免去并发到 RPS 的繁琐转化,一步到位。

Jmeter高级性能测试实战

  并发模式与 RPS 模式没有优劣,各自有各自适用的场景。

  常用压测工具

  常用压测工具如下:

  · wrk: https://github.com/wg/wrk

  · ab: https://httpd.apache.org/docs/2.4/programs/ab.html

  · webbench

  性能指标

  常见性能指标

  业务指标:并发数、吞吐量、响应时间

   并发数。是指系统同时处理的请求数,对于互联网系统而言,一般就是指同时访问系统的用户数。

   吞吐量(QPS 的最大值):是指单位时间内系统处理请求的数量,体现的是系统的处理能力。我们一般用 TPS、 QPS 这样的指标来衡量。吞吐量还有平均吞吐量、峰值吞吐量、最低吞吐量之分。

  响应时间:一次事务的处理时间。通常指从一个请求发出,到服务器进行处理后返回,再到接收完毕应答数据的时间间隔。一般有平均响应时间、P95、P99 之分。

  响应时间和吞吐量要达到一个平衡点,随着吞吐量的增加,响应时间会先维持一个点,然后会开始迅速加大,随之而来的是吞吐量也很难上去了。我们对响应时间是有要求的,因此我们不能只追求吞吐量,一定是在一个合理的响应时间内找到最大的吞吐量。

  响应时间一定是在成功率的基础上的, 如果出现失败,那么这个响应时间是无效的。成功率一般要 100%。

  他们之间的关系是:

  QPS(TPS)= 并发数 / 平均响应时间  

  吞吐量理论值 = 并发数 / 平均响应时间

  并发数 = QPS*平均响应时间

  系统资源:CPU空闲率、内存使用、网络IO、磁盘读写量、句柄数等

  性能计数器,指的是服务器或者操作系统性能的一些指标数据,包括系统负载 System Load、对象和线程数、内存使用、CPU 使用、磁盘和网络 I/O 使用等指标。这些指标是系统监控的重要参数,反映系统负载和处理能力的一些关键指标,通常这些指标和性能是强相关的。这些指标很高,成为瓶颈,通常也预示着性能可能会出现问题。

  最优的方式是采用百分比

  参考 平均值是不靠谱的,最为正确的统计做法是用百分比分布统计 一文,最佳实践经验是采用百分比。比如 Top Percentile(TP)指标 ,TP50的意思是指 50%的请求都小于某个值,TP90表示90%的请求小于某个时间。

  压测观察指标

  不管是哪种压测类型,压测要观察的指标一般需要包括:

  ·成功率、失败率

  · 系统资源(CPU、内存、带宽、IO)

  · 响应时间,平均响应时间、P95/P99响应时间,一定要关注 P95 和 P99,不能只看平均时间,P99 时间可以较好的去判别线上用户的时间体验

  · 吞吐量(QPS/TPS)

  一个基本的压测数据示例如下:

正在上传…重新上传取消

  生成严谨的压测报告

  我们分析系统性能问题,需要找准要点,这就要求我们的压测报告要确实有效,是要非常严谨的,条理清晰, 要一步一步分析出瓶颈,而且要明白为啥到了瓶颈,然后怎么优化?因此就要求我们要输出严谨的压测报告。这里有一些经验:

  压测的时候,要找到一个性能拐点;如果压力一上来就达到瓶颈了,那么还需要往回调一点,直到找到一个最佳的性能拐点。系统性能是一个抛物线形态,到达性能峰值后继续施压会导致性能下降,因此我们压测最重要的就是找到那个最佳的性能拐点。因此整个施压过程逐步施压,到达性能峰值后继续施压,如果继续施压后性能不升反降就说明到了拐点了

  如何分析性能瓶颈,找到 QPS 提升不上去的原因呢?

  QPS 不会一直上升,到某个点后就会持平甚至下降,出现性能拐点,此时就需要开始分析原因。

  具体的方式就是,先抓没有到极限的 profile 情况(cpu,block,io,内存),再抓刚好到极限的,最后抓已经超过极限的,然后分析这几种情况下,到底是哪个系统资源,或者外部接口导致了性能问题。

  如果是某个组件或者外部服务是性能瓶颈点,那么还需要进一步分析下,是不是组件的使用姿势不对?是不是没处理好连接数?不能说一找到某个组件的问题就结束了,还需要进一步更深层的审视下。

  · 分别知道单机和集群能够承载的性能和拐点

  单台机器的最大 QPS 是多少?

  平行扩展后的 QPS 又是多少,是线性增长么?(肯定不会线性增长, 到某个程度后相关资源一定都会出现瓶颈,关键是要找到对应的瓶颈点)

  · 系统资源如何分析,举个 CPU 的例子

  首先看 CPU,如果 CPU 没有跑满,则说明不是 CPU 的问题,就不用关心CPU,然后就要其他的资源如 io, swap, 内存, 网卡等。

  如果有多个 CPU 核心, 则观察每个核心的 cpu 的使用情况,不能光看整体的 CPU 使用率。

  如果 CPU 跑满了,那么抓 CPU 的 profile, 观测看看哪个调用比较耗时。

  做好容量预估

  系统上线前就必须要能够有预估/评估大概, 再通过压测验证, 了解每个细节,包括资源, 依赖关系, 部署情况, 机房分布, 降级策略, 容灾方案, 备用方案

  容量预估是大型系统上线的必备品,因为只有合理的进行容量预估,才能更好的去根据系统要承载的量级去设计我们的系统,容量规划需要尽量做到以最少的机器抗住更多的流量;规划 ok 了之后,我们需要用一些性能压测手段来验证是否符合预期。有了合理的容量规划和评估之后,上线之前去压测系统的时候才能知道我们需要压到什么程度,然后,容量预估并不是拍脑袋的,容量评估需要考虑如下几点:

  1. 得到业务指标,评估总访问量。

  询问产品、运营得到一些 uv、pv等指标。

  2. 评估平均访问量 QPS。

  一天86400秒,一般认为请求发生在白天,即4w秒。

  总量除以总时间,一天算4w秒。

  3. 评估高峰 QPS。

  系统容量规划时,不能只考虑平均 QPS,而是要抗住高峰的 QPS。

  根据业务曲线图来。

  一般高峰 QPS 是平均 QPS 的 3-4 倍。

  4. 评估整个业务体系下各个模块、子系统的相关指标。

  5. 评估系统、单机极限 QPS,评估需要多少机器。

  进行压测和数据分析。

  6. 适当冗余度,对压测得到的结果,我们实际上线后要做点冗余,避免线上实际压力太大导致无法快速扩容。

  做好分析总结

  要做好分析总结,比如:

  这个系统上线后,真能抗的住么 ? 除了有压测的数据,还要有自己有预估。自己的系统,哪些方面可能存在瓶颈, 会导致上线后出问题的? 系统上线前要有充分准备和整体评估/预估。

  系统上线后,万一扛不住怎么解决?是否有限流方案?是否有降级方案?

  系统现在 10w 用户是什么情况? 那么假如 1000w用户的情况, 是不是线性增长呢?需要做些什么考虑呢?

  系统上线前就必须要能够有预估/评估大概, 再通过压测验证, 了解每个细节,包括资源, 依赖关系, 部署情况, 机房分布, 降级策略, 容灾方案, 备用方案

  一些具体 case 的压测方法

  测试数据准备

  高质量的测试数据应当能真实的反映用户的使用场景,我们一般会选择以线上真实数据作为数据源,经过采样、过滤、脱敏,作为性能测试的测试数据。但是在拿真实数据测试之前,必须要先线下模拟测试数据,至少先验证整个系统的基本性能需求后才能拿真实数据做性能测试。

  存储层(数据库和缓存)的压测方法

  针对无状态服务的话,要提高并发能力很容易,可以无脑扩容。但是针对有状态的存储系统,它能支持的最大并发数不是可以无限扩展的,因此我们一定要能够清楚我们的数据存储层能抗多少量,而针对这种存储集群的压测,一般就是:

  · 首先针对单机进行压测

  · 然后再去分析,集群的整体抗量能力,需要注意,集群能够承载的量不是单机的累加值,一般在集群中每增加一台机器,可以采用 80% 递减的方式来粗略评估。

  · 最后需要注意,集群的整体抗量能力需要根据实际情况去达到一个合理的配置,并不是集群中的机器越多越好。压到一个符合预期的值即可。

Jmeter高级性能测试实战

Fiddler接口抓包神器使用教程

软件测试之移动端测试系列

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

软件压力测试和性能测试分析方法论 的相关文章

  • JMeter(活动?)FTP 到 VLTrader

    情况 我正在使用 JMeter 来加载测试我的通信应用程序 Cleo VLTrader 我是 JMeter 的新手 并且能够使 HTTP 通信工作 但不能使 FTP 工作 当我尝试使用 JMeter FTP 请求采样器时 我可以在服务器端看
  • JMeter 框架

    我最近开始学习 JMeter 来对我们的应用程序进行性能测试 我有一个测试计划 jmx 并使用 Jenkins Ant 定期运行它 到目前为止一切都很好 我的问题是 我们有一个关键字驱动的框架 TestNG 等用于功能测试工具 QTP Se
  • 使用Java代码进行Jmeter分布式测试

    我能够使用 Java 代码运行 Jmeter 但如果我想做与分布式测试相同的操作 那么如何在 Java 代码中添加远程引擎 这是一个sample http alvinalexander com java jwarehouse jakarta
  • 在 Jmeter 中使用 JsonPath 和 != 条件从 JSON 中提取一些值

    我有以下 JSON 我需要获取没有 type Jenkins 的实例的 id 值 data id 35002399 6fd7 40b7 b0d0 8be64e4ec09c name 94Jenkins url http 127 0 0 1
  • 增加 JMeter 执行期间的线程数

    我有一个性能测试JMeter并想用它来测试最大系统性能 吞吐量 因此 当错误率低于 2 时 应增加活动线程数 我发现Constant Throughput Timer 把它放入Thread Group但它只会暂停或减慢线程 我尝试将其定义如
  • JMeter 在性能测试期间挂起

    我试图模拟 4 个不同用户的 100 个线程请求 所有 97 个请求均已发送和接收 但其余 3 个请求仍显示为正在执行 我必须手动停止 Jmeter 然后只传递剩余的请求 为什么会发生这种情况 您的计算机可能没有资源来执行请求 或者 Jav
  • 如何在 Groovy 2.4 中计算 sha256 哈希值

    我正在尝试计算 Groovy 版本 2 4 16 中的 sha256 哈希值 这是 jmeter 测试的一部分 这是它支持的 Groovy 版本 我认为我无法更改它 我知道在 Groovy 2 5 中你可以使用这样的代码 https mrh
  • 如何通过java编码生成Jmeter仪表板报告。 (不是 Windows 或 shell 命令)

    我必须通过java编码生成Jmeter仪表板报告 在java代码下面 我用来生成正常的jmeter报告 我必须生成一个 通过java的仪表板报告 public class JMeterFromExistingJMX public stati
  • setEndTime 必须在 setStartTime 之后调用

    尝试使用 JMeter JMS Publisher 推送消息 但低于错误 这是jmeter端错误还是服务器端错误 Error setEndTime must be called after setStartTime java lang Th
  • 我有 JSR233 监听器,它在 JMeter 非 GUI 模式下似乎被忽略

    我在 HTTP 请求下有 JSR233 侦听器 它存储所有响应时间值 创建数组 然后对数组进行排序以查找 90 行 然后在达到最终 90 行阈值时标记最后一个事务 请求通过或失败 GUI 中的一切都运行完美 但我使用 Docker Imag
  • 使用参数作为用户定义变量?

    我们在非 GUI 模式下运行测试 并传入各种参数 如服务器 端口 线程等 我们还希望在 GUI 模式下运行测试 并能够在 GUI 中更改这些参数 我想做的是使用 2 个用户定义的变量对象 其中一个包含我们可以编辑的静态数据 另一个包含参数
  • 通过 Jmeter 从 Phantomjs 收集客户端性能指标

    在整个 PhantonJS 驱动程序配置中 我们有什么方法可以通过 phantomjs 使用 Jmeter DomLoad WindLoad ResourceCount 资源大小来捕获以下客户端性能指标 Thanks 我建议使用捕获指标WD
  • 手动设置Jmeter主目录

    根据这个帖子 http jmeter 512774 n5 nabble com Automatic generation of aggregate reports td4281459 html Jmeter home被自动检测到 有没有办法
  • XPath JMeter 断言:错误“前缀必须解析为命名空间”

    我正在尝试使用JMeter XPath 断言 https jmeter apache org usermanual component reference html XPath Assertion使用 XPath 断言命令对标签值进行如下操
  • 在 JMeter 中,“将响应保存到文件”中,如何在将自定义后缀附加到文件名末尾的同时增加文件名

    在 JMeter 中 当使用 将响应保存到文件 来存储 http 响应时 如何在将自定义后缀附加到文件名末尾的同时增加文件名 这是我的场景 使用记录控制器和 HTTP S 测试脚本记录器记录文件转换和从网站下载的 http 流量 然后 我将
  • 如何从后处理器获取父控制器的名称

    我的 Jmeter 项目结构如下所示 我有一个 Beanshell 后处理器作为子节点 如何获取父控制器的名称 简易控制器01 来自 BeanShell 后处理器 非常感谢您的帮助 Thread Group Simple Controlle
  • jmeter 侦听器每秒点击次数和复合图生成的图表不正确

    学习使用 jmeter 并在读取图形侦听器输出时遇到问题 creating Thread group with number thread 8 ram up 1 and loop forever 随着时间的推移添加侦听器活动线程 每秒点击次
  • 如何使用 jmeter 中的 beanshell 预处理器删除空参数

    我正在尝试读取一个包含超过 500 行的 csv 文件 每一行都将作为对 API 的请求 现在我的问题是某些参数有空字符串 我想设置一个条件 以防参数返回空字符串 然后在调用 API 之前从请求正文中预先删除该参数 下面是我的json bo
  • Jmeter 线程真的接近用户吗?

    我正在尝试使用记录控制器设置 JMeter 负载测试 这会导致 Web 浏览器进行的所有调用重复 包括 css 文件 js 文件和图像 假定 Web 浏览器会同时获取这些内容 同时执行大约 10 个 Web 请求 jmeter 文档倾向于将
  • 如何更改JMeter HTTP请求中Post Body的内容

    请原谅我的无知 因为我是一个jmeter菜鸟 我的 web 服务接受 JSON 对象 因此我能够编写一个基本测试 在该测试中我在 http 请求的 Post Body 部分中使用 JSON 对象创建一个 HTTP 请求 不管怎样 我想要做的

随机推荐

  • 冒泡排序+怎么计算时间复杂度

    冒泡排序的基本思想 时间复杂度为O N 2 每次比较两个相邻元素 如果他们的顺序错误就把它们交换过来 举个栗子 例如我们需要将 12 35 99 18 76 5个数进行从大到小排序 既然是从大到小排序 也就是越小越靠后 首先比较第一个数和第
  • vue组件props传值,对象获取不到的问题

    先说问题 父组件利用props向子组件传值 浏览器console有这个值 但是获取不到内部的属性 困了我3个小时 真的 父组件定义了personal这个值 在父组件接口中给这个值重新赋值 子组件接受这个值 浏览器console能看到这个值
  • 韩国100m无限流量服务器,CloudCone:$59/月独立服务器/X3363/8GB/2TB/100M无限流量/洛杉矶机房...

    Intel Xeon X3363 4 Cores 2 83 GHz 8GB RAM 2 TB HDD or 240 GB SSD 100 Mbps Unmetered 29 IPv4 5 IPs 64 IPv6 69 MO Limited
  • Spring Boot 如何处理国际化

    Spring Boot 国际化 在全球化的今天 很多应用程序需要支持多种语言和地区 为了满足不同用户的需求 应用程序需要提供多语言的支持 Spring Boot 提供了强大的国际化支持 使得开发人员能够轻松地为应用程序添加多语言支持 本文将
  • Flutter的Stack和Positioned的控件

    简介 Flutter中的Stack控件是一种可用于将多个子控件重叠在一起的布局控件 Stack将所有子控件放在同一个位置 它们可以根据需要进行定位 缩放或旋转 Stack中的子控件可以是任何类型的控件 例如文本 图像 按钮等 主要属性 St
  • ImageRewrad

    ImageReward Learning and Evaluating Human Preferences for Text to Image Generation https arxiv org pdf 2304 05977 pdf ht
  • 雪花算法实现

    文章目录 原理 引入依赖 SnowflakeManager 生成ID SnowflakeProperties 配置 注册SnowflakeManager snowflake的yaml 测试 原理 分别有三部分 其中第一位保留位 暂时没用 第
  • C++全局变量被多次析构导致程序崩溃的问题

    问题描述 1 在静态库libxxx a中定义了一个全局的string对象 2 有多个so文件都连接了这个静态库 并且引用了这个全局变量 3 有一个程序同时加载了多个上述的so文件 4 在这个程序退出时 全局的string就会被多次析构 5
  • vue正式环境与测试环境压包配置方法

    1 安装cross env cnpm install save dev cross env package json配置修改 这里分别添加env config prod env config dev来控制当前的压包环境 package js
  • 互联网网站的反爬虫策略浅析

    因为搜索引擎的流行 网络爬虫已经成了很普及网络技术 除了专门做搜索的Google Yahoo 微软 百度以外 几乎每个大型门户网站都有自己的搜索引擎 大大小小叫得出来名字得就几十种 还有各种不知名的几千几万种 对于一个内容型驱动的网站来说
  • org.springframework.context.annotation.ConflictingBeanDefinitionException异常处理

    问题描述 项目启动时 报了这个错 org springframework context annotation ConflictingBeanDefinitionException 标记为Bean类 com gaotai zhxy prop
  • 在vmware环境下安装ubuntu

    在vmware环境下安装ubuntu18 04 1 下载VMware workstation16 2 下载ubuntu 18 04 5 3 安装vmware 创建虚拟机 一 VMware workstation16 下载链接 https p
  • 10、CLASSIFIER-FREE DIFFUSION GUIDANCE

    简介 论文 https arxiv org pdf 2207 12598 pdf 分类器指导将扩散模型的得分估计与图像分类器的梯度相结合 因此需要训练与扩散模型分开的图像分类器 实验证明 在没有分类器的情况下 指导确实可以由纯生成模型执行
  • sed全文字符串替换

    sed i s 被替换的内容 要替换成的内容 file sudo sed i s archive ubuntu mirrors aliyun etc apt sources list
  • 抖音rpc调用生成x-gorgon、x-argus签名学习记录

    一 通过jadx gui分析apk 找到签名入口函数如下 先hook下这个函数 能看到有结果 接下来就是构造参数模拟调用就行 有两个参数 第一个是url的拼接 第二个是headers里面的一些参数构成的map 这个参数每个接口可能不一样 我
  • 若依ruoyi改皮肤-主题(二)

    一 风格等基础设置 有深色和浅色风格两种 根据设计图考虑是否需要 如果不需要 去掉一种风格 这里以浅色风格为主 在 布局设置 里 可以设置主题风格 深浅 主题颜色 直接下拉修改主色 隐藏菜单 顶部标签等等 如果想在css里修改 1 主题风格
  • 30套JSP网站源代码合集

    JSP技术是以Java语言作为脚本语言的 JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序 我收集了一些JSP开发的网站源代码 从实践中学习 希望对大家有用 资料名称 下载地址 网上购物系统 jsp mysq
  • 原根

    定义 在数论 特别是整除理论中 原根是一个很重要的概念 对于两个正整数 由欧拉定理可知 存在正整数 比如说欧拉函数 即小于等于的正整数中与互素的正整数的个数 使得 由此 在时 定义对模的指数 为使 成立的最小的正整数 由前知 一定小于等于
  • nodejs接收form-data数据

    nodejs接收form data类型的数据 不能使用body parser来解析接收 multiparty有多个监听方法 这只是其中一种 var multiparty require multiparty var fs require f
  • 软件压力测试和性能测试分析方法论

    压测和性能分析方法论 性能测试基础 性能测试的常见分类 性能测试 用来验证系统的性能是否满足设计的预期 一般来说对系统的压力会比较小 不会压垮系统 只是进行简单的验证 负载测试 通过不断施加负载压力 寻找系统最优的处理能力 最好的性能状态