MySQL 数据库压力测试

文章目录

    • 前言
    • 1. 安装部署
      • 1.1 二进制安装
      • 1.2 源码安装
    • 2. 服务器性能测试
      • 2.1 CPU
      • 2.2 内存
      • 2.3 磁盘
    • 3. MySQL 基准测试
      • 3.1 参数解析
      • 3.2 压测命令
      • 3.3 输出解读
      • 3.4 结果分析

前言

Sysbench 是一个开源的多线程基准测试工具,也是目前使用最多的 MySQL 压力测试工具。本篇文章将介绍如何使用它完成数据库压力测试。

1. 安装部署

1.1 二进制安装

使用下方命令,一键完成二机制安装。

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench

使用该方式安装,压测脚本默认在 /usr/share/sysbench/ 目录下。

1.2 源码安装

源码下载地址:Sysbench Github

# 安装依赖环境
yum -y install make automake libtool pkgconfig libaio-devel
# 支持 MySQL 安装下方依赖
yum -y install mysql-devel openssl-devel
# 支持 PostgreSQL 需要安装下方依赖
yum -y install postgresql-devel
# 源码安装
wget https://github.com/akopytov/sysbench/archive/refs/tags/1.0.20.tar.gz
# 解压
tar -zxvf sysbench-1.0.20.tar.gz
cd sysbench-1.0.20
./autogen.sh
./configure
make -j
make install

源码安装完成后,压测脚本默认在 /usr/local/share/sysbench 目录下。

2. 服务器性能测试

Sysbench 不仅可以测试数据库的性能,还可以测试服务器的性能。其中包含服务器的 CPU、内存和磁盘 I/O 性能。

2.1 CPU

sysbench cpu --cpu-max-prime=20000 --threads=32 run

测试算法:sysbench 是通过计算 --cpu-max-prime 范围内的质数(prime number)数量来衡量 CPU 的计算能力。

  • –cpu-max-prime:质数生成数量的上限。
  • –threads:并发线程的数量。
  • –time:运行时长,默认为运行 10 秒。
  • –events:若为 100 则表示计算 100 event 后自动结束,默认不限制。

看到这里,想必大家都明白了,比较两台服务器的计算性能,可以根据单位时间内,生成 event 的数量来衡量高低。

# 测试 cpu 性能,8 个并发线程运行 15 秒,质数生成上限是 2w
sysbench cpu --time=15 --cpu-max-prime=20000 --threads=8 run

输出中,重点关注 events per second 的结果。值越大,代表 CPU 计算能力越强。

CPU speed:events per second:  1480.62

2.2 内存

sysbench memory --memory-block-size=1M --memory-total-size=100G --num-threads=1 run

内存测试,支持的选项如下。

  • –memory-block-size:内存块的大小。默认为 1KB。推荐为 1M。
  • –memory-total-size:要传输的数据总大小。默认为 100G。
  • –memory-scope:内存访问的范围,可指定 Global 或 local。默认为 local。
  • –memory-hugetlb:是否从 HugeTLB 池中分配内存,默认为 off。
  • –memory-oper:内存操作类型,可指定 write、read 或 none。默认为 write。
  • –memory-access-mode:内存访问模式。可指定为 seq(顺序访问)或 rnd(随机访问)默认为 seq。

通过该工具,可以测出内存的写入或读取速率,用该速率衡量内存的性能。

# 测试命令,每次操作 1M,共 100G
sysbench memory --memory-block-size=1M --memory-total-size=100G --num-threads=1 run

输出中,重点关注以下部分。14263.70 MiB/sec 表示内存中顺序写入的速率。

102400.00 MiB transferred (14263.70 MiB/sec)

2.3 磁盘

磁盘的 I/O 测试,需要三个步骤:准备文件、测试、删除文件。以下是相关参数。

  • –file-num:测试需要创建的文件数。默认为 128.
  • –file-block-size:操作块的大小。默认 16KB。
  • –file-total-size:需要创建文件的总大小。默认为 2GB。
  • –file-test-mode:测试模式,可指定为 seqwr(顺序写)、seqrewr(顺序重写)、seqrd(顺序读)、rndrd(随机读)、rndwr(随机写)或 rndrw(随机读写)。
  • –file-async-backlog:每个线程异步 I/O 队列长度,默认为 128。
  • –file-extra-flags:打开文件时的指定标志,可指定为 sync、dsync 或 direct 默认为空,既没有指定。
  • –file-sync-freq:指定持久化操作的频率,默认为 100。
  • –file-sync-all:每次写入都执行持久化,默认为 on。
  • –file-sync-end:在测试结束时执行持久化操作,默认为 on。
  • –file-rw-ratio:混合测试中读写的比例。
