使用sysbench测试mariadb性能的经验总结

github地址: https://github.com/akopytov/sysbench
我测试用的系统: CentOS Linux release 7.2.1511 (Core)
sysbench版本用了最新的, 1.1.0
过程中也搜了很多教程, 所以重复的就不多说, 主要说一下教程中没看到的或不够清楚的

1. 安装

安装可以用yum也可以自己下下来编译, 我两种都尝试了一下, 自己编译注意看情况指定–with-mysql-includes和 –with-mysql-libs, 比如:

./configure --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/mysql/lib

如果是上面这种方式编译安装的, 将会只带mysql驱动, 跑测试的时候就不用指定 –db-driver

如果是yum安装的, 默认除了mysql还会带一个PostgreSQL的驱动, 就得指定 –db-driver=mysql, 否则会报错提示没指定驱动啥的

带了哪些驱动可以从sysbench –help里看到

2. 跑测试

勤看帮助。

sysbench –help的最上面是通用选项, 主要用到的比如线程数(–threads), 限制跑多久(–time), 跑多少次事件(–events)
sysbench –help的最后, 可以看到自带的测试方式有这些, 这就是–test=后面可以带的参数

Compiled-in tests:
  fileio - File I/O test
  cpu - CPU performance test
  memory - Memory functions speed test
  threads - Threads subsystem performance test
  mutex - Mutex performance test

基础用法(help, prepare, run, cleanup)参考github页面

想测数据库的, 一开始可能会有点懵逼, 因为这里没看到测试数据库的参数, 网上教程大都是旧的, 按那些填也没用, 而github主页上好像也没找到说明?

我也蛋疼了好一会儿, –help和github主页看了无数遍, 终于才在github主页最上面瞄到这个:

未分类

我tm也是醉了, 这里一般都当作介绍区域看一眼就跳过了, 谁会想到唯一能找到使用方式的线索在这里???

所以搜一下这个oltp_.lua吧, find / -name oltp_.lua, 会列出一堆lua脚本, 选择你要测的直接复制完整路径作为参数传给–test, 然后其他一堆参数该填的填, 就可以跑起来了

要注意的主要是这个参数–rand-type=, 这里官网给了可选的范围: {uniform, gaussian, special, pareto, zipfian}, 其他几个还能勉强看出是一些数学分布, uniform和special完全不知道是干什么的, uniform只知道有个统一的意思, 并不能确定, 搜也搜不到, 于是提了个issue问了一下:

未分类

好吧原来uniform就是离散均匀分布, 简单来说就是普通随机, special如作者所说,是不科学的,但它又是默认值……(还能说啥,前面的白测了_(:з」∠)
(简单对比了一下uniform和special, special测出来的性能大致是uniform的1.7倍)

3. 各lua脚本的区别

虽然没写过lua, 不过打开脚本看看基本能看出来, 我只测了下面三个(下列为后缀), 它们分别干的事是:

•  insert:, 即为纯insert
•  read_write 包括:  select (range, sum, order, distinct) ,  update,  update(non-index),  delete
•  read_only: select (range, sum, order, distinct)

--range_selects 参数决定select是否是仅单点 (只使用where=,而不使用上面括号中条件)

4. 其他

注意帮助最后一句写的See ‘sysbench help’ for a list of options for each test.
所以要看参数的话就是 sysbench xx.lua help, 可以看到参数用来设置测试用的表数量, 表大小之类的

自己撸了个python脚本测insert(主要是为了测别的), 用了sqlalchemy, 性能和测试脚本差距比较大…

我是三台虚拟机做了galera分布式集群的, 实测发现单节点跑测试时其他节点cpu也会飚起来, 所以就不贴结果了, 可能参考性不够强.

MySQL sysbench基准测试

一、基准测试

参考《高性能 MySQL》第二章。

二、Sysbench

sysbench 是开源的跨平台多线程基准测试工具,主要用于测试各种不同系统参数下的 CPU/内存/线程/IO/数据库等方面的性能,数据库目前支持 MySQL/Oracle/PostgreSQL。具体的参数设置,应根据实际环境来进行必要调整。

与之前版本相比,sysbench 最新的 0.5 版本,可以使用脚本来决定测试语句,比之前在代码里写死测试更加方便用户修改和使用,不需要去修改源程序,只需要修改相应的 lua 脚本,即可定制不同的测试用例,在数据库负载测试中,这样可以对 SQL 语句进行更有针对性的测试。

1、下载安装

Linu 自带版本大多为 0.4.12,最新版本可以从 Launchpad 下载安装步骤如下:

./autogen.sh
./configure
make && sudo make install

sysbench 依赖 mysql-dev 包的支持,如果 mysql 没有安装在默认位置,执行./configure 时需要配置–with-mysql-includes 和 –with-mysql-lib。具体参看源码包中 README 文档。

安装完成后可以查看版本信息。

sysbench --version

2、使用说明

简要说明 sysbench 的使用方法,侧重对数据库的测试。具体用法参考 sysbench –help。

2.1 命令格式:

Sysbench [general-options]… –test=<test-name> [test-options]… command

通用选项(general-options):

  • –num-threads=N 指定要使用的线程

  • –report-interval=N 每隔 N 秒打印统计信息

  • –rand-XXX 随机分布相关配置

内建测试项目(test-option):

  • fileio – File I/O test
  • cpu – CPU performance test
  • memory – Memory functions speed test
  • threads – Threads subsystem performance test
  • mutex – Mutex performance test

oltp,从 0.5 开始不再设置单独的选项,可以直接通过 Lua 脚本文件进行测试,兼容之前 oltp 的所有选项。

以上所有的项目都可以通过 sysbench-0.5sysbenchtests 下的测试脚本进行测试。

2.2 测试项目选项(test-option)

各种内建测试项目的选项可以通过命令 sysbench –test= help 查看。

2.3 命令(command):

sysbench 做压力测试的时候分 3 个阶段:prepare(准备测试数据); run(运行压力测试); cleanup(清理测试数据)。

3、内建测试说明

3.1 CPU

sysbench 采用寻找最大素数的方式来测试 CPU 的性能。

sysbench --test=cpu  --cpu-max-prime=1000 run

3.2 Fileio

Sysbench 的 I/O 测试和 InnoDB 的 I/O 模式非常类似。

sysbench --test=fileio –file_num=40 –-file-total-size=80G --file-test-mode=rndrw prepare
sysbench --test=fileio –file_num=40 –-file-total-size=80G --file-test-mode=rndrw run
sysbench --test=fileio –file_num=40 –-file-total-size=80G --file-test-mode=rndrw cleanup

3.3 Memory

待完善

3.4 Threads

待完善

3.5 Mutex

待完善

3.6 OLTP

Sysbench 0.5 中的 oltp.lua 提供了一个比之前版本中的 oltp 模式更为真实的场景来进行数据库的基准测试。和之前 oltp 模式中的单个表场景相比,0.5 通过 Lua 脚本可以对多个表进行工作测试。oltp.lua 可以理解原先 oltp 模式中的大多数选项。

所有的测试脚本位于/sysbench-0.5/sysbench/test/下,db 目录下是数据库测试项目,其中 common.lua 并非测试文件,是用于 prepare 和 cleanup。 oltp.lua 文件用于测试事务性能,其中 thread_init 函数来初始化每个线程的参数,初始化工作调用了 common.lua 中的 set_vars()函数,来初始化 oltp 的相关参数。

阶段 1: 连接数据库服务器

每次执行基准测试,不管是 prepare 还是 run,如果不是使用默认值的话,都应该指定如何连接数据库。默认值如下:

未分类

默认的数据库 sbtest,sysbench 不会自动创建该数据库。所以如果你要用过的话要首先。

阶段 2:Prepare

如果使用默认值,首先要创建测试所用的表。创建方式有两种: oltp.lua (串行) 和 parallel_prepare.lua (并行)。

未分类

针对 database driver 还需要指明以下参数:

未分类

创建表:

oltp.lua 中提供的 –oltp-tables-count 指明了表的数量。默认的表名是 sbtest。如果制定了 oltp-tables-count,则在表名后加数字,例如 sbtest1, sbtest2, .. sbtest[oltp-tables-count],注意,此种情况下不会创建 sbtest 表。

通过选项 –oltp-secondary 可以在每个表上使用第二索引来替代主键。也就是说通过 KEY xid (ID) 而不是 PRIMARY KEY (ID) 来创建表。这个选项将会使 InnoDB 为每个表创建内部 6-byte 的索引。同样可以使用选项 –oltp-auto-in 将 id 字段设为递增。

未分类

创建表 SQL 语句示例如下:

CREATE TABLE `sbtest101` (
     `id` int(10) unsigned NOT NULL auto_increment,                            
     `k` int(10) unsigned NOT NULL default '0',
     `c` char(120) NOT NULL default '',
     `pad` char(60) NOT NULL default '',
     PRIMARY KEY  (`id`),
     KEY `k` (`k`));

Parallel.lua(并行) 创建:

./sysbench --test=tests/db/parallel_prepare.lua --mysql-user=USER --mysql-password=SECRET --oltp-tables-count=64 --num-threads=8 run

注意:oltp-tables-count 应该是 num-threads 的整数倍。

oltp.lua(串行)创建:

./sysbench --test=tests/db/oltp.lua --mysql-user=USER --mysql-password=SECRET --mysql-table-engine=myisam --oltp-table-size=1000000 --oltp-tables-count=64 --mysql-socket=/tmp/mysql.sock prepare

阶段 3:Run

准备好测试环境之后就可以使用 oltp.lua 执行一系列的测试了,测试使用的线程数量通过选项 –num-threads 来指定。每个线程通过随机产生小于或者等于 oltp-tables-count 的数字来选择一个表。

随机取样分布通过选项 –oltp-dist-type 来进行设置,该选项默认值是 special。Special 分布还和另外两个参数有关:–oltp-dist-pct,用来指定要特殊对待的记录的百分比,–oltp-dist-res 指定这些记录的概率。例如,对 1000 行记录进行 1000 次查询,–oltp-dist-pct=1 and –oltp-dist-res=50 结果,开始 10 条记录(1% of 1000),每条记录选中五十次,总共 500 次,剩余的查询将会从 990 条记录中均匀采样。

选中表之后,就会执行相应的测试。他们将会打包为一个事务(transaction)传递给数据库服务器(除非使用 myisam 引擎,这样先会锁住表)。也可以单线程运行 oltp 的子集,例如 oltp_simple.lua, select.lua, insert.lua, delete.lua, update_index.lua, update_non_index.lua

未分类

  • SELECT tests
    Select 还可以分为点选择测试(Point Select tests)和范围测试(Ranges tests)。

    • 点测试
      选项 oltp-point-selects 单次事务中点选择测试的查询次数。 每次测试,通过制定的分布来随机产生一个小于或者等于表大小(oltp-table-size)的数字,然后执行下面的查询语句。 SELECT c FROM sbtestXXX WHERE id=N

    • 范围测试
      通过变量 oltp-range-size 可以制定要查询的范围(不大于表大小)

    • 简单范围测试
      选项 oltp-simple-ranges 单次事务中范围选择测试的查询次数。 每次通过指定的分布来产生一个不大于 oltp-talbe-size 的整数 N,然后通过选项设置 oltp-range-size 设置整数 M,然后执行如下查询: SELECT c FROM sbtest WHERE id BETWEEN N AND M

  • 范围求和(Sum in ranges)
    选项 oltp_sum_ranges 单次事务中范围选择测试的查询次数。查询语句: SELECT SUM(K) FROM sbtest WHERE id BETWEEN N and M

  • 范围排序(Order in ranges)
    选项 oltp_order_ranges 单次事务中范围选择测试的查询次数。查询语句: SELECT c FROM sbtest WHERE id between N and M ORDER BY c

  • 范围去重(Distincts in ranges)
    选项 oltp-distinct-ranges 单次事务中范围选择测试的查询次数。查询语句:

SELECT DISTINCT c FROM sbtest WHERE id BETWEEN N and M ORDER BY c

未分类

  • UPDATE tests

只要没有指定 oltp-read-only=on 就能进行更新测试。

未分类

1、index_update.lua

选项 oltp_index_updates 单次事务中范围选择测试的查询次数。查询语句:

UPDATE sbtest SET k=k+1 WHERE id=N

2、non_index_update.lua

选项 oltp-non-index-updates 单次事务中范围选择测试的查询次数。C 为随机产生的字符串,查询语句:

UPDATE sbtest SET c=C WHERE id=N
  • DELETE test

只要没有指定 oltp-read-only=on 就能进行更新测试。通过执行分布产生一个不大于 oltp-table-siez 的数字 N,执行语句:

DELETE FROM sbtest WHERE id=N

  • INSERT test

只要没有指定 oltp-read-only=on 就能进行更新测试。通过执行分布产生一个不大于 oltp-table-siez 的数字 N,执行语句:

INSERT INTO sbtest (id, k, c, pad) VALUES N, K, C, PAD

  • 使用举例:

使用 5 个线程在 25 个 table 上进行默认测试:

./sysbench --mysql-user=USER --mysql-password=SECRET --test=tests/db/oltp.lua --oltp-tables-count=25 --num-threads=5 run

使用 10 个线程在 100 个 table 上进行 select 测试,10 个点测试和值为 1000 的范围测试:

./sysbench --mysql-user=USER --mysql-password=SECRET --test=tests/db/select.lua --oltp-tables-count=100 --num-threads=10
--oltp-point-selects=100 --oltp-range-size=1000 run

阶段 4:清理(cleanup)

可以通过清理操作来返回到准备的阶段。必须提供链接数据库服务器的选项和创建的表的数量。

./sysbench --test=tests/db/oltp.lua --mysql-user=USER --mysql-password=SECRET --oltp-tables-count=64 cleanup