前一段时间,公司做了压测的技术分享,感觉收获很多,于是将其中的核心内容进行总结整理,有不妥之处望多多指正!

不过在网上搜索压力测试,多半会出现这样的图,莫名笑哭

目录

什么是压力测试?

压力测试的目的

一、压力测试优化原则

三个要

三个不要

二、压力测试优化策略

1.时空转换:空间换时间、时间换空间

2.并行/异步操作:并行操作、异步操作

3.预先/延后处理:预先/提前处理、延后/惰性处理

4.缓存/批量合并:缓存数据和结果、合并和批处理

5.算法设计和数据结构:更快的算法设计,更优化的数据结构


什么是压力测试?

(软件)压力测试就是对系统不断施压,从而确定一个系统的瓶颈或者不能接收的性能点。

压力测试的目的

压测的目的是为了观察当前系统的负载能!压测的结果一般情况可以通过吞吐量与并发数的比例来观察,吞吐量与并发数呈正相关关系,同时,在不同场景下的压测方案和技巧也是不一样的。尤其在银行某些特色场景下,压力测试的方案也具有一定的场景特色。


一、压力测试优化原则

压力测试优化原则总结起来就是:三个不要三个要

三个要

1.要查最大性能瓶颈

找到最大的性能瓶颈,解决后,这个系统的性能会得到最大的提升。

2.确诊问题根因

确定了最大的性能瓶颈后,就需要对这一性能瓶颈做彻底分析,找出资源不够使用的原因

3.考虑多种情况

找多个解决方案,分析不同方案的优缺点,再找出最好的解决方案

三个不要

1.不要过度反常态优化

追求最合适的性价比,在满足要求的情况下,尽量不要做过度优化,过度优化会增加系统复杂度和维护成本

2.不要过早不成熟优化

过早的优化可能优化错地方,优化的功能可能后续不再使用。

3.不要表面的肤浅优化

优化忌讳表面优化,如果对一个程序和服务没有全局的把握,没有理解底层运行机制,任何优化方案都很难达到最好的效果

二、压力测试优化策略

1.时空转换:空间换时间、时间换空间

1.1 空间换时间的策略

出发点是有些场景时间和速度更重要,这时就可以考虑用空间来换时间。 优化场景和方法:

  • 通过缓存服务,将查询数据缓存起来,提高查询响应时间;
  • 将静态文件信息存放在CDN;
  • 提前将需联机查询的数据宽表加工好,联机查询直接查询宽表;

1.2 时间换空间的策略

出发点是内存和存储这样的“空间”资源,有时会成为稀缺资源要尽量减少占用的 空间。 此时采用内部排序不可取,最好是需要外部排序,因为面对大量用户时,不会考虑极耗内存的内排。优化场景和方法:

  • 改变应用程序本身的数据结构,减少需要存储的数据的大小;
  • 压缩存在内存中的数据,采用某种压缩算法,真正使用时再解压缩;
  • 把一些内存数据,存放到外部存储,需要时再取回来。这一点的实现经常是利用MQ 进行推送。

2.并行/异步操作:并行操作、异步操作

2.1 并行操作策略

对于资源充沛的情况下对于无状态任务可以通过并行处理提高处理效率。因为一般情况下,如果接口采用顺序调用,则耗时,客体验很差。 优化场景和方法:

  • 批量场景下为了降低批处理的时间,一般会对数据加工进行并行处理,MR就是典型的应用场景, 在日常批量作业过程中还有很多这个思路的优化方法; 这个场景在银行多见,目前很多大行都是并行跑批,否则影响开业;
  • 联机组合交易子交易并行发起处理,常用的有JUC的fork/join、RXJava,此类子交易并行操作的前 提是子交易之间是无依赖可并行执行; 组合交易这一点对于渠道中台是很重要的。需要注意的是,RXjava理解起来比较困难,安卓也经常会用到这个,因为常常会用到十几个接口;folk/join则编程量比较大;
  • 在IO阻塞比较厉害的交易场景下,也是非常适合多线程并行操作,这时候CPU基本上是空闲状态, 多线程可以充分利用CPU资源。此处所说的IO不仅仅是磁盘的IO,也涉及网络IO。可以异步写日志,当然比较好的方式是用queue去写,可以推到kafka里面。

2.2 异步操作策略

异步操作指函数马上返回,等有了数据结果后再通知函数,那么这就是异步。 优化场景和方法:

  • 对于一些不需要实时返回结果的业务场景可以通过异步回调或交易结果轮循查证的方式完成异步操 作,这样可以大幅度提高服务端的吞吐量,例如三方代扣交易、授信申请交易等耗时交易; 轮询方式是比较差的,比较好的办法是异步回调,压测里面是否采用异步回调,会在性能上差别数十倍;
  • Web容器,NIO和AIO模式下广义的说都属于异步操作,容器内部先将交易接收落地,然后根据交易类型进行异步操作,最后将结果返回;NIO是准异步思想。

