图床项目性能测试

news2024/11/18 9:25:41

文章目录

  • 一、FastDFS文件性能测试
    • 1.1 上传文件测试
    • 1.2 下载测试
    • 1.3 删除文件测试
    • 1.4 如何提高
  • 二、图床项目wrk+lua性能测试
    • 2.1 wrk
    • 2.2 MySQL索引优化
    • 2.2 注册测试
      • 2.2.1 无索引性能
      • 2.2.2 有索引性能
    • 2.3 登录测试
      • 2.3.1 无索引性能
      • 2.3.2 有索引性能
    • 2.4 读取文件测试
      • 2.4.1 无索引性能
      • 2.4.2 有索引性能

一、FastDFS文件性能测试

在这里插入图片描述
小规模测试的时候,建议一台客户端机器只模拟一个客户端 ./test_upload.sh 1 。

具体来说,进入fastdfs安装目录,进入test目录下,进行make

cd /home/zxm/tuchuang/fastdfs/test
make

./gen_files 生成测试文件;

./test_delete 测试删除文件

./test_download 测试下载文件;

./test_upload 测试上传文件;

1.1 上传文件测试

 # 生成5k、50k、200k、1M、10M、100M的文件各一个
 ./gen_files 
 
 # 可以模拟十个并发客户端。.0、.1、....、.9是客户端序号
 #./test_upload.sh   

# 只测一个客户端,0代表编号
 ./test_upload 0

# 结果查看
cd upload

在 stat_by_file_type.0 查看上传的情况

#file_type total_count success_count time_used(ms)
5K 5000 5000 707
50K 1000 1000 248
200K 500 500 599
1M 50 50 382
10M 5 5 269
100M 1 1 606
文件规格上传次数成功次数总耗时 ms平均耗时 msTPS
5k500050007070.1417072
50k100010002480.2484032
200k5005005991.198835
1M50503827.640131
10M5526953.80019
100M116066062

TPS: Transactions Per Second 也就是事务数/秒。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数

1.2 下载测试

./test_download 0
#file_type total_count success_count time_used(ms)
5K 1162088 1162088 574
50K 220357 220357 117		
200K 119790 119790 116		# tps = 1032672
1M 12396 12396 8630

1.3 删除文件测试

./test_delete 0
#file_type total_count success_count time_used(ms)5K 5000 5000 73
50K 1000 1000 9
200K 500 500 6		# tps = 8333
1M 50 50 1
10M 5 5 5
100M 1 1 15

1.4 如何提高

提升上传性能的方法:
1)增加group (水平扩展)
2)增加带宽(带宽能力)
3)使用读写性能高的磁盘
单纯增加每个group的storage只能应对上传峰值,不能从根本上提升上传能力。而且storage增加,还会增加上传文件同步到同组storage的流程。

提升下载性能的方法:
1)增加storage (少写多读的场景)
2)增加group
3)增加带宽
4)使用读性能高的磁盘

二、图床项目wrk+lua性能测试

2.1 wrk

以下是使用wrk查看到的一些基本参数信息
在这里插入图片描述
N代表数字参数,支持国际单位 (1k, 1M, 1G)
T代表时间参数,支持时间单位 (2s, 2m, 2h)

例如:wrk -c 20 -t 2 -d 20s --latency http://192.168.1.34
建立20个TCP连接,使用两个线程,用时20秒,对http://192.168.1.34进行压测。
返回结果

Running 20s test @ http://192.168.0.143
 2 threads and 20 connections
Thread Stats  Avg   Stdev   Max  +/- Stdev
      (平均值)(标准差)(最大值)(正负一个标准差所占比例)
 Latency   9.35ms   1.91ms  81.96ms  96.92%
 (延迟)
 Req/Sec   1.08k   73.16   1.52k   88.50%
 (处理中的请求数)
Latency Distribution(延迟分布)
  50%   9.03ms
  75%   9.45ms
  90%   9.97ms
  99%  17.26ms(99分位的延迟)
 43019 requests in 20.03s, 170.79MB read(20.03s秒内共处理完成了43019个请求,读取了
170.79MB数据)
Requests/sec:  2148.24  (平均每秒处理完成2148.24个请求)
Transfer/sec:    8.53MB (平均每秒读取数据8.53MB)

2.2 MySQL索引优化

