背景

实际工作中,我们的系统大多没有经过系统化的测试流程,自然在这里,压力测试显然更是无从提起。

什么是压力测试?

对于压力测试,其常和下述两种测试有所混淆:

  1. 性能测试
  2. 负载测试

负载测试、压力测试和性能测试的测试目的不同,但其手段和方法在一定程度上比较相似,所以会弄混是很自然的一件事情。

性能测试

性能测试总体为了获得系统在某种特定的条件下(包括特定的负载条件下)的性能指标数据。

事实上,性能测试对于在前端(特指客户端方面)测试中的比重相对会更大一点,鉴于此内容和本次的主题相差较远,这里不展开赘述。

负载测试、压力测试

我这里习惯将负载测试和压力测试放一起讲,同样的这里还要引入一个容量测试的概念。

首先上述三种测试的目的其实是一致的主要是:

为了发现软件系统中所存在的问题,包括性能瓶颈、内存泄漏等。

当负载测试的最终目的是 获得系统正常工作时所能承受的最大负载 时,那么这种类型的负载测试被称为容量测试。

而负载测试的最终目的是 在何种极限情况下,系统将会崩溃,且系统是否具有自我恢复性,那种这种类型的负载测试被称为压力测试。

简单的讲,容量测试和压力测试时负载测试的两个真子集, 容量测试时基于非破坏性情况下系统的极限负载,压力测试时基于破坏性情况下系统的极限负载。

实际上在项目中的测试,除了压力测试以外,其实容量测试也是需要的,因为我们是希望得知 我们每一个单机使客户能正常使用情况下,所能承受的最大客户量,并且也希望得知,每一个单机的破坏性负载极限,并且系统能够在破坏性负载后能否正常恢复。

如何进行容量测试、压力测试?

如何界定正常用户访问

对于不同的系统,对于用户访问性能的需求是不同的。我先举两个简单的例子:

  1. 静态页面
  2. 具有多重授权跳转的页面

以上两种项目对于页面首屏加载的需求是完全不同的。

对于一个静态页面,通常前端工程师的要求是首屏(1920 * 1080)加载时间是 3 秒 以内,对于 3-5 秒的加载属于尚可接受,一旦某个页面加载时间超过 5 秒,除非你非常想点进去看,否则第一反应就是点掉叉叉

那么对于有多重授权跳转的页面首屏加载的需求是怎么样的呢? 说实话笔者并不知道,也没有相关的文章介绍,但是通常我们在这个时候愿意等待 5 - 7秒 甚至更久。

首先假定环境是这样的 用户需要通过 A.site(检测授权) B.site(授权) A.site(检测访问) C.site(正常访问)

由于是授权,所以每一步都会包含 ssl 那么我们简单算一下到 A 站需要多少时间:

name时间(约)
stalled0.5 ~ 1
DNS lookup10
init connection40 ~ 60
ssl30
request send0.1 ~ 2
TTFB20
Content download0.1 ~ 1

因为这一步只是检测跳转,所以显然这里 Content download 应该不花时间, TTFB 花费的时间应当也不多应该不超过 20 ms

那么总计这一次连接需要花费约 100 ms的时间,那么粗略的估计一下就是约 400 ms,加上零零散散的文件,看起来很慢的样子,

比如如果运用的环境是微信,大家用微信的时候普遍感觉首次打开某些站点或者某些时段打开站点速度会很慢,通常我们在这个时候愿意等待 5 - 7秒 甚至更久。

那基于我们的系统,暂且就认为单个页面 3 秒内就是正常的。

有哪些工具可以使用?

  1. http_load
  2. apache ab
  3. FunkLoad
  4. loadrunner

上述三个工具都是常用的负载测试工具,当然也可以拿来做压力测试。

首先排除 ab ,因为他不支持 https。

对于简单的网页大可以直接使用 http_load 在做测试,当然默认也是不支持https,不过我们可以下载源码自行编译带ssl版本的 http_load。

对于复杂的项目,常见的会使用 loadrunner ,但是我对这个东西的评价是,完全不如阿里家的 PTS

同样需要录制,编写脚本,loadrunner跑的本机, 阿里的 PTS 用的是云服务器,战斗力都不是一个档的。

再者,对阿里服务器做压力测试说实话很担心被阿里评定为攻击行为,此前已有对自己阿里的服务器做渗透攻击的黑客被阿里界定为对阿里云的攻击。

http_load

受限于手头的资源,我还是用用 http_load 为好,不到100k,使用还方便。

首先访问 官网下载链接

下载后解压,先不要急着构建,将 makefile 文件中 12 ~ 16 行注释去除,同时修改 bin 目录文件

# 填写ssl安装地址
SSL_TREE =	/path/to/ssl/tree
SSL_DEFS =	-DUSE_SSL
SSL_INC =	-I$(SSL_TREE)/include
SSL_LIBS =	-L$(SSL_TREE)/lib -lssl -lcrypto

linux 用户选择 libssl-dev 一般 linux 家的几个源都有,部分嗨哟预装的

macos用户应当默认包含 openssl ,可以使用如下命令查找 openssl 安装位置

find / -name openssl

当然如果没找到的话也不要费力了用 homebrew 安装一下吧

brew install openssl

然后就可以愉快的使用了

http_load -parallel 5 -fetches 100 ./url

parallel 代表的是并发数量

fetches 代表的是执行次数

100 fetches, 5 max parallel, 1.26864e+07 bytes, in 17.9042 seconds
126864 mean bytes/connection
5.58528 fetches/sec, 708570 bytes/sec
msecs/connect: 101.606 mean, 1034.2 max, 20.557 min
msecs/first-response: 118.972 mean, 228.706 max, 34.546 min
HTTP response codes:
  code 200 -- 100

上述代码我们可以看到,一共执行了100拉取, 17秒内供给访问了 100 次,每秒至多访问 5.5 次, 可见性能并不是太强。

参数说明: 
-parallel 简写-p :含义是并发的用户进程数。 
-fetches 简写-f :含义是总计的访问次数 
-rate    简写-r :含义是每秒的访问频率 
-seconds简写-s :含义是总计的访问时间

最后警告一下! 请不要任意测试线上环境,在高负载下,线上环境有奔溃的可能!

本文标题:压力测试

永久链接:https://iceprosurface.com/2018/03/24/2018/stress-testing/

作者授权:本文由 icepro 原创编译并授权刊载发布。

版权声明:本文使用「署名-非商业性使用-相同方式共享 4.0 国际」创作共享协议,转载或使用请遵守署名协议。

查看源码: