写在开头
说起数据库的性能
,我们一般都会说到这个数据库处理读写的能力怎么样,以及磁盘会有SSD
和HDD
的区别,以及数据库的类型,关系还是内存等等多个分类,但是对于我们来说如果要去熟悉一个新的数据库来说,肯定得先知道这个数据库的性能,不管哪个数据库,都离不开一个非常重要的part----压测
,而且数据库的使用程度也会和这个part非常息息相关,所以这次和大家介绍一个数据库性能压测工具—sysbench
sysbench 简介
sysbench
是一个模块化的,跨平台的,多线程基准测试工具,主要用于评估测试各种不同系统下数据库的不同参数情况下的表现性能。
sysbench安装
本文章基于最新版本1.0.20版本
1.tar包安装
wget https://github.com/akopytov/sysbench/archive/refs/tags/1.0.20.tar.gz
tar -xvf 1.0.20.tar.gz
2.yum安装
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench
sysbench主要功能
主要功能:
1.oltp_*.lua:类似 OLTP 的数据库基准测试集合
2.fileio:文件系统级别的基准测试
3.cpu:一个简单的 CPU 基准测试
4.内存:内存访问基准
5.线程:基于线程的调度程序基准
6.互斥量:POSIX 互斥量基准
可以看到sysbench
的功能非常丰富,我们主要介绍用于压测数据库性能。
sysbench使用介绍示例
sysbench 使用流程
sysbench
一般使用都经过下面三个步骤:
PREPARE
准备测试的环境RUN
开始进行测试,获取测试数据CLEANUP
清理测试环境生成的数据以及文件
下面是一些系统方面的压测示例:
压测FileIO
sysbench fileio --threads=1 --file-total-size=10G --file-test-mode=rndrw --file-num=n prepare/run/cleanup
#这里主要说一下网上很多说错了这几个的含义,这里纠正一下
seqrd Doing sequential read test --顺序读
seqwr Doing sequential write test --顺序写
seqrewr Doing sequential rewrite test --顺序重写
rndrd Doing random read test --随机读
rndwr Doing random write test --随机写
rndrw Doing random r/w test --随机读写
压测CPU性能
sysbench cpu --cpu-max-prime=20000 --threads=n run
压测内存读写性能
sysbench memory --threads=8 --memory-access-mode=seq --memory-oper=read/write/none run
压测线程调度
sysbench threads --threads=800 --thread-yields=100 --thread-locks=2 run
压测互斥量
sysbench mutex --threads=100 --mutex-num=1000 --mutex-locks=100000 --mutex-loops=10000 run
sysbench压测之OLTP数据库性能
这part是我们的重点,这里先介绍什么叫做OLTP
,OLTP
指的就是数据库事务处理性能,一般数据库我们大方面可以分为两种方式OLTP事务性
和OLAP分析型
.
sysbench
实现数据库压测主要是通过一系列的 lua脚本实现的,如下:
$ whereis sysbench
sysbench: /usr/bin/sysbench /usr/share/sysbench
$ cd /usr/share/sysbench
$ ll
总用量 60
-rwxr-xr-x 1 root root 1452 4月 25 2020 bulk_insert.lua
-rw-r--r-- 1 root root 14369 4月 25 2020 oltp_common.lua
-rwxr-xr-x 1 root root 1290 4月 25 2020 oltp_delete.lua
-rwxr-xr-x 1 root root 2415 4月 25 2020 oltp_insert.lua
-rwxr-xr-x 1 root root 1265 4月 25 2020 oltp_point_select.lua
-rwxr-xr-x 1 root root 1649 4月 25 2020 oltp_read_only.lua
-rwxr-xr-x 1 root root 1824 4月 25 2020 oltp_read_write.lua
-rwxr-xr-x 1 root root 1118 4月 25 2020 oltp_update_index.lua
-rwxr-xr-x 1 root root 1127 4月 25 2020 oltp_update_non_index.lua
-rwxr-xr-x 1 root root 1440 4月 25 2020 oltp_write_only.lua
-rwxr-xr-x 1 root root 1919 4月 25 2020 select_random_points.lua
-rwxr-xr-x 1 root root 2118 4月 25 2020 select_random_ranges.lua
可以看到有很多种类型,这里我们简单介绍下这些lua脚本对应的功能:
脚本名称 | 脚本作用 |
---|---|
bulk_insert | 压测批量插入的性能脚本 |
oltp_common | 初始化脚本,表结构初始化,字段数据填充方式都在里面,很多脚本都会调用这个common脚本 |
oltp_delete | 事务性删除性能 |
oltp_insert | 事务性插入性能 |
oltp_point_select | 数据库点查性能 |
oltp_read_only | 数据库读性能 |
oltp_read_write | 数据库读写性能 |
oltp_update_index | 有索引情况下更新性能 |
oltp_update_non_index | 无索引情况下更新性能 |
oltp_write_only | 数据库写性能 |
select_random_points | 随机点查 |
select_random_ranges | 随机范围查询性能 |
可以看到可以sysbench
可以实现非常多的维度场景下数据库的压测性能。
具体的sql我们也可以从oltp_common
脚本中看到如下:
sysbench OLTP使用示例
sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-host=localhost --mysql-port=6606 --mysql-socket=/data/mysql/mysql.sock --mysql-db=test1 --mysql-user=sys --mysql-password=1111 --tables=1 --table_size=1000 --time=10 --threads=2 prepare/run/cleanup
对于参数,大家可以在使用脚本--help查看具体有哪些参数
自定义压测
大家都知道,sysbench
默认使用的表结构非常简单,可能压测出来的性能和我们真正的数据库表现性能有所差距,那么,我们要如何自定义呢?
前面我们说过oltp_common
是初始化,那么其实只需要修改其中几段代码即可。
1.修改表结构为我们的复杂表结构
2.修改插入语句以及对应列数据生成方式
增加对应想有值的列:
增加随机字符串生成的列值:
最后
最后说一句,作为一个DBA来说,sysbench
是一个非常好的协助工具,但是有一点需要补充的是,我们刚才可以看到有很多维度的压测,
一般来说作为DBA我们会去压测除读写性能和索引更新性能外,更重要
的一点是根据大家自己的业务场景去做压测,然后选择合适的数据库
。