正式进行测试之前,先介绍一下图床项目的MySQL优化地方。

1、user_info表
被调用涉及到where:

select password from user_info where user_name='%s'
select * from user_info where user_name='%s'

主要匹配user_name
索引:UNIQUE KEY uq_user_name ( user_name ) 创建唯一索引:1查找更快速;2.不允许重复;

2、user_file_list 表
被调用涉及到where:

select count(*) from user_file_list where user='%s'
select user_file_list.*, file_info.url, file_info.size, file_info.type from file_info, user_file_list where
user = '%s' and file_info.md5 = user_file_list.md5 limit %d, %d"
update user_file_list set shared_status = 1 where user = '%s' and md5 = '%s' and file_name = '%s'
update user_file_list set shared_status = 0 where user = '%s' and md5 = '%s' and file_name = '%s'
select * from user_file_list where user = '%s' and md5 = '%s' and file_name = '%s'

联合索引:KEY idx_user_md5_file_name ( user , md5 , file_name )

3、share_picture_list 表-考虑

select * from share_picture_list where user='%s' 
select share_picture_list.user, share_picture_list.filemd5,
share_picture_list.file_name,share_picture_list.urlmd5, share_picture_list.pv,
share_picture_list.create_time, file_info.size from file_info, share_picture_list where
share_picture_list.user = '%s' and file_info.md5 = share_picture_list.filemd5 limit %d, %d"
select * from share_picture_list where user = '%s' and urlmd5 = '%s'
select filemd5 from share_picture_list where urlmd5 = '%s' 

索引:KEY idx_user_filemd5 ( user , filemd5 ),
KEY idx_urlmd5_user ( urlmd5 , user )

两两匹配可以调换顺序,比如(user,urlmd5)可以和(urlmd5,user)匹配,但是一个不行。因此若还有单个urlmd5,根据最左匹配原子,必须把urlmd5放在user前面才可以匹配。

4、share_file_list表

select share_file_list.*, file_info.url, file_info.size, file_info.type from file_info, share_file_list
where file_info.md5 = share_file_list.md5 limit %d, %d
delete from share_file_list where user = '%s' and md5 = '%s
update share_file_list set pv = %d where md5 = '%s' and file_name = '%s'
delete from share_file_list where user = '%s' and md5 = '%s' and file_name = '%s',
select * from share_file_list where md5 = '%s' and file_name = '%s'

索引:KEY idx_filename_md5_user ( file_name , md5 , user ),
KEY idx_md5_user ( md5 , user )

5、file_info

select share_file_list.*, file_info.url, file_info.size, file_info.type from file_info, share_file_list where
file_info.md5 = share_file_list.md5 limit %d, %d
file_info where md5 = '%s'

索引:KEY uq_md5 ( md5 (8)) – 前缀索引
md5有32个字符,一一匹配很费时。一般前8个匹配就能判断。

2.2 注册测试

指令

#  http://127.0.0.1/api/reg如果是跨机器测试则填写目标ip的地址。
wrk -c 20 -t 20 -d 5s --latency -s scripts/reg.lua http://127.0.0.1/api/reg

reg.lua大致的原理:
1)通过随机字符串给nickName和userName赋值。
2)然后发起post请求

-- reg.lua
-- 引入dkjson,之所以不使用cjson是因为有版本兼容的问题
local dkjson = require("dkjson")  

-- 产生随机数
function random(n, m)
    math.randomseed(os.clock()*math.random(1000000,90000000)+math.random(1000000,90000000))
    return math.random(n, m)
end
-- 产生随机字符串
function randomLetter(len)
    local rt = ""
    for i = 1, len, 1 do
            rt = rt..string.char(random(97,122))
    end
    return rt
end

request = function()
    local request_body = {
        email = "472251823@qq.com",
        firstPwd = "e10adc3949ba59abbe56e057f20f883e",
        nickName = randomLetter(15),
        phone = "18612345678",
        userName = randomLetter(15)
    }
    local body = dkjson.encode(request_body, {indent = true});
    -- print("req ", body)
    wrk.method = "POST"
    wrk.body   =  body
    wrk.headers["Content-Type"] = "application/json"
    return  wrk.format(wrk.method,"/api/reg", wrk.headers, wrk.body)
end
response = function(status, headers, body)
    -- print(body) --调试用,正式测试时需要关闭,因为解析response非常消耗资源
end

2.2.1 无索引性能

Running 5s test @ http://127.0.0.1/api/reg				
  20 threads and 20 connections				
  Thread Stats   Avg      Stdev     Max   +/- Stdev				
    Latency    49.78ms    6.19ms  75.22ms   88.58%				
    Req/Sec    19.95      3.52    60.00     91.97%				
  Latency Distribution				
     50%   49.76ms				
     75%   52.65ms				
     90%   55.28ms				
     99%   61.33ms				
  2041 requests in 5.10s, 561.99KB read				
Requests/sec:    400.37				
Transfer/sec:    110.24KB

2.2.2 有索引性能

Running 5s test @ http://127.0.0.1/api/reg		
  20 threads and 20 connections		
  Thread Stats   Avg      Stdev     Max   +/- Stdev		
    Latency    26.22ms   66.13ms 435.75ms   93.89%		
    Req/Sec   100.58     24.94   180.00     75.76%		
  Latency Distribution		
     50%    9.49ms		
     75%   12.07ms		
     90%   21.05ms		
     99%  381.12ms		
  9628 requests in 5.09s, 2.59MB read		
Requests/sec:   1893.16		
Transfer/sec:    521.58KB	

2.3 登录测试

wrk -c 20 -t 20 -d 5s --latency -s scripts/login.lua http://127.0.0.1/api/login

需要根据自己的用户名和密码修改

-- login.lua 
request = function()
    -- print("req")
    wrk.method = "POST"
    -- 用户名 handsome1;密码:这里是123456做md5的结果
    wrk.body = '{"user":"handsome1","pwd":"e10adc3949ba59abbe56e057f20f883e"}'
    wrk.headers["Content-Type"] = "application/json"
    return  wrk.format(wrk.method,"/api/login",wrk.headers, wrk.body)
end
response = function(status, headers, body)
    -- print(body) --调试用,正式测试时需要关闭,因为解析response非常消耗资源
end

2.3.1 无索引性能

Running 5s test @ http://127.0.0.1/api/login
  20 threads and 20 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    22.51ms   10.18ms  95.65ms   73.28%
    Req/Sec    45.02     10.68    80.00     67.39%
  Latency Distribution
     50%   21.07ms
     75%   27.78ms
     90%   34.92ms
     99%   55.82ms
  4566 requests in 5.08s, 1.42MB read
Requests/sec:    897.96
Transfer/sec:    285.01KB

2.3.2 有索引性能

Running 5s test @ http://127.0.0.1/api/login	
  20 threads and 20 connections	
  Thread Stats   Avg      Stdev     Max   +/- Stdev	
    Latency    12.70ms    4.81ms  58.82ms   80.24%	
    Req/Sec    79.78     13.38   140.00     79.50%	
  Latency Distribution	
     50%   12.02ms	
     75%   14.64ms	
     90%   17.65ms	
     99%   30.60ms	
  8070 requests in 5.10s, 2.50MB read	
Requests/sec:   1582.73	
Transfer/sec:    502.26KB	

2.4 读取文件测试

wrk -c 20 -t 20 -d 2s --latency -s scripts/myfiles.lua http://127.0.0.1/api/myfiles&cmd=normal

目前设置最多拉取10个文件信息,这里需要token,浏览器登录的时候通过F12观察调试窗口获取。

-- myfiles.lua
request = function()
    -- print("req")
    wrk.method = "POST"
    -- user: handsome1;token:浏览器登录时通过F12从浏览器调试窗口获取
    wrk.body = '{"user":"handsome1","count": 10,"start": 0,"token":"opttrtsbzvwxxftwqeuzrqzsnjmmdnns"}'
    wrk.headers["Content-Type"] = "application/json"
    return  wrk.format(wrk.method,"/api/myfiles&cmd=normal",wrk.headers, wrk.body)
end
response = function(status, headers, body)
    -- print(body) --调试用,正式测试时需要关闭,因为解析response非常消耗资源
end

2.4.1 无索引性能

Running 2s test @ http://127.0.0.1/api/myfiles
  20 threads and 20 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    13.17ms    6.56ms  61.17ms   88.82%
    Req/Sec    78.71     14.88   120.00     75.12%
  Latency Distribution
     50%   11.90ms
     75%   14.71ms
     90%   18.26ms
     99%   45.08ms
  3300 requests in 2.10s, 0.95MB read
