目录
8、go-stress-testing go语言实现的压测工具
go-stress-testing 对 Golang web 压测
前言
本文介绍压测是什么,解释压测的专属名词,教大家如何压测。介绍市面上的常见压测工具(ab、locust、LoadRunner、Jmeter、go实现的压测工具、云压测),对比这些压测工具,教大家如何选择一款适合自己的压测工具。
一、压测是什么?
- 压测,即压力测试,是确立系统稳定性的一种测试方法,通常在系统正常运作范围之外进行,以考察其功能极限和隐患。
- 是一种评估系统性能和稳定性的方法,通过模拟实际负载条件来测试系统的响应能力。
- 其次,压力测试的目的是发现系统在高负载下的瓶颈和性能问题,以便进行优化和改进。
- 最后,压力测试应该在控制环境中进行,并且需要事先制定明确的测试计划和指标
二、为什么要压测?
- 压测的目的就是通过压测(模拟真实用户的行为),测算出机器的性能(单台机器的QPS),从而推算出系统在承受指定用户数(100W)时,需要多少机器能支撑得住
- 压测是在上线前为了应对未来可能达到的用户数量的一次预估(提前演练),压测以后通过优化程序的性能或准备充足的机器,来保证用户的体验。
三、 压测名词解释
1、压测类型解释
压测类型 | 解释 |
---|---|
压力测试(Stress Testing) | 也称之为强度测试,测试一个系统的最大抗压能力,在强负载(大数据、高并发)的情况下,测试系统所能承受的最大压力,预估系统的瓶颈 |
并发测试(Concurrency Testing) | 通过模拟很多用户同一时刻访问系统或对系统某一个功能进行操作,来测试系统的性能,从中发现问题(并发读写、线程控制、资源争抢) |
耐久性测试(Configuration Testing) | 通过对系统在大负荷的条件下长时间运行,测试系统、机器的长时间运行下的状况,从中发现问题(内存泄漏、数据库连接池不释放、资源不回收) |
2、压测名词解释
压测名词 | 解释 |
---|---|
并发(Concurrency) | 指一个处理器同时处理多个任务的能力(逻辑上处理的能力) |
并行(Parallel) | 多个处理器或者是多核的处理器同时处理多个不同的任务(物理上同时执行) |
QPS(每秒钟查询数量 Query Per Second) | 服务器每秒钟处理请求数量 (req/sec 请求数/秒 一段时间内总请求数/请求时间) |
事务(Transactions) | 是用户一次或者是几次请求的集合 |
TPS(每秒钟处理事务数量 Transaction Per Second) | 服务器每秒钟处理事务数量(一个事务可能包括多个请求) |
请求成功数(Request Success Number) | 在一次压测中,请求成功的数量 |
请求失败数(Request Failures Number) | 在一次压测中,请求失败的数量 |
错误率(Error Rate) | 在压测中,请求成功的数量与请求失败数量的比率 |
最大响应时间(Max Response Time) | 在一次压测中,从发出请求或指令系统做出的反映(响应)的最大时间 |
最少响应时间(Mininum Response Time) | 在一次压测中,从发出请求或指令系统做出的反映(响应)的最少时间 |
平均响应时间(Average Response Time) | 在一次压测中,从发出请求或指令系统做出的反映(响应)的平均时间 |
3、机器性能指标解释
机器性能 | 解释 |
---|---|
CPU利用率(CPU Usage) | CPU 利用率分用户态、系统态和空闲态,CPU利用率是指:CPU执行非系统空闲进程的时间与CPU总执行时间的比率 |
内存使用率(Memory usage) | 内存使用率指的是此进程所开销的内存。 |
IO(Disk input/ output) | 磁盘的读写包速率 |
网卡负载(Network Load) | 网卡的进出带宽,包量 |
4、访问指标解释
访问 | 解释 |
---|---|
PV(页面浏览量 Page View) | 用户每打开1个网站页面,记录1个PV。用户多次打开同一页面,PV值累计多次 |
UV(网站独立访客 Unique Visitor) | 通过互联网访问、流量网站的自然人。1天内相同访客多次访问网站,只计算为1个独立访客 |
四、如何计算压测指标
-
压测我们需要有目的性的压测,这次压测我们需要达到什么目标(如:单台机器的性能为 100QPS?网站能同时满足100W人同时在线)
-
可以通过以下计算方法来进行实际需求计算:
-
压测原则:每天80%的访问量集中在20%的时间里,这20%的时间就叫做峰值
-
公式: ( 总PV数
*
80% ) / ( 每天的秒数*
20% ) = 峰值时间每秒钟请求数(QPS) -
机器: 峰值时间每秒钟请求数(QPS) / 单台机器的QPS = 需要的机器的数量
-
假设:网站每天的用户数100W UV(用户日流),每天的用户的访问量约为3000W PV(浏览次数),这台机器的需要多少QPS?
( 30000000*0.8 ) / (86400 * 0.2) ≈ 1389 (QPS)
( 总PV数
*
80% ) / ( 每天的秒数*
20% ) = 峰值时间每秒钟请求数(QPS)
- 假设:单台机器的的QPS是69,需要需要多少台机器来支撑?
1389 / 69 ≈ 20台
五、常见的压测工具
1、JMeter
- 简介
Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。
- 安装
可参看博主的同站文章,里面有相吸的JMETER安装教程如何压测?【压测工具:提升系统性能的利器】,查看TPS,计算TPS,计算压测指标、压测名词解释
- 用法
JMeter的功能过于强大,这里暂时不介绍用法,可以查询相关文档使用(参考文献中有推荐的教程文档)
2、LoadRunner
- 简介
LoadRunner是一款常用的应用性能测试工具,它可以模拟多种负载情况,测试应用在不同负载下的性能表现,帮助开发人员发现和解决应用性能问题。LoadRunner支持多种协议,包括HTTP、HTTPS、FTP、SMTP等,可以对Web应用、桌面应用、移动应用等进行测试。它可以模拟多种用户行为,包括登录、搜索、购物、下单等,可以对应用的各个方面进行测试,包括响应时间、吞吐量、并发用户数等。LoadRunner是一款功能强大的性能测试工具,可以帮助开发人员提高应用的性能和稳定性。
- LoadRunner负载测试的流程
- Plan the load test 计划负载测试
- Create Vuser scripts 创建脚本
- Define the scenario 定义场景
- Running Scenarios 运行场景
- Analyze the results 分析结果
- 用法
LoadRunner用法介绍篇幅较长,这里不过多介绍,网上有很多详细的使用教程,大家感兴趣可以去了解一下,对于代码较弱的同学非常友好
3、Locust
- 简介
是非常简单易用、分布式、python 开发的压力测试工具。有图形化界面,支持将压测数据导出。
- 安装
# pip3 安装locust
pip3 install locust
# 查看是否安装成功
locust -h
# 运行 Locust 分布在多个进程/机器库
pip3 install pyzmq
# webSocket 压测库
pip3 install websocket-client
- 用法
from locust import HttpUser, TaskSet, task
# 定义用户行为
class UserBehavior(TaskSet):
@task
def baidu_index(self):
self.client.get("/")
class WebsiteUser(HttpUser):
task = [UserBehavior] # 指向一个定义的用户行为类
min_wait = 3000 # 执行事务之间用户等待时间的下界(单位:毫秒)
max_wait = 6000 # 执行事务之间用户等待时间的上界(单位:毫秒)
- 启动压测
locust -f test.py --host=https://www.baidu.com
配置完成后访问进入压测首页
http://localhost:8089http://localhost:8089
Number of users to simulate 模拟用户数
Hatch rate (users spawned/second) 每秒钟增加用户数
点击 “Start swarming” 进入压测页面
压测界面右上角有:被压测的地址、当前状态、RPS、失败率、开始或重启按钮
性能测试参数
-
Type
请求的类型,例如GET/POST -
Name
请求的路径 -
Request
当前请求的数量 -
Fails
当前请求失败的数量 -
Median
中间值,单位毫秒,请求响应时间的中间值 -
Average
平均值,单位毫秒,请求的平均响应时间 -
Min
请求的最小服务器响应时间,单位毫秒 -
Max
请求的最大服务器响应时间,单位毫秒 -
Average size
单个请求的大小,单位字节 -
Current RPS
代表吞吐量(Requests Per Second的缩写),指的是某个并发用户数下单位时间内处理的请求数。等效于QPS,其实可以看作同一个统计方式,只是叫法不同而已。
4、Apache Benchmark(ab)
- 简介
Apache Benchmark 是 Apache 服务器自带的一个web压力测试工具,简称 ab。ab 又是一个命令行工具,对发起负载的本机要求很低,根据 ab 命令可以创建很多的并发访问线程,模拟多个访问者同时对某一 URL 地址进行访问,因此可以用来测试目标服务器的负载压力。总的来说 ab 工具小巧简单,上手学习较快,可以提供需要的基本性能指标,但是没有图形化结果,不能监控。
ab 属于一个轻量级的压测工具,结果不会特别准确,可以用作参考。
- 安装
# 在linux环境安装
sudo yum -y install httpd
- 用法
Usage: ab [options] [http[s]://]hostname[:port]/path
用法:ab [选项] 地址
选项:
Options are:
-n requests #执行的请求数,即一共发起多少请求。
-c concurrency #请求并发数。
-s timeout #指定每个请求的超时时间,默认是30秒。
-k #启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求。默认时,不启用KeepAlive功能。
- 压测命令
# 使用ab压测工具,对百度的链接 请求100次,并发数1
ab -n 100 -c 1 https://www.baidu.com/
压测结果
~ >ab -n 100 -c 1 https://www.baidu.com/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking www.baidu.com (be patient).....done
Server Software: BWS/1.1
Server Hostname: www.baidu.com
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128
Document Path: /
Document Length: 227 bytes
Concurrency Level: 1
Time taken for tests: 9.430 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 89300 bytes
HTML transferred: 22700 bytes
Requests per second: 10.60 [#/sec] (mean)
Time per request: 94.301 [ms] (mean)
Time per request: 94.301 [ms] (mean, across all concurrent requests)
Transfer rate: 9.25 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 54 70 16.5 69 180
Processing: 18 24 12.0 23 140
Waiting: 18 24 12.0 23 139
Total: 72 94 20.5 93 203
Percentage of the requests served within a certain time (ms)
50% 93
66% 99
75% 101
80% 102
90% 108
95% 122
98% 196
99% 203
100% 203 (longest request)
-
主要关注的测试指标
-
Concurrency Level
并发请求数 -
Time taken for tests
整个测试时间 -
Complete requests
完成请求个数 -
Failed requests
失败个数 -
Requests per second
吞吐量,指的是某个并发用户下单位时间内处理的请求数。等效于 QPS,其实可以看作同一个统计方式,只是叫法不同而已。 -
Time per request
用户平均请求等待时间 -
Time per request
服务器处理时间
5、云压测
- 简介
顾名思义就是将压测脚本部署在云端,通过云端对对我们的应用进行全方位压测,只需要配置压测的参数,无需准备实体机,云端自动给我们分配需要压测的云主机,对被压测目标进行压测。
云压测的优势:
- 轻易的实现分布式部署
- 能够模拟海量用户的访问
- 流量可以从全国各地发起,更加真实的反映用户的体验
- 全方位的监控压测指标
- 文档比较完善
当然了云压测是一款商业产品,在使用的时候自然还是需要收费的,而且价格还是比较昂贵的~
6、阿里云 性能测试 PTS
- 简介
PTS(Performance Testing Service)是面向所有技术背景人员的云化测试工具。有别于传统工具的繁复,PTS以互联网化的交互,提供性能测试、API调试和监测等多种能力。自研和适配开源的功能都可以轻松模拟任意体量的用户访问业务的场景,任务随时发起,免去繁琐的搭建和维护成本。更是紧密结合监控、流控等兄弟产品提供一站式高可用能力,高效检验和管理业务性能。
阿里云同样还是支持渗透测试,通过模拟黑客对业务系统进行全面深入的安全测试。
7、腾讯云 压测大师 LM
- 简介
通过创建虚拟机器人模拟多用户的并发场景,提供一整套完整的服务器压测解决方案
WeTest 压测大师(Load Master,LM)是简单易用的自动化性能测试平台,为用户提供测试框架及压测环境、创建虚拟机器人模拟产品多用户并发场景,支持 HTTP 或 HTTPS 协议,包括 Web/H5 网站、移动应用、API 、游戏等主流压测场景,适用于产品发布前及运营中的服务器压力测试及性能优化。
性能测试数据图表可视化展示。监控核心性能指标如 TPS、 响应时间、 CPU、内存、 磁盘 IO、 网卡负载压力机性能监测等。支持瞬时并发,均匀压力、长时间稳定性测试。
8、go-stress-testing go语言实现的压测工具
- 简介
go-stress-testing 是go语言实现的简单压测工具,源码开源、支持二次开发,可以压测http、webSocket请求、私有rpc调用,使用协程模拟单个用户,可以更高效的利用CPU资源。
项目地址 GitHub – link1st/go-stress-testing: go 实现的压测工具,ab、locust、Jmeter压测工具介绍【单台机器100w连接压测实战】
- 用法
go-stress-testing 下载地址
clone 项目源码运行的时候,需要将项目 clone 到 $GOPATH 目录下
支持参数:
Usage of ./go-stress-testing-mac:
-c uint
并发数 (default 1)
-n uint
请求数(单个并发/协程) (default 1)
-u string
压测地址
-d string
调试模式 (default "false")
-http2
是否开http2.0
-k 是否开启长连接
-m int
单个host最大连接数 (default 1)
-H value
自定义头信息传递给服务器 示例:-H 'Content-Type: application/json'
-data string
HTTP POST方式传送数据
-v string
验证方法 http 支持:statusCode、json webSocket支持:json
-p string
curl文件路径
-
-n
是单个用户请求的次数,请求总次数 =-c
*-n
, 这里考虑的是模拟用户行为,所以这个是每个用户请求的次数 -
下载以后执行下面命令即可压测
-
使用示例:
# 查看用法
./go-stress-testing-mac
# 使用请求百度页面
./go-stress-testing-mac -c 1 -n 100 -u https://www.baidu.com/
# 使用debug模式请求百度页面
./go-stress-testing-mac -c 1 -n 1 -d true -u https://www.baidu.com/
# 使用 curl文件(文件在curl目录下) 的方式请求
./go-stress-testing-mac -c 1 -n 1 -p curl/baidu.curl.txt
# 压测webSocket连接
./go-stress-testing-mac -c 10 -n 10 -u ws://127.0.0.1:8089/acc
- 完整压测命令示例
# 更多参数 支持 header、post body
go run main.go -c 1 -n 1 -d true -u 'https://page.aliyun.com/delivery/plan/list' \
-H 'authority: page.aliyun.com' \
-H 'accept: application/json, text/plain, */*' \
-H 'content-type: application/x-www-form-urlencoded' \
-H 'origin: https://cn.aliyun.com' \
-H 'sec-fetch-site: same-site' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-dest: empty' \
-H 'referer: https://cn.aliyun.com/' \
-H 'accept-language: zh-CN,zh;q=0.9' \
-H 'cookie: aliyun_choice=CN; JSESSIONID=J8866281-CKCFJ4BUZ7GDO9V89YBW1-KJ3J5V9K-GYUW7; maliyun_temporary_console0=1AbLByOMHeZe3G41KYd5WWZvrM%2BGErkaLcWfBbgveKA9ifboArprPASvFUUfhwHtt44qsDwVqMk8Wkdr1F5LccYk2mPCZJiXb0q%2Bllj5u3SQGQurtyPqnG489y%2FkoA%2FEvOwsXJTvXTFQPK%2BGJD4FJg%3D%3D; cna=L3Q5F8cHDGgCAXL3r8fEZtdU; isg=BFNThsmSCcgX-sUcc5Jo2s2T4tF9COfKYi8g9wVwr3KphHMmjdh3GrHFvPTqJD_C; l=eBaceXLnQGBjstRJBOfwPurza77OSIRAguPzaNbMiT5POw1B5WAlWZbqyNY6C3GVh6lwR37EODnaBeYBc3K-nxvOu9eFfGMmn' \
-data 'adPlanQueryParam=%7B%22adZone%22%3A%7B%22positionList%22%3A%5B%7B%22positionId%22%3A83%7D%5D%7D%2C%22requestId%22%3A%2217958651-f205-44c7-ad5d-f8af92a6217a%22%7D'
- 使用 curl文件进行压测
curl是Linux在命令行下的工作的文件传输工具,是一款很强大的http命令行工具。
使用curl文件可以压测使用非GET的请求,支持设置http请求的 method、cookies、header、body等参数
I: chrome 浏览器生成 curl文件,打开开发者模式(快捷键F12),如图所示,生成 curl 在终端执行命令
生成内容粘贴到项目目录下的curl/baidu.curl.txt文件中,执行下面命令就可以从curl.txt文件中读取需要压测的内容进行压测了
# 使用 curl文件(文件在curl目录下) 的方式请求
go run main.go -c 1 -n 1 -p curl/baidu.curl.txt
-
实现原理
具体需求可以查看项目源码
项目目录结构
|____main.go // main函数,获取命令行参数
|____server // 处理程序目录
| |____dispose.go // 压测启动,注册验证器、启动统计函数、启动协程进行压测
| |____statistics // 统计目录
| | |____statistics.go // 接收压测统计结果并处理
| |____golink // 建立连接目录
| | |____http_link.go // http建立连接
| | |____websocket_link.go // webSocket建立连接
| |____client // 请求数据客户端目录
| | |____http_client.go // http客户端
| | |____websocket_client.go // webSocket客户端
| |____verify // 对返回数据校验目录
| | |____http_verify.go // http返回数据校验
| | |____websokcet_verify.go // webSocket返回数据校验
|____heper // 通用函数目录
| |____heper.go // 通用函数
|____model // 模型目录
| |____request_model.go // 请求数据模型
| |____curl_model.go // curl文件解析
|____vendor // 项目依赖目录
- 用法
go-stress-testing 对 Golang web 压测
这里使用go-stress-testing对go server进行压测(部署在同一台机器上),并统计压测结果
- 申请的服务器配置
CPU: 4核 (Intel Xeon(Cascade Lake) Platinum 8269 2.5 GHz/3.2 GHz)
内存: 16G 硬盘: 20G SSD 系统: CentOS 7.6
go version: go1.12.9 linux/amd64
- go server
import (
“log”
“net/http”
“runtime”
)const (
httpPort = “8088”
)func main() {
runtime.GOMAXPROCS(runtime.NumCPU() – 1)
hello := func(w http.ResponseWriter, req *http.Request) {
data := “Hello, go-stress-testing! \n”w.Header().Add(“Server”, “golang”)
w.Write([]byte(data))return
}http.HandleFunc(“/”, hello)
err := http.ListenAndServe(“:”+httpPort, nil)if err != nil {
log.Fatal(“ListenAndServe: “, err)
}
}
- go_stress_testing 压测命令
./go-stress-testing-linux -c 100 -n 10000 -u http://127.0.0.1:8088/
- 压测结果
- 压测结果示例
并发数 | go_stress_testing QPS |
---|---|
1 | 6394.86 |
4 | 16909.36 |
10 | 18456.81 |
20 | 19490.50 |
30 | 19947.47 |
50 | 19922.56 |
80 | 19155.33 |
100 | 18336.46 |
从压测的结果上看:效果还不错,压测QPS有接近2W(文章开头有对QPS的介绍以及如何计算)
grpc接口压测
添加对grpc接口压测commit
1、启动Server
# 进入 grpc server 目录
cd tests/grpc
# 启动 grpc server
go run main.go
2、对 grpc server 协议进行压测
# 回到项目根目录
go run main.go -c 300 -n 1000 -u grpc://127.0.0.1:8099 -data world
开始启动 并发数:300 请求数:1000 请求参数:
request:
form:grpc
url:grpc://127.0.0.1:8099
method:POST
headers:map[Content-Type:application/x-www-form-urlencoded; charset=utf-8]
data:world
verify:
timeout:30s
debug:false
─────┬───────┬───────┬───────┬────────┬────────┬────────┬────────┬────────┬────────┬────────
耗时 │ 并发数 │ 成功数 │ 失败数 │ qps │最长耗时 │最短耗时 │平均耗时 │下载字节 │字节每秒 │ 错误码
─────┼───────┼───────┼───────┼────────┼────────┼────────┼────────┼────────┼────────┼────────
1s│ 186│ 14086│ 0│34177.69│ 22.40│ 0.63│ 8.78│ │ │200:14086
2s│ 265│ 30408│ 0│26005.09│ 32.68│ 0.63│ 11.54│ │ │200:30408
3s│ 300│ 46747│ 0│21890.46│ 40.84│ 0.63│ 13.70│ │ │200:46747
4s│ 300│ 62837│ 0│20057.06│ 45.81│ 0.63│ 14.96│ │ │200:62837
5s│ 300│ 79119│ 0│19134.52│ 45.81│ 0.63│ 15.68│ │ │200:79119
- 如何扩展其它私有协议?
由于私有协议、grpc 协议 都涉及到代码的书写,所以需要 编写go 的代码才能完成 参考 添加对 grpc 接口压测 commit
六、压测工具的比较
– | Jmeter | LoadRunner | Locust |
Apache Benchmark (ab) | 云压测 | go-stress-testing |
---|---|---|---|---|---|---|
实现语言 | Java | C语言 | Python | C语言 | – | Golang(GO语言) |
UI界面 | 有 | 有 | 有 | 无 | 无 | 无 |
优势 | 并发功能强大、插件丰富,支持生成HTML报告 | 具备丰富且灵活的场景、丰富的报告功能 | 支持分布式、压测数据支持导出 | 使用方便,统计功能强大。 | 更加真实的模拟用户,支持更高的压测力度 | 项目开源,使用简单,没有依赖,支持webSocket压测 |
七、如何选择压测工具
这个世界上没有最好的,只有最适合的,工具千千万,选择一款适合你的才是最重要的
在实际使用中有各种场景,选择工具的时候就需要考虑这些:
-
明确你的目的,需要做什么压测、压测的目标是什么、需求是怎样的?
-
使用的工具你是否熟悉,你愿意花多大的成本了解它,投入的成本与产出?
-
你是为了测试还是想了解其中的原理?
-
工具是否能支持你需要压测的场景、不同的业务流?
总结
本文通过介绍什么是压测,在什么情况下需要压测,通过单台机器100W长连接的压测实战了解Linux内核的参数的调优。如果觉得现有的压测工具不适用,可以自己实现或者是改造成属于自己的自己的工具。以上是个人转载改编加上网络收集的信息编写的,如信息有误,麻烦评论区指出,感谢各位收看!
如果觉得对您或朋友有帮助的话还请点赞收藏走一波。
参考文献
github 搜:link1st 查看项目 go-stress-testing
Jmeter性能测试 入门
转载改编自
GitHub – link1st/go-stress-testing: go 实现的压测工具,ab、locust、Jmeter压测工具介绍【单台机器100w连接压测实战】
今天的文章性能测试压力测试负载测试的区别_性能测试压力测试负载测试的区别分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/79968.html