3.预先/延后处理:预先/提前处理、延后/惰性处理

3.1 预先/提前处理策略,主要用于优化那些需要极致用户体验,联机交易实时响应特别高的场景,例如融 资授信场景,如果要做到秒批,那必须要提前通过批量的形式对用户做预授信。 (有些银行目前未作预授信,只有用户申请后才能跑信息,主要是考虑成本,只有将用户信息全部录入,才开始跑模型)

优化场景和方法:

  • CPU和内存也有相应的预取操作,将内存中的指令和数据,提前存放到缓存中,从而加快处理器执行速度;
  • 提前将磁盘数据读取到高速存储上,为接下来的数据读取做准备。这可以明显减少磁盘请求数量, 从而提升读数据的性能;一般应对方法是会把最热的数据放在内存里,次热的数据放在SSD,冷数据放在机械硬盘,这属于动态调整。有些银行可能会采用云上是SSD,云下是机械,两者性能差异是很大的。
  • 通过批量的形式提前对数据进行预处理,对于预处理完成的数据可用于联机交易;

3.2 延后/惰性处理策略

主要针对那些操作比较耗时,但是对联机业务又无明显影响的交易可以进行此类 优化,此类优化类似于分布式BASE理论。 优化场景和方法:

  • 通过消息队列的形式在业务联机交易过程中将其中不影响实时用户体验的交易放入队列延后处理, 从而降低交易核心功能的响应时间; 一般电商都是异步处理,放在queue。这类处理方式一般放在金融场景会很多。
  • copy on write,不只是指操作系统和Java里的cow写时复制,更多的是一种延后写的思想;这是乐观锁的体现。如果是自己去实现这一点,则可以加版本号或者时间戳,来实现人工的乐观锁,尤其是在写余额的时候,常用到这个。

4.缓存/批量合并:缓存数据和结果、合并和批处理

4.1 缓存数据策略

在性能优化下使用非常频繁,CPU、内存、文件系统、存储、内容发布、数据库等都 会用到缓存策略。 优化场景和方法:

  • 针对于数据时效性要求没那么高的并且读交易占比高的场景,特别适合使用缓存数据策略; 常常要将这些和业务场景结合在一起。例如电商高并发库存扣减、秒杀场景,之后再反刷库存。高并发写数据,都是先刷缓存数据,之后再刷新数据库源数据,读操作则恰恰相反;
  • web应用服务使用缓存场景比较常见,前端有浏览器缓存,公网有CDN缓存,前置web有反向代理 提供静态资源缓存,后端还有服务器本地缓存; 这里需要慎重考虑多级缓存,缓存级越多,则说明数据不一致性也越高。
  • 对每次消耗较大的计算,也可以将计算结果缓存起来,下次可以直接读取结果。

4.2 批量合并处理策略

网络IO、磁盘IO比较多的情况下合并操作和批量操作能大幅提升吞吐量,提高性能。优化场景和方法:

  • 文件批处理,对于多次IO处理的业务场景,可以把操作合并成一次读写数据。这样可以减少读写时 间和协议负担; 银行业务常喜欢用到存储过程,尽管是存在很多问题,但是因为它能较好的利用IO。因为IO一次,一个数据和多个数据所需要的时间是差不多的(OS和计组知识),但是数据量总是能差成百上千倍。因此这时候就可以把相关数据划分在一起,从而减少了IO次数。
  • 对数据库的读写操作,尽量合并操作,数据库每次访问磁盘的容量需根据业务场景进行设置,大部分数据库默认一次逻辑读是8k; (SQL优化方面可以关注逻辑读,这涉及读的快慢)但是批量场景不一定是越少越好,有可能也是越多越好,说明把IO充分利用到了。
  • 频繁网络请求,网络传输的时间可能远大于请求处理的时间,所以合并网络请求也是合并处理的优 化方案;这个也需要考虑业务场景。

5.算法设计和数据结构:更快的算法设计,更优化的数据结构

5.1 先进的算法策略

对于一些使用频率高的业务场景,可以通过更先进高效的算法进行优化。

5.2 高效的数据结构

没有一个数据结构是在所有情况下都是最好的,不同的基础数据结构在添加元素、 删除元素、查询元素、遍历耗时等,要权衡利弊,找出最适合的高效的数据结构。这个也要和业务场景关联起来,不同数据结构在不同场景有不同的长处。

压力测试技术策略总结(入门篇)相关推荐

  1. 大数据技术之Canal入门篇

    大数据技术之Canal入门篇 文章目录 大数据技术之Canal入门篇 写在前面 第 1 章 Canal 入门 1.1 什么是 Canal 1.2 MySQL 的Binlog 1.2.1 什么是 Bin ...

  2. linux测试怎样看,linux入门篇:如何查看centos版本

    3DX'yd2m0 51Testing软件测试网]]j.H ji*N4NjG!kg 51Testing软件测试网8t`$ou?WcE --写在开始--4A@5RtP0 服务器入门篇-4z(vc*{V( ...

  3. 前端测试 —— 技术选型及入门

    目录 为什么要撰写前端的测试? 前端测试的类型 技术选型 结构介绍 为什么要撰写前端的测试? 在前端发展日益壮大后,我们在项目中往往引入了工程化.模块化的概念,这和数年前前端极度依赖后端渲染以及切图工 ...

  4. 1000入门测试题目-c++语言入门篇-信息学奥赛一本通

    hello everyone,I'm 小羊羔! 我最近发了个动态,概括一下就是<关于我跟我的朋友们比竟然是个渣渣这件事> 作为一个合格的内卷人,我要开始进行终极学习法-费曼学习法:&quo ...

  5. 学习版pytest内核测试平台开发万字长文入门篇

    前言 2021年,测试平台如雨后春笋般冒了出来,我就是其中一员,写了一款pytest内核测试平台,在公司落地.分享出来后,有同学觉得挺不错,希望能开源,本着"公司代码不要传到网上去,以免引起 ...

  6. 借助模糊测试 深耕细作你的压力测试

    模糊测试(Fuzz Testing)一直被黑客们广泛使用,却很少应用于商业软件系统开发过程中.在互联网安全产业,如何让模糊测试重新焕发活力,是我一直在思考的问题. 概念及目的 在计算机领域,模糊测试是 ...

  7. 整机压力测试_一种服务器整机压力的测试方法

    一种服务器整机压力的测试方法 [专利摘要]本发明公开了一种服务器整机压力的测试方法,根据测试内容,配置服务器:安装操作系统,准备测试工具IntelWindowsValidationStressSuit ...

  8. 转载:Jmeter压力测试教程(入门篇)

    前言 Jmeter 是Apache组织开发的基于Java的压力测试工具,开源并且支持多个操作系统,是一款很好的HTTP测试工具.本篇文章主要的目的是帮助没有接触过Jmeter的人快速上手,迅速掌握Jm ...

  9. jmeter压力测试_如何使用Jmeter进行压力测试?这篇入门讲解拿去不谢!

    一.下载安装jmeter 这里不多说了,大家可以自行下载. 二.运行jmeter.bat 在bin目录下,使用管理员方式运行jmeter.bat 随之会打开jmeter的GUI界面,注意不要关闭运行的 ...

最新文章

  1. .net 基元类型,引用类型和值类型
  2. 附件下载,中文文件名乱码如何解决???
  3. Java JUC工具类--Exchanger
  4. 【英语学习】【Daily English】U09 Fashion L01 Which one do you think suits me better?
  5. registry:NoSuchMethodError zookeeper.server.quorum.flexible.QuorumMaj
  6. c# 执行js的方法
  7. 典型的异步服务器端套接字构建
  8. zttp php,php常用插件
  9. 三维重建笔记_光束平差法(Bundle Adjustment, BA)
  10. Atitit 转移特效attilax总结
  11. 自动驾驶 6-3 几何横向控制 - Stanley Geometric Lateral Control - Stanley
  12. 在和弦上进行旋律创作(不断更新)
  13. 多目标优化算法之SPEA2
  14. 用python画多来a梦-Python—turtle画图(哆啦A梦)
  15. 如何用Windows自带画图工具将图片设置成透明背景
  16. python中将字符变为大写_Python实现将字符串的首字母变为大写,其余都变为小写的方法...
  17. 计算机管理映像路径,手把手教你解决win7系统任务管理器显示映像路径的恢复办法...
  18. colorkey唇釉是否安全_colorkey唇釉真假辨别_colourkey唇釉真伪
  19. 祥云杯2022 writeup
  20. 静态ip和动态ip的区别能说明什么?怎么根据区别选择?

热门文章

  1. 博客园鼠标点击特效、自定义背景、看板娘等
  2. 毕业总结:工欲善其事 必先利其器(公开版)(更新中)
  3. 数据解读:为什么有人排队8小时,只为了喝一杯茶颜悦色?
  4. htc vive漂亮的激光线效果
  5. CCIE-IPV6单播和组播地址
  6. 搭建Nginx+rtmp直播服务器
  7. 优化C语言代码常用的几招
  8. auditd日志分析方法
  9. 机器学习——数据仓库与数据挖掘——期末复习(简答题)
  10. 【有限元分析】卷扬机卷筒心轴静力学分析