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 打开就是下面的样子。
在这里插入图片描述

如下图,是使用 Tableau 绘制的在线程数分别为 5 和 10 时的压测结果。
在这里插入图片描述

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

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

相关文章

JVM是如何运行的

JVM(Java Virtual Machine,Java虚拟机)是 Java 程序的运行环境,它负责将 Java 字节码翻译成机器代码并执行。也就是说 Java 代码之所以能够运行,主要是依靠 JVM 来实现的。 JVM 整体的大概执行流程是这样的&#xff1…

Android cmdline tools安装

打开AS 进入SDK Tools 看到了吗?那个打着勾的就是

Centos8安装Docker,使用阿里云源

一、前期准备 1.关闭防火墙,SELINUX systemctl stop firewalld.service systemctl disable firewalld.service setenforce 0 sed -i "s/SELINUXenforcing/SELINUXdisabled/g" /etc/selinux/config查看状态 systemctl status firewalld systemctl status…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:NavRouter)

导航组件,默认提供点击响应处理,不需要开发者自定义点击事件逻辑。 说明: 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 必须包含两个子组件,其中第二个子组…

c++入门你需要知道的知识点(上)

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 今日主菜:c入门 主厨:邪王真眼 所属专栏:c专栏 主厨的主页:Chef‘s blog 前言: 咱也是好久没有更…

大数据与云计算

目录 一、大数据时代二、云计算——大数据的计算三、云计算发展现状四、云计算实现机制五、云计算压倒性的成本优势 一、大数据时代 我们先来看看百度关于 “大数据”(Big Data)的搜索指数。 可以看出,“大数据” 这个词是从2012年才引起关注…

flask-sqlalchemy库

彩笔激流勇退。 1. 简介 ORM,对象关系映射。简单来说,ORM将数据库中的表与面向对象中的类建立了一种对应关系。这样,我们要操作数据库,表,记录就可以直接通过操作类或者类实例来完成。 SQLAlchemy 是目前python中最…

面向对象编程第二式:继承 (Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

【Golang】golang使用三方SDK操作容器指南

【Golang】golang使用三方SDK操作容器指南 大家好 我是寸铁👊 总结了一篇 golang使用三方SDK操作容器✨ 喜欢的小伙伴可以点点关注 💝 这应该是目前全网最全golang使用三方SDK操作容器的指南了✌️ CreateConfig 主要是创建容器的配置信息,常…

uniapp遇到的问题

【uniapp】小程序中input输入框的placeholder-class不生效解决办法 解决:写在scope外面 uniapp设置底部导航 引用:https://www.jianshu.com/p/738dd51a0162 【微信小程序】moveable-view / moveable-area的使用 https://blog.csdn.net/qq_36901092/…

【机器学习】走进监督学习:构建智能预测模型的第一步

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

go语言基础笔记

1.基本类型 1.1. 基本类型 bool int: int8, int16, int32(rune), int64 uint: uint8(byte), uint16, uint32, uint64 float32, float64 string 复数:complex64, complex128 复数有实部和虚部,complex64的实部和虚部为32位,complex128的实部…

基于Java+SpringBoot+vue+element实现校园闲置物品交易网站

基于JavaSpringBootvueelement实现校园闲置物品交易网站 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 ** 作者主页 央顺技术团队** 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录 基于…

【Unity】Tag、Layer、LayerMask

文章目录 层(Layer)什么是LayerLayer的应用场景Layer层的配置(Tags & Layers)Layer的数据结构LayerMaskLayer的选中和忽略Layer的管理(架构思路)层碰撞矩阵设置(Layer Collision Matrix&…

人工智能入门学习笔记1:什么是人工智能

一、什么是人工智能 人工智能(Artificial Intelligence),是一个以计算机科学(Computer Science)为基础,由计算机、心理学、哲学等多学科交叉融合的交叉学科、新兴学科,研究、开发用于模拟、延伸和扩展人的智能的理论、…

【探索程序员职业赛道:挑战与机遇】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

【JetsonNano】onnxruntime-gpu 环境编译和安装,支持 Python 和 C++ 开发

1. 设备 2. 环境 sudo apt-get install protobuf-compiler libprotoc-devexport PATH/usr/local/cuda/bin:${PATH} export CUDA_PATH/usr/local/cuda export cuDNN_PATH/usr/lib/aarch64-linux-gnu export CMAKE_ARGS"-DONNX_CUSTOM_PROTOC_EXECUTABLE/usr/bin/protoc&qu…

使用 Docker Compose 快速搭建监控网站 uptime-kuma

有时候需要监控自己搭建的一些网站、服务是否正常运行, 这时候可以考虑使用一个监控网站, 定时的进行检测, 记录网站、服务的运行状态, 在这推荐使用 uptime-kuma。 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Menu)

以垂直列表形式显示的菜单。 说明: 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 Menu组件需和bindMenu或bindContextMenu方法配合使用,不支持作为普通组件单独使用。 子组件 包含MenuIt…

【Claude 3】一文谈谈Anthropic(Claude) 亚马逊云科技(Bedrock)的因缘际会

文章目录 前言1. Anthropic的诞生2. Anthropic的“代表作”——Claude 3的“三驾马车”3. 亚马逊云科技介绍4. 强大的全托管服务平台——Amazon Bedrock5. 亚马逊云科技(AWS)和Anthropic的联系6. Claude 3模型与Bedrock托管平台的关系7. Clude 3限时体验入口分享【⚠️截止3月1…