性能测试 —— MySQL 基准测试

2022-04-18  本文已影响0人  祁小彬

1. 概述

MySQL 作为我们日常开发中,使用最多的数据库(基本没有之一),但我们很多开发人员对 MySQL 的性能规格了解得非常少。所以,本文我们想一起来,对 MySQL 本身做一个性能基准测试。

在开始基准测试之前,我们比较快捷的知道,MySQL 大体的性能规格,从各大云厂商提供的 MySQL 云服务。

艿艿:此处,是不是默默的宣传了下国内的云服务。

2. 性能指标

通过我们看各大厂商提供的指标,我们不难发现,主要是 4 个指标:

如果对基准测试不是很理解的胖友,可以看下 《详解 MySQL 基准测试和 sysbench 工具》 的第一部分基准测试简介

总结来说,实际就是 2 个维度:

3. 测试工具

MySQL 的性能测试工具还是比较多的,使用最多的是 sysbench 和 mysqlslap 。本文,我们也会使用这两个工具,进行 MySQL 性能基准测试。

具体的介绍,我们放在下面的章节中。如果对其他测试工具感兴趣,可以看看如下两篇文章:

考虑到有些胖友可能不知道如何安装 MySQL 5.7 版本,可以参考 《在 CentOS7 上使用yum安装 MySQL 5.7》 文章。

4. sysbench

FROM 《性能测试工具 sysbench》
sysbench 是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。它主要包括以下几种方式的测试:

  1. CPU 性能
  2. 磁盘 IO 性能
  3. 调度程序性能
  4. 内存分配及传输速度
  5. POSIX 线程性能
  6. 数据库性能(OLTP 基准测试)

目前 sysbench 主要支持 MySQL、PgSQL、Oracle 这 3 种数据库。

sysbench 也是目前 DBA 最喜欢用来做 MySQL 性能的测试工具。

另外,我们可以发现,云厂商不约而同的使用 sysbench 作为基准测试工具。所以啊,sysbench 可能是比较正确的选型。

下面,我们就开始我们的 sysbench 基准测试之旅。考虑到现在很多公司都是采用阿里云为主,所以我们就参考阿里云的测试方法 。

4.1 测试环境

艿艿:经过几轮的压测,测试出来的 TPS/QPS 巨差,因为没标准去类比,所以我就删除了下面这段,重新去跟老婆大人申请零花钱,买了阿里云服务器去测试。如下是几轮的测试结果:
线程数 / 单表数据量 / 表数 / QPS / TPS

可能和我没做 MySQL 服务器调优配置有关系,走的默认配置。
也可能和服务器的硬盘太差有关系,IOPS 才 100 。如果对 IOPS 的计算逻辑不了解的胖友,感兴趣的,可以看看 《(转)MySQL TPS 和 QPS 的统计和 IOPS》 。
作为一个热爱死磕的艿艿,在 V2EX 的讨论,找到一个通病相连的 《MySQL 的性能指标在什么情况下是正常的呢?》 。

因为抠门,我们拿了手头的刀片机,作为测试服务器。并且,上面实际还跑了蛮多其他服务的,嘿嘿。具体配置如下:

艿艿:下面,我们拿一台阿里云的 ECS 服务器,进行测试。

4.2 安装工具

我们以 Linux 为例。如果没有 Linux 环境的胖友,可以使用 VirtualBox 安装一个 Linux 虚拟机环境。

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

本文,我们使用的 sysbench 是 1.0.17-2.el7 版本。

-bash-4.2# sysbench --version
sysbench 1.0.17

下面,我们如下三个步骤,进行测试:

  1. 准备数据 prepare
  2. 执行测试 run
  3. 清理数据 clean

4.3 准备数据

需要注意,sysbench 1.0.17 版本,和我们在网上看到的 sysbench 0.5 的版本,命令上有一些差异。

sysbench oltp_common.lua --time=3600 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=buzhidao --mysql-db=sbtest --table-size=10000000 --tables=64 --threads=32 --events=999999999 --report-interval prepare

让我们一起看看每个参数的意思:

如下参数的介绍,我们主要参考了这两篇文章,想要详细了解更多参数的胖友,可以来看看:

因为阿里云提供的需要生成的数据较多,所以最后艿艿将命令修改成如下:

sysbench oltp_common.lua --time=300 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=MyNewPass4! --mysql-db=sbtest --table-size=1000000 --tables=10 --threads=32 --events=999999999   prepare

执行命令后,会自动生成数据库的表、和数据。如下:

[root@iZuf6hci646px19gg3hpuwZ sysbench]# sysbench oltp_common.lua --time=300 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=MyNewPass4! --mysql-db=sbtest --table-size=1000000 --tables=10--threads=32 --events=999999999   prepare
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Creating table 'sbtest1'...
Inserting 1000000 records into 'sbtest1'
Creating a secondary index on 'sbtest1'...
Creating table 'sbtest2'...
Inserting 1000000 records into 'sbtest2'
Creating a secondary index on 'sbtest2'...
Creating table 'sbtest3'...
Inserting 1000000 records into 'sbtest3'
Creating a secondary index on 'sbtest3'...
Creating table 'sbtest4'...
Inserting 1000000 records into 'sbtest4'
Creating a secondary index on 'sbtest4'...
Creating table 'sbtest5'...
Inserting 1000000 records into 'sbtest5'
Creating a secondary index on 'sbtest5'...
Creating table 'sbtest6'...
Inserting 1000000 records into 'sbtest6'
Creating a secondary index on 'sbtest6'...
Creating table 'sbtest7'...
Inserting 1000000 records into 'sbtest7'
Creating a secondary index on 'sbtest7'...
Creating table 'sbtest8'...
Inserting 1000000 records into 'sbtest8'
Creating a secondary index on 'sbtest8'...
Creating table 'sbtest9'...
Inserting 1000000 records into 'sbtest9'
Creating a secondary index on 'sbtest9'...
Creating table 'sbtest10'...
Inserting 1000000 records into 'sbtest10'
Creating a secondary index on 'sbtest10'...

4.4 执行测试

sysbench oltp_read_write.lua --time=300 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=MyNewPass4! --mysql-db=sbtest --table-size=1000000 --tables=10 --threads=16 --events=999999999  --report-interval=10  run

执行后,效果如下:

[root@iZuf6hci646px19gg3hpuwZ sysbench]# sysbench oltp_read_write.lua --time=300 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=MyNewPass4! --mysql-db=sbtest --table-size=1000000 --tables=10 --threads=16 --events=999999999 --rate=0 --histogram=on  --report-interval=10  run
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 16
Report intermediate results every 10 second(s)
Initializing random number generator from current time

Initializing worker threads...

Threads started!

[ 10s ] thds: 16 tps: 784.14 qps: 15705.59 (r/w/o: 10997.12/3138.58/1569.89) lat (ms,95%): 58.92 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 16 tps: 842.11 qps: 16845.24 (r/w/o: 11791.27/3369.75/1684.22) lat (ms,95%): 52.89 err/s: 0.00 reconn/s: 0.00
[ 30s ] thds: 16 tps: 856.99 qps: 17124.49 (r/w/o: 11984.72/3425.78/1713.99) lat (ms,95%): 51.02 err/s: 0.00 reconn/s: 0.00
[ 40s ] thds: 16 tps: 835.42 qps: 16714.15 (r/w/o: 11702.34/3340.97/1670.83) lat (ms,95%): 54.83 err/s: 0.00 reconn/s: 0.00
[ 50s ] thds: 16 tps: 851.39 qps: 17022.37 (r/w/o: 11913.74/3405.85/1702.78) lat (ms,95%): 52.89 err/s: 0.00 reconn/s: 0.00
... 省略

如下,是艿艿跑出来的两组测试结果:

4.5 清理数据

sysbench oltp_read_write.lua --time=300 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=MyNewPass4! --mysql-db=sbtest --table-size=1000000 --tables=10 --threads=16 --events=999999999  --report-interval=10  cleanup

开始打扫战场,嘻嘻。效果如下:

[root@iZuf6hci646px19gg3hpuwZ sysbench]# sysbench oltp_read_write.lua --time=300 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=MyNewPass4! --mysql-db=sbtest --table-size=1000000 --tables=10 --threads=16 --events=999999999 --rate=0 --histogram=on  --report-interval=10  runC^C
[root@iZuf6hci646px19gg3hpuwZ sysbench]# sysbench oltp_read_write.lua --time=300 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=MyNewPass4! --mysql-db=sbtest --table-size=1000000 --tables=10 --threads=16 --events=999999999  --report-interval=10  cleanup
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Dropping table 'sbtest1'...
Dropping table 'sbtest2'...
Dropping table 'sbtest3'...
Dropping table 'sbtest4'...
Dropping table 'sbtest5'...
Dropping table 'sbtest6'...
Dropping table 'sbtest7'...
Dropping table 'sbtest8'...
Dropping table 'sbtest9'...
Dropping table 'sbtest10'...

4.6 推荐文章

5. mysqlslap

FROM 《MySQL压力测试工具 mysqlslap》
mysqlslap 是一个 MySQL 官方提供的压力测试工具。

比较大的优势,在于 mysqlslap 是 MySQL 官方所提供,并且提供多种引擎的性能测试。

艿艿:更加喜好 sysbench ,所以不会 mysqlslap 会写的相对简单一些。

5.1 测试过程

相比 sysbench 来说,mysqlslap 的测试过程还是比较简洁的,一个命令,即可完成整个过程。如下:

mysqlslap --concurrency=16,32 --iterations=3 --number-int-cols=1 --number-char-cols=2 --auto-generate-sql --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=10000 --create-schema=sbtest2 -uroot -pMyNewPass4!

如下参数的介绍,我们主要参考了这两文章,想要详细了解更多参数的胖友,可以来看看:

执行命令后,效果如下图:

[root@iZuf6hci646px19gg3hpuwZ sysbench]# mysqlslap --concurrency=16,32 --iterations=3 --number-int-cols=1 --number-char-cols=2 --auto-generate-sql --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=10000 --create-schema=sbtest2 -uroot -pMyNewPass4!
mysqlslap: [Warning] Using a password on the command line interface can be insecure.
Benchmark
    Running for engine innodb
    Average number of seconds to run all queries: 0.489 seconds
    Minimum number of seconds to run all queries: 0.486 seconds
    Maximum number of seconds to run all queries: 0.496 seconds
    Number of clients running queries: 16
    Average number of queries per client: 625

Benchmark
    Running for engine innodb
    Average number of seconds to run all queries: 0.379 seconds
    Minimum number of seconds to run all queries: 0.377 seconds
    Maximum number of seconds to run all queries: 0.382 seconds
    Number of clients running queries: 32
    Average number of queries per client: 312

相比来说,mysqlslap 不提供 QPS/TPS 的统计,需要写脚本从 MySQL 统计,或者搭配其它监控工具(例如说,Prometheus MySQL Exporter)。

5.2 推荐文章

因为本文确实对 mysqlslap 写的简略,所以可以看看如下几篇文章:

666. 彩蛋

因为本文并未讲 MySQL 性能优化相关的内容,所以需要胖友自己去寻找一些靠谱的资料,继续进行学习。当然,艿艿还是会不断整理一些,写的不错的 MySQL 性能优化相关的内容:

最后,不得不感叹,SSD 硬盘,对 MySQL 等存储服务的巨大收益,特别是使用普通机械磁盘,还是 7500 转的,那个性能渣渣。

另外,在给 MySQL 性能基准测试,可以搭配 Prometheus 等监控系统,通过监控大盘,看看具体的主机性能情况,MySQL 性能情况。

艿艿:上述两个链接,点进去就是监控大盘。

上一篇 下一篇

猜你喜欢

热点阅读