YOLOv8目标检测(七)_AB压力测试
YOLOv8目标检测(一)_检测流程梳理:YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客
YOLOv8目标检测(二)_准备数据集:YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客
YOLOv8目标检测(三)_训练模型:YOLOv8目标检测(三)_训练模型_yolo data.yaml-CSDN博客
YOLOv8目标检测(三*)_最佳超参数训练:YOLOv8目标检测(三*)_最佳超参数训练_yolo 为什么要选择yolov8m.pt进行训练-CSDN博客
YOLOv8目标检测(四)_图片推理:YOLOv8目标检测(四)_图片推理-CSDN博客
YOLOv8目标检测(五)_结果文件(run/detrct/train)详解:YOLOv8目标检测(五)_结果文件(run/detrct/train)详解_yolov8 yolov8m.pt可以训练什么-CSDN博客
YOLOv8目标检测(六)_封装API接口:YOLOv8目标检测(六)_封装API接口-CSDN博客
YOLOv8目标检测(七)_AB压力测试:YOLOv8目标检测(七)_AB压力测试-CSDN博客
为什么要进行压力测试?
评估其在高并发和大负载下的性能表现,确保系统能够在实际使用场景中稳定运行,并找到潜在的瓶颈或优化点。
简单来说:测一测好多人访问调用,这个地址会不会崩掉,速度怎么样。
1.安装AB
Apache Bench(简称 ab)是一个用于测试和评估 Web 服务器性能的命令行工具。它是 Apache HTTP 服务器的附带工具之一,主要用于压力测试和性能分析
命令行输入
sudo apt-get update
sudo apt-get install apache2-utils
这个命令如果不行用
apt-get install apache2-utils -y
可以输入ab看一下是否安装成功,如上图。
2.测试命令
(1)基本并发测试
ab -n 1000 -c 10 <http://example.com/>
(2)POST 请求测试
笔者常用这个,还有一些其他的请求测试,这里不再一一列举。
ab -n 1000 -c 5 -r -p ./tireddrive_abtest.json -T 'application/json' '<http://0.0.0.0:888/predict>'
n 1000
:指定总共发起的请求数。这里是 1000,意味着工具会发送 1000 个请求到目标 URL。c 5
:指定并发请求数。即在同一时刻,最多会有 5 个请求并发执行。这里是 5,表示最多有 5 个并发请求。r
:表示“忽略响应数据”。当使用这个选项时,ab
会忽略服务器返回的响应内容,只关注响应的时间和其他性能指标。这对于性能测试非常有用,因为不需要解析响应内容,节省了计算资源。p ./tireddrive_abtest.json
:指定一个文件,ab
会读取该文件的内容,并将其作为请求的正文(POST 请求的 payload)。tireddrive_abtest.json
文件包含了请求的数据,比如 JSON 格式的数据体。T 'application/json'
:设置请求的Content-Type
头部,这里是application/json
,表示请求正文是 JSON 格式的数据。这通常用于向 API 发送 JSON 数据。'<http://0.0.0.0:888/predict'
:目标> URL,表示将发送请求到http://0.0.0.0:888/predict
。这是你正在测试的 HTTP 服务器地址和路径。
3.如何使用
笔者会测试修改-c和-P这两个参数,这里说明一下-P的文件,通常我会测一个有目标的和一个无目标的。
(1)起服务(参考上一个文章https://blog.csdn.net/weixin_48870215/article/details/144516248?fromshare=blogdetail&sharetype=blogdetail&sharerId=144516248&sharerefer=PC&sharesource=weixin_48870215&sharefrom=from_link)
(2)准备yourfile.json文件
1)准备一张要测试的有目标的图片
2)将图片转为base64格式
这里是笔者常用的将图片转为base64的脚本
import base64
# 打开图片并将其转换为 Base64 编码
with open("D:/Desktop/network_tireddrive (31).jpg", "rb") as image_file:
encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
# 将生成的 Base64 字符串写入到 txt 文件中
with open("D:\\Desktop\\output_base64.txt", "w") as text_file:
text_file.write(encoded_string)
print("Base64 encoded string has been saved to output_base64.txt")
运行后部分结果如下
3)修改tireddrive_abtest.json
替换yourpicture_base64
请求格式例子如下,需要跟你写服务中的数据格式保持一致,如果读者参考了我之前的格式,那么直接用。
{"image":"yourpicture_base64",
"customerID":"sdcm_001",
"imageID":"image_001",
"minScore": 0.35,
"maxScore": 0.99,
"timeStamp":"1234455",
"flexibleParams":""}
(3)运行ab命令
ab -n 1000 -c 5 -r -p ./tireddrive_abtest.json -T 'application/json' '<http://0.0.0.0:888/predict>'
4.查看结果
运行结果如下
正样本 请求数1000 5 GPU-Util 17
----------------------------------------------------------------------------------------------------------------
root@c712345678:/usr/src/ultralytics# ab -n 1000 -c 5 -r -p ./tireddrive_abtest.json -T 'application/json' '<http://0.0.0.0:888/predict>'
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, <http://www.zeustech.net/>
Licensed to The Apache Software Foundation, <http://www.apache.org/>
Benchmarking 0.0.0.0 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: uvicorn
Server Hostname: 0.0.0.0
Server Port: 888
Document Path: /predict
Document Length: 141 bytes
Concurrency Level: 5
Time taken for tests: 18.868 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 267000 bytes
Total body sent: 171773000
HTML transferred: 141000 bytes
Requests per second: 53.00 [#/sec] (mean)
Time per request: 94.339 [ms] (mean)
Time per request: 18.868 [ms] (mean, across all concurrent requests)
Transfer rate: 13.82 [Kbytes/sec] received
8890.65 kb/s sent
8904.47 kb/s total
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 20 94 4.3 94 105
Waiting: 20 94 4.3 94 105
Total: 20 94 4.3 94 105
Percentage of the requests served within a certain time (ms)
50% 94
66% 94
75% 95
80% 95
90% 96
95% 98
98% 99
99% 101
100% 105 (longest request)
笔者通常关注的指标如下:
1)Requests per second
Requests per second: 53.00 [#/sec] (mean)
- 含义:表示在整个测试过程中,服务器每秒处理的平均请求数。
- 解释:这里是 53,意味着服务器平均每秒能够处理 53 个请求。这个数值越高,代表服务器的吞吐量越大,处理请求的能力越强。
2)Time per request
Time per request: 94.339 [ms] (mean)
Time per request: 18.868 [ms] (mean, across all concurrent requests)
94.339
- 含义:表示每个请求的平均响应时间,单位是毫秒(ms)。
- 解释:94.339 毫秒是每个请求从发出到服务器响应的平均时间。如果响应时间过长,可能表示服务器负载过高或网络存在瓶颈。
18.868
- 含义:表示在并发请求的情况下,每个请求的平均响应时间,单位为毫秒(ms)。这个值考虑了并发请求的影响。
- 解释:这里是 18.868 毫秒,它是平均的每个请求的响应时间,但此值已按并发请求数(在这个例子中是 5)做了平均。这个值比上面的
Time per request
(94.339 毫秒)低,因为并发请求可以让多个请求同时进行,从而减少等待时间。
3)Transfer rate
Transfer rate: 13.82 [Kbytes/sec] received
8890.65 kb/s sent
8904.47 kb/s total
13.82
- 含义:表示服务器在测试过程中每秒接收的数据量,单位是 Kbytes/sec(千字节每秒)。
- 解释:13.82 Kbytes/sec 表示服务器每秒钟从客户端接收了约 13.82 千字节的数据。这通常与请求的大小和请求频率有关。
8890.65
- 含义:表示服务器每秒发送的数据量,单位是 kb/s(千比特每秒)。
- 解释:8890.65 kb/s 表示服务器在整个测试过程中每秒钟发送了约 8890.65 千比特的数据。这个数值越高,说明服务器响应的返回数据量较大。
8904.47
- 含义:表示整个测试过程中服务器的总数据传输速率,包括接收和发送的数据,单位是 kb/s(千比特每秒)。
- 解释:8904.47 kb/s 是服务器同时接收和发送数据的总速率。这个数值是
Transfer rate received
和sent
的合并。
恭喜你学会了如何测试在高并发和大负载下服务的性能表现。