# 准备文件
sysbench fileio --file-num=1 --file-total-size=5G --file-test-mode=rndrw prepare
# 执行测试,测试模式是 随机读写
sysbench fileio --file-num=1 --file-total-size=5G --file-test-mode=rndrw run
# 清理文件
sysbench fileio --file-num=1 --file-total-size=5G --file-test-mode=rndrw cleanup

输出中,reads/s 加上 writes/s 就是 IOPS。read, MiB/s 加上 written, MiB/s 就是常说的吞吐量。

File operations:reads/s:                      131.98writes/s:                     87.95fsyncs/s:                     2.30Throughput:read, MiB/s:                  2.06written, MiB/s:               1.37

3. MySQL 基准测试

对于新上线的业务而言,如果有新的服务器,新的环境,那么资源承载压力是否与预计匹配,需要用数据说话。

3.1 参数解析

sysbench oltp_read_write --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password='xxxxx' --mysql-db=sbtest --tables=30 --table-size=10000 --threads=30 prepare
  • oltp_read_write:测试模型,对应的是 /usr/local/share/sysbench/oltp_read_write.lua 脚本。
  • –mysql-xxx:这部分属于连接参数,见文知意。
  • –mysql-db:压测使用的数据库,需要提前创建好。
  • –tables:压测使用表的数量。
  • –table-size:单表大小,默认 10000 行。
  • –threads:并发工作线程数。
  • –time:压测多长时间。
  • –report-interval:每 x 秒输出一次结果,默认不输出。

3.2 压测命令

MySQL 数据库压测需要执行四个步骤,分别是 造数、预热、压测、清理环境。

# 造数
sysbench oltp_read_write --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password='xxxxx' --mysql-db=sbtest --tables=30 --table-size=10000 --threads=30 prepare
# 预热
sysbench oltp_read_write --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password='xxxxx' --mysql-db=sbtest --tables=30 --table-size=10000 --threads=30 prewarm
# 压测 30 秒
sysbench oltp_read_write --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password='xxxxx' --mysql-db=sbtest --tables=30 --table-size=10000 --threads=30 --time=30 --report-interval=10 run
# 清理
sysbench oltp_read_write --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password='xxxxx' --mysql-db=sbtest --tables=30 --table-size=10000 --threads=30 cleanup

3.3 输出解读

压测输出结果如下。

Threads started!
# thds:线程数 tps:每秒事务数 
# qps:每秒操作数 r 读 w 写 o 其他操作 
# lat 表示延迟 95% 查询等于或小于该值,单位毫秒 
# err/s 每秒错误数 reconn/s  每秒重试数
[ 10s ] thds: 30 tps: 1014.35 qps: 20334.80 (r/w/o: 14239.59/4063.50/2031.70) lat (ms,95%): 52.89 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 30 tps: 946.60 qps: 18930.09 (r/w/o: 13251.17/3785.82/1893.11) lat (ms,95%): 53.85 err/s: 0.00 reconn/s: 0.00
[ 30s ] thds: 30 tps: 1043.73 qps: 20885.39 (r/w/o: 14616.88/4180.94/2087.57) lat (ms,95%): 51.94 err/s: 0.00 reconn/s: 0.00
# 统计信息
SQL statistics:queries performed:read:                            421274 # 读操作的数量write:                           120364 # 写操作的数量other:                           60182 # 其他操作的数量total:                           601820 # 总请求数量transactions:                        30091  (945.30 per sec.) # 总事务数量(每秒事务数)queries:                             601820 (18906.09 per sec.) # 总请求数(每秒请求数)ignored errors:                      0      (0.00 per sec.) # 总错误数(每秒错误数)reconnects:                          0      (0.00 per sec.) # 重试数(每秒重试数)# 全局信息
General statistics:total time:                          31.8294s # 压测使用的时间total number of events:              30091 # 压测使用的 event 数量,在 oltp_read_write 脚本中,一个 event 就是一个失误# 耗时
Latency (ms):min:                                    4.89 # 最小耗时avg:                                   31.38 # 平均耗时max:                                 1926.37 # 最大耗时95th percentile:                       52.89 # 95% 执行耗时sum:                               944296.08 # 总耗时
# 线程信息
Threads fairness:events (avg/stddev):           1003.0333/15.84 # 平均每个线程,执行事件的数量# stddev 是标准差,值越小,代表结果越稳定execution time (avg/stddev):   31.4765/0.36 # 平均每个线程执行的时间

输出中,重点关注的指标是 QPS 和 TPS 反映了数据库系统的吞吐量,值越大越好。95th percentile 表示请求耗时,值越小越好。在一定范围内,并发线程越大,TPS 和 QPS 也会越大。需要结合服务器监控,调整线程数,最终得到一个合理的结果。

3.4 结果分析

如 3.3 小节,sysbench 输出的结果只适用于阅读,如果想画统计图,让结果更有说服力的时候,就需要加工一个数据。–report-interval 参数每段时间输出结果,那么可以用程序进行解析,然后将数据保存到 CSV 便于统计分析。

[ 10s ] thds: 30 tps: 1014.35 qps: 20334.80 (r/w/o: 14239.59/4063.50/2031.70) lat (ms,95%): 52.89 err/s: 0.00 reconn/s: 0.00

使用 vi result_collect.py 复制代码粘贴进去。

# -*- coding: utf-8 -*-
import sysprint('=' * 30)
print('times,thds,tps,qps,r,w,o,lat,err,reconn')
for line in sys.stdin:if line[0] == '[':times = int(str(line[line.rfind('[') + 1:line.find(']')]).replace('s', '').strip())thds = int(str(line[line.find('thds:') + 5: line.find('tps:')]).strip())tps = float(str(line[line.find('tps:') + 5: line.find('qps:')]).strip())qps = float(str(line[line.find('qps:') + 5: line.find('(r/w/o:')]).strip())rwo = str(line[line.find('(r/w/o:') + 8: line.find(' lat') - 1]).split('/')r = float(rwo[0])w = float(rwo[1])o = float(rwo[2])lat = float(str(line[line.find('95%):') + 5: line.find('err/s:')]).strip())err = float(str(line[line.find('err/s:') + 6:line.find('reconn/s:')]).strip())reconn = float(str(line[line.find('econn/s:') + 8: -1]).strip())res = [times, thds, tps, qps, r, w, o, lat, err, reconn]print(','.join([str(i) for i in res]))

执行压测时,使用下方命令。

sysbench oltp_read_write --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password='xxxx' --mysql-db=sbtest --tables=30 --table-size=10000 --threads=30 --time=30 --report-interval=10  run | python result_collect.py 

得到的结果:

times, thds, tps, qps, r, w, o, lat, err, reconn
10, 30, 1052.02, 21083.05, 14763.14, 4212.87, 2107.04, 52.89, 0.0, 0.0
20, 30, 1067.54, 21349.05, 14945.12, 4268.85, 2135.07, 50.11, 0.0, 0.0
30, 30, 958.0, 19175.78, 13419.48, 3840.3, 1916.0, 64.47, 0.0, 0.0

复制出来,粘贴到文本框,然后保存文件后缀 .csv 用 Excel 打开就行下面的样子。
在这里插入图片描述

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

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

相关文章

树莓派与电脑视频实时传输实现

编程环境 1、 树莓派 4B 2、 windows 编程语言 python 应用 tkinter scoket opencv 效果 视频同传 服务端视频初始化 服务端视频读取 windows 客户端接收视频流,队列存储 解析视频,存入队列 ui页面数据刷新 下载链接:https://…

elasticsearch篇:数据聚合

1.数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些…

VUE3项目学习系列--Axios二次封装(五)

Axios中文文档 | Axios中文网 (axios-http.cn) Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequ…

【洛谷 P8637】[蓝桥杯 2016 省 B] 交换瓶子 题解(贪心算法)

[蓝桥杯 2016 省 B] 交换瓶子 题目描述 有 N N N 个瓶子,编号 1 ∼ N 1 \sim N 1∼N,放在架子上。 比如有 5 5 5 个瓶子: 2 , 1 , 3 , 5 , 4 2,1,3,5,4 2,1,3,5,4 要求每次拿起 2 2 2 个瓶子,交换它们的位置。 经过若干次…

解释器模式(Interpreter Pattern)

解释器模式 说明 解释器模式(Interpreter Pattern)属于行为型模式,是指给定一门语言,定义它的语法(文法)的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。是一…

[NSSRound#18 Basic]web解析

文章目录 门酱想玩什么呢?Becomeroot 门酱想玩什么呢? 打开题目,加载完视频后要求我们给个游戏链接 点开评论区不难发现应该是想玩元梦之星,这里有个评论功能可以上传图片 我们随便输入点东西发现是插入并赋值到content元素里面 …

提示找不到MSVCP140.dll无法继续执行此代码的多种解决方法

当计算机系统在运行过程中突然提示“丢失MSVCP140.dll”这一错误信息时,意味着系统无法找到并加载这个至关重要的动态链接库文件。MSVCP140.dll是Microsoft Visual C Redistributable Package的一部分,对于许多基于Windows的应用程序来说,尤其…

Exam in MAC [容斥]

题意 思路 正难则反 反过来需要考虑的是: (1) 所有满条件一的(x,y)有多少对: x 0 时,有c1对 x 1 时,有c对 ...... x c 时,有1对 以此类推 一共有 (c2)(c1)/2 对 (2) 符合 x y ∈ S的有多少对&#xff1a…

openssl3.2 - note - Getting Started with OpenSSL

文章目录 openssl3.2 - note - Getting Started with OpenSSL概述笔记openssl 历史版本Configure 选项开关支持的OSopenssl 文档简介安装新闻每个平台的安装文档支持的命令列表配置文件格式环境变量 END openssl3.2 - note - Getting Started with OpenSSL 概述 看到官方文档…

物联网技术助力智慧城市转型升级:智能、高效、可持续

目录 一、物联网技术概述及其在智慧城市中的应用 二、物联网技术助力智慧城市转型升级的路径 1、提升城市基础设施智能化水平 2、推动公共服务智能化升级 3、促进城市治理现代化 三、物联网技术助力智慧城市转型升级的成效与展望 1、成效显著 2、展望未来 四、物联网技…

【C++初阶】C++入门(上)

C的认识 ①什么是C? ​ C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。 ​ 于是1982年,Bjarne Stroustrup(本…

D-阿洛酮糖-DAEase酶固定化载体及混合糖液分离

#D-阿洛酮糖-DAEase酶固定化载体及混合糖液分离 ​阿洛酮糖为白色固体晶体,无气味,具有较大的溶解度,柔和的口感,其具有传统甜味剂蔗糖70%的甜度,却几乎不提供任何热量。其与食物中的蛋白质,如鸡蛋蛋白发生…

ntp 部署

文章目录 简介ntp和ntpdate区别环境准备启动 简介 ntp全名 network time protocol 。NTP服务器可以为其他主机提供时间校对服务 ntp和ntpdate区别 两个服务都是centos自带的(centos7中不自带ntp)。ntp的安装包名是ntp;ntpdate的安装包是ntp…

【leetcode+深度/广度优先搜索】841. 钥匙和房间 (DFS,BFS)

leetcode-cn:leetcode面试75道精华:https://leetcode.cn/studyplan/leetcode-75/ 841.钥匙和房间:https://leetcode.cn/problems/keys-and-rooms/description/ 一、题目:841. 钥匙和房间 有 n 个房间,房间按从 0 到 n…

一对多文件传输该如何优化?

在数字化转型的浪潮中,企业对高效、安全的一对多文件传输需求日益增长。传统的文件传输方式,如纸质文件、电子邮件和FTP等,虽然在某些场景下仍然发挥作用,但在处理大规模、高频率的数据传输时,它们的局限性逐渐显现。本…

详细介绍Seq2Seq、Attention、Transformer !!

文章目录 前言 1、Seq2Seq工作原理 核心思想 工作原理 Encoder(编码器) Dncoder(解码器) 2、Attention工作原理 核心逻辑:从关注全部到关注重点 工作原理 Encoder(编码器) Decoder(解…

vue实现微信自带浏览器分享(小卡片形式)

注意&#xff1a;只能在微信自带浏览器打开进行分享 1.图片效果 2.cdn引入weixin-js-sdk的依赖 在index.html中引入 <script src"https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script>2.在assets/js文件夹中创建share.js文件 import axios fr…

springboot271制造装备物联及生产管理ERP系统

制造装备物联及生产管理ERP系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装制造装备物联及…

考研模拟面试-答案【攻略】

考研模拟面试-答案【攻略】 前言版权推荐考研模拟面试-答案前面的问题通用问题专业题数据结构计算机网络操作系统数据库网络安全 手写题数据结构操作系统计算机网络 代码题基础代码题其他代码题 后面的问题补充题目 基础代码题答案链栈循环队列1循环队列2哈希表 最后 前言 202…

Oracle基础-分组查询 备份

一、概述 数据分组的目的是用来汇总数据或为整个分组显示单行的汇总信息&#xff0c;通常在查询结果集中使用GROUP BY 子句对记录进行分组。在SELECT 语句中&#xff0c;GROUP BY 子句位于FROM 子句之后&#xff0c;语法格式&#xff1a; SELECT columns_list FROM table_nam…