它主要包括以下几种方式的测试:
cpu性能
磁盘io性能
调度程序性能
内存分配及传输速度
posix线程性能
数据库性能(oltp基准测试)
sysbench的数据库oltp测试支持mysql、postgresql、oracle,目前主要用于linux操作系统,开源社区已经将sysbench移植到了windows,并支持sql server的基准测试。
废话不多说,开始。
mysql版本: mysql-community-server-5.6.29
os: centos 6.7 x86_64
sysbench 0.5相比0.4版本有一些变化,包括oltp测试结合了lua脚本,还多了一些隐藏选项,本文会涉及得到一部分。
如果需要测试postgresql、oracle,则在configure时需要加上 --with-oracle 或者 –with-pgsql 参数
注意最后一行,一项测试开始前需要用<code>prepare</code>来准备好表和数据,<code>run</code>执行真正的压测,<code>cleanup</code>用来清除数据和表。实际prepare的表结构:
上面的测试命令代表的是:对mysql进行oltp基准测试,表数量10,每表行数约50w(几乎delete多少就会insert的多少),并且是非事务的只读测试,持续60s,并发线程数12。
需要说明的选项:
<code>mysql-db=dbtest1a</code>:测试使用的目标数据库,这个库名要事先创建
<code>--oltp-tables-count=10</code>:产生表的数量
<code>--oltp-table-size=500000</code>:每个表产生的记录行数
<code>--oltp-dist-type=uniform</code>:指定随机取样类型,可选值有 uniform(均匀分布), gaussian(高斯分布), special(空间分布)。默认是special
<code>--oltp-read-only=off</code>:表示不止产生只读sql,也就是使用oltp.lua时会采用读写混合模式。默认 off,如果设置为on,则不会产生update,delete,insert的sql。
<code>--oltp-test-mode=nontrx </code>:执行模式,这里是非事务式的。可选值有simple,complex,nontrx。默认是complex
simple:简单查询,select c from sbtest where id=n
complex (advanced transactional):事务模式在开始和结束事务之前加上begin和commit, 一个事务里可以有多个语句,如点查询、范围查询、排序查询、更新、删除、插入等,并且为了不破坏测试表的数据,该模式下一条记录删除后会在同一个事务里添加一条相同的记录。
nontrx (non-transactional):与simple相似,但是可以进行update/insert等操作,所以如果做连续的对比压测,你可能需要重新cleanup,prepare。
<code>--oltp-skip-trx=[on|off]</code>:省略begin/commit语句。默认是off
<code>--rand-init=on</code>:是否随机初始化数据,如果不随机化那么初始好的数据每行内容除了主键不同外其他完全相同
<code>--num-threads=12</code>: 并发线程数,可以理解为模拟的客户端并发连接数
<code>--report-interval=10</code>:表示每10s输出一次测试进度报告
<code>--max-requests=0</code>:压力测试产生请求的总数,如果以下面的<code>max-time</code>来记,这个值设为0
<code>--max-time=120</code>:压力测试的持续时间,这里是2分钟。
注意,针对不同的选项取值就会有不同的子选项。比如<code>oltp-dist-type=special</code>,就有比如<code>oltp-dist-pct=1</code>、<code>oltp-dist-res=50</code>两个子选项,代表有50%的查询落在1%的行(即热点数据)上,另外50%均匀的(sample uniformly)落在另外99%的记录行上。
再比如<code>oltp-test-mode=nontrx</code>时, 就可以有<code>oltp-nontrx-mode</code>,可选值有select(默认), update_key, update_nokey, insert, delete,代表非事务式模式下使用的测试sql类型。
以上代表的是一个只读的例子,可以把<code>num-threads</code>依次递增(16,36,72,128,256,512),或者调整my.cnf参数,比较效果。另外需要注意的是,大部分mysql中间件对事务的处理,默认都是把sql发到主库执行,所以只读测试需要加上<code>oltp-skip-trx=on</code>来跳过测试中的显式事务。
ps1: 只读测试也可以使用<code>share/tests/db/select.lua</code>进行,但只是简单的point select。
ps2: 我在用sysbench压的时候,在mysql后端会话里有时看到大量的query cache lock,如果使用的是uniform取样,最好把查询缓存关掉。当然如果是做两组性能对比压测,因为都受这个因素影响,关心也不大。
读写测试还是用oltp.lua,只需把<code>--oltp-read-only</code>等于<code>off</code>。
然而<code>oltp-test-mode=nontrx</code>一直没有跟着我预期的去走,在mysql general log里面看到的sql记录与<code>complex</code>模式相同。所以上面示例中的<code>--oltp-test-mode=nontrx --oltp-nontrx-mode=select</code>可以删掉。
update:
分析一下oltp.lua脚本内容,可以清楚单个事务各操作的默认比例:select:update_key:update_non_key:delete:insert = 14:1:1:1:1,可通过<code>oltp-point-selects</code>、<code>oltp-simple-ranges</code>、<code>oltp-sum-ranges</code>、<code>oltp-order-ranges</code>、<code>oltp-distinct-ranges</code>,<code>oltp-index-updates</code>、<code>oltp-non-index-updates</code>这些选项去调整读写权重。
同只读测试一样,在atlas,mycat这类中间件测试中如果不加<code>oltp-skip-trx=on</code>,那么所有查询都会发往主库,但如果在有写入的情况下使用<code>--oltp-skip-trx=on</code>跳过begin和commit,会出现问题:
alert: failed to execute mysql query: `insert into sbtest4 (id, k, c, pad) values (48228, 47329, '82773802508-44916890724-85859319254-67627358653-96425730419-64102446666-75789993135-91202056934-68463872307-28147315305', '13146850449-23153169696-47584324044-14749610547-34267941374')`: alert: error 1062 duplicate entry '48228' for key 'primary' fatal: failed to execute function `event': (null)
这里不得不佩服老外的办事效率和责任心,提个疑惑能立马得到回复,反观国内,比如在atlas,mycat项目里提到问题到现在都没人搭理。。。
如果基准测试的时候,你只想比较两个项目的update(或insert)效率,那可以不使用oltp脚本,而直接改用<code>update_index.lua</code>:
此时像<code>oltp-read-only=off</code>许多参数都失效了。需要说明的是这里 (非)索引更新,不是where条件根据索引去查找更新,而是更新索引列上的值。
我们一般关注的用于绘图的指标主要有:
response time avg: 平均响应时间。(后面的95%的大小可以通过<code>--percentile=98</code>的方式去更改)
transactions: 精确的说是这一项后面的tps 。但如果使用了<code>-oltp-skip-trx=on</code>,这项事务数恒为0,需要用<code>total number of events</code> 去除以总时间,得到tps(其实还可以分为读tps和写tps)
read/write requests: 用它除以总时间,得到吞吐量qps
当然还有一些系统层面的cpu,io,mem相关指标
sysbench还可以对文件系统io测试,cpu性能测试,以及内存分配与传输速度测试,这里就不介绍了。
总结起来sysbench的缺点就是,模拟的表结构太简单,不像tpcc-mysql那样完整的事务系统。但对于性能压测对比还是很有用的,因为sysbench使用的环境参数限制是一样的。