Requests/sec:   1573.67
Transfer/sec:    464.30KB

2.4.2 有索引性能

Running 2s test @ http://127.0.0.1/api/myfiles
  20 threads and 20 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     7.95ms    2.94ms  27.88ms   74.27%
    Req/Sec   126.69     19.30   191.00     69.86%
  Latency Distribution
     50%    7.58ms
     75%    9.46ms
     90%   11.46ms
     99%   18.19ms
  5288 requests in 2.10s, 1.42MB read
Requests/sec:   2518.11
Transfer/sec:    693.73KB

本专栏知识点是通过<零声教育>的系统学习,进行梳理总结写下文章,对c/c++linux课程感兴趣的读者,可以点击链接,详细查看详细的服务器课程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/984027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ctfshow-web-新年好?

0x00 前言 CTF 加解密合集CTF Web合集网络安全知识库 文中工具皆可关注 皓月当空w 公众号 发送关键字 工具 获取 0x01 题目 0x02 Write Up 尝试访问之后返回了源码。可以看到重点是在setTimeout 首先来看setTimeout&#xff0c;setTimeout的意思就是说在一段时间后执行指定…

H5页面,上下滑动翻页(整页翻书切换效果)

使用 H5页面&#xff0c;上下滑动翻页 修改 页面间的切换&#xff1a;整页翻书的切换效果 demo代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEe…

突破传统显示技术,探索OLED透明屏的亮度革命

OLED透明屏作为未来显示技术的颠覆者&#xff0c;其亮度性能成为其引人注目的特点之一。 那么&#xff0c;今天尼伽便深入探讨OLED透明屏的亮度&#xff0c;通过引用数据、报告和行业动态&#xff0c;为读者提供高可读性和专业性强的SEO软文&#xff0c;增加可信度和说服力。 …

计算机丢失mfc140.dll怎么办,分享几种常见解决方案[dll修复工具下载】

一、mfc140.dll 的详细介绍 1.mfc140.dll 的作用 MFC140.dll 是 MFC 的一个组件&#xff0c;它提供了许多用于创建 Windows 应用程序的类和函数&#xff0c;如窗口管理、控件、对话框、菜单、消息处理等。这些类和函数可以帮助开发者更轻松地开发图形用户界面&#xff08;GUI&a…

【Linux】shell脚本和bat脚本:

文章目录 一、脚本对应环境&#xff1a;【1】shell&#xff1a;linux环境&#xff1b;后缀名为.sh【2】bat&#xff1a;windows环境&#xff1b;后缀名为.bat或者.cmd 二、脚本执行&#xff1a;【1】shell执行【2】bat脚本执行 三、脚本相关命令&#xff1a;1. shell命令【1】s…

【UE】材质描边、外发光、轮廓线

原教学视频链接&#xff1a; ue4 材质描边、外发光、轮廓线_哔哩哔哩_bilibili 步骤 1. 首先新建一个材质&#xff0c;这里命名为“Mat_outLine” 在此基础上创建一个材质实例 2. 在视口中添加一个后期处理体积 设置后期处理体积为无限范围 点击添加一个数组 选择“资产引用”…

如何将JACOCO应用到企业实战中~测试过招,只需6点

1、下载 jacoco 官网&#xff1a;https://www.jacoco.org/jacoco/index.html 如果你想学习自动化测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站播放全网第一的自动化测试教程&#xff0c;同时在线人数到达1000人&#xff0c;并且还有笔记可以领取及…

Win10右键 nvidia rtx desktop manager 怎么删除(最新)

在更新了最新的 nvidia后原来的隐藏鼠标右键菜单后不行了&#xff0c;新方法如下&#xff1a; 步骤一&#xff1a;在键盘“WINR”键同时操作下&#xff0c;启动运行框&#xff0c;在框内输入“regedit”&#xff0c;打开深度系统win7 的注册表编辑器。 步骤二&#xff1a;为防…

Spring学习|Bean的作用域、自动装配Bean、注解实现自动装配、Spring注解开发

Bean的作用域 单例模式(Spring默认机制) 原型模式:每次从容器中get的时候&#xff0c;都会产生一个新对象! Bean的自动装配 自动装配是Spring满足bean依赖一种方式! Spring会在上下文中自动寻找&#xff0c;并自动给bean装配属性! 在Spring中有三种装配的方式 1.在xml中显示的…

在字节跳动和拼多多干了5年测试,熬夜总结出来的划水经验....

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入字节&#xff0c;之后跳槽到了拼多多&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是5年的工作经验吧。 这5年之间完成了一次晋升&#xff0c;换了一家公司&#xff0c;…

java八股文面试[数据库]——MySQL死锁的原因和处理方法

1) 表的死锁 产生原因: 用户A访问表A&#xff08;锁住了表A&#xff09;&#xff0c;然后又访问表B&#xff1b;另一个用户B访问表B&#xff08;锁住了表B&#xff09;&#xff0c;然后企图访问表A&#xff1b;这时用户A由于用户B已经锁住表B&#xff0c;它必须等待用户B释放…

ZooInspector

一、在window&#xff0c;使用我们先打开Zookeeper,目录bin下的zkServer.cmd&#xff0c;把Zookeeper运行起来 ​编辑https://img.111com.net/attachment/art/187687/5f0c25fbe580c.png 二、可以使用目录bin下的zkCli.cmd&#xff0c;查询Zookeeper数据的方式&#xff0c;但是…

大模型浪潮席卷!和鲸科技入选创业邦“2023值得关注的125家AIGC企业”榜单

为以专业视角发掘现阶段积极探索 AIGC 技术和应用的企业&#xff0c;对接企业与场景&#xff0c;推动技术落地&#xff0c;创业邦于近日发布了“2023 值得关注的 125 家 AIGC 企业”榜单&#xff0c;和鲸科技凭借旗下 ModelWhale 数据科学协同平台在承载气象大模型的构建与应用…

企业怎么选择广告片的投放途径

TVC广告片和宣传片都是常见的企业营销工具&#xff0c;每种形式都有各自的特点和适用场景。选择哪种形式更适合企业投放&#xff0c;取决于多个因素&#xff0c;包括目标受众、营销目标、预算和信息传递需求等。接下来由深圳TVC广告片制作公司老友记小编从以下几个方面介绍它们…

【Python报错解决方案】DeprecationWarning: `np.float` is a deprecated

报错amoconda libsite-packages sklearn linear model least ngl.py30: Deprecationmarming: mp.float is a deprecated alias for the builtinfloat , To silence this warning, wse flat by itself. Doing this will not modify amy behavior and is safe. If you specifical…

机器学习基础算法--回归类型和评价分析

目录 1.数据归一化处理 2.数据标准化处理 3.Lasso回归模型 4.岭回归模型 5.评价指标计算 1.数据归一化处理 """ x的归一化的方法还是比较多的我们就选取最为基本的归一化方法 x(x-x_min)/(x_max-x_min) """ import numpy as np from sklea…

python超详细基础教程:元组和集合

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 元组和集合是Python中的基本类型 python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一&#xff0c;元组 元组&#xff08;tuple&#xff09;由小括号、逗号和数据对象构成的集合&#xff0c;各个项通过逗号…

毕业设计-摄像头识别二维码

本毕业设计采用imx6ull-linux4.1.15-qt5.6开发板进行测试 相关交叉编译包和摄像头测试程序已上传&#xff1a;https://download.csdn.net/download/qq_42952079/88282608 将zbar和opencv下的lib库文件拷贝到开发板的lib目录下&#xff0c;将camera可执行文件拷贝到开发板目录下…

解锁前端Vue3宝藏级资料 第四章 VUE常用 UI 库 1 ( element-plus,Ant ,naiveui,ArcoDesign)

现在常用的前台UI 分别是以下几种&#xff0c;我们将从中间选择介绍几个主流的UI的用于后台的系统搭建与开发。 Ant Design Vue element-plusnaiveuiArcoDesignBootstrap Vue Buefy Chakra UI Framevuerk Oruga Tachyons Tailwind CSS NutUI Vant Vuetify.js第一章 Vue3项目创建…

[machine Learning]推荐系统

其实严格来说推荐系统也是一种监督学习,我们需要根据已有数据进行预测,但是这种训练数据不是单纯的输入和输出问题,所以被归类为"超越监督学习"的一种? 今天去旁听了隔壁专业的机器学习课程,感觉自己的知识确实不是很系统,所以后面会找个机会把前面的代码给补充上.…