用sysbench来测试MySQL的性能的教程
鉴于最近对OpenStack的兴趣和激情,我想要确保我可以做恰当的系统性能评估。我主要开始转向sysbench,是因为它带来一系列丰富的针对不同层面的测试(通过-test=option来获知),包括有:
- fileio-文件I/O测试
- cpu-CPU系能测试
- memory-内存功能速度测试
- threads-线程子系统系能测试
- mutex-互斥性能测试
正如你所看到的的,sysbench将让你的心思着重放在你的硬件和基础架构的许多基础组件上,例如你的磁盘子系统,以及你的CPUs和内存。有一个额外的选项,是用来执行对MySQL的模拟压力测试,并且当我在0.5版本中没有看到以上的所提到的可支持测试项时候,我很惊讶,尽管它可以用来显示“联机事务处理–联机事务处理测试”。-test=oltp到底怎么回事??
这个列表来自于sysbench最近的发布版本0.5——如果你仅仅是在这个版本上使用它,使用FredericDescamps(感谢lefred!)所提供的包。如果你用的(系统)是EPEL,Ubuntu14.04或者Debian7,就可以使用0.4.12版本(检查sysbench的版本-version)。那么,测试类型OLTP再也不会出现。这个版本做了什么呢?我使劲挠头,直到我询问PerconaIRC才知道在0.5版本里的标准OLTP测试类型被替换成了不一样的语法,它使用传递参数到sysbench,替换掉了引用脚本写入lua的方式。它的优点是,现在你有了一个接口,可以写入你特定的负载测试中(提供你了解的lua(接口),用起来也不难)。如果你还想要运行预定义负载测试,它们还是存在的,但是你必须把它们作为RPM的一部分去安装,或者直接拷贝到你的系统。
幸运的是,如果你使用lefred提供的包,你会发现下面这些lua脚本(这里使用了截止至2014年8月4号的Amazonami):
[root@pxc-control~]#ls-l/usr/share/doc/sysbench/tests/db/ total44 -rw-r--r--1rootroot3585Sep72012common.lua -rw-r--r--1rootroot340Sep72012delete.lua -rw-r--r--1rootroot830Sep72012insert.lua -rw-r--r--1rootroot2925Sep72012oltp.lua -rw-r--r--1rootroot342Sep72012oltp_simple.lua -rw-r--r--1rootroot425Sep72012parallel_prepare.lua -rw-r--r--1rootroot343Sep72012select.lua -rw-r--r--1rootroot3964Sep72012select_random_points.lua -rw-r--r--1rootroot4066Sep72012select_random_ranges.lua -rw-r--r--1rootroot343Sep72012update_index.lua -rw-r--r--1rootroot552Sep72012update_non_index.lua
所以诀窍(如果你希望这么叫它)不是通过单一词语传递--test指令,而是通过传递一个lua脚本的完整路径。
下面首先是旧的方式(sysbench0.4.12来自EPEL库):
--test=oltp--oltp-test-mode=complex
下面是新的方式(sysbench0.5):
--test=/usr/share/doc/sysbench/tests/db/insert.lua
下面是我在一个3个节点的PXC集群上跑haproxy,做一个仅插入的测试类型,下面是我传递给sysbench的全部命令:
[root@pxc-control~]#catsys_haproxy.sh #!/bin/bash sysbench --test=/usr/share/doc/sysbench/tests/db/insert.lua --mysql-host=pxc-control --mysql-port=9999 --mysql-user=sysbench-haproxy --mysql-password=sysbench-haproxy --mysql-db=sbtest --mysql-table-type=innodb --oltp-test-mode=complex --oltp-read-only=off --oltp-reconnect=on --oltp-table-size=1000000 --max-requests=100000000 --num-threads=3 --report-interval=1 --report-checkpoints=10 --tx-rate=24 $1
下面是insert.lua脚本的内容:
[root@pxc-control~]#cat/usr/share/doc/sysbench/tests/db/insert.lua pathtest=string.match(test,"(.*/)")or"" dofile(pathtest.."common.lua") functionthread_init(thread_id) set_vars() end functionevent(thread_id) localtable_name locali localc_val localk_val localpad_val table_name="sbtest"..sb_rand_uniform(1,oltp_tables_count) if(oltp_auto_inc)then i=0 else i=sb_rand_uniq(1,oltp_table_size) end k_val=sb_rand(1,oltp_table_size) c_val=sb_rand_str([[ ###########-###########-###########-###########-###########-###########-###########-###########-###########-###########]]) pad_val=sb_rand_str([[ ###########-###########-###########-###########-###########]]) rs=db_query("INSERTINTO"..table_name.. "(id,k,c,pad)VALUES"..string.format("(%d,%d,'%s','%s')",i,k_val,c_val,pad_val)) end
我比较喜欢sysbench0.5的一个地方(超过lua接口,肯定的!)是它现在带来一个配置项–report-intervaloption(我通常都是设置为=1),以便在脚本运行时你可以定时看到输出信息。不要等到运行结束是再得到反馈!这里有个用sysbench0.5的测试样例,通过本地hapoxy实例运行插入数据动作以及向在同一个PXC(PerconaXtrDBCluster)集群上的三个节点写数据动作,例如OpenStackTrove会做:
[root@pxc-control~]#./sys_haproxy.shrun sysbench0.5: multi-threadedsystemevaluationbenchmark Runningthetestwithfollowingoptions: Numberofthreads:3 Reportintermediateresultsevery1second(s) Randomnumbergeneratorseedis0andwillbeignored Threadsstarted! [ 1s]threads:3,tps:0.00,reads/s:0.00,writes/s:1099.28,responsetime:9.86ms(95%) [ 2s]threads:3,tps:0.00,reads/s:0.00,writes/s:973.02,responsetime:10.77ms(95%) [ 3s]threads:3,tps:0.00,reads/s:0.00,writes/s:1181.01,responsetime:6.23ms(95%) [ 4s]threads:3,tps:0.00,reads/s:0.00,writes/s:1103.00,responsetime:6.77ms(95%)
我也想让你注意到来自NilnandanJoshi博客的文章,NilnandanJoshi是来自Percona支持团队,在这篇文章中他介绍了在Debian7上编译构建sysbench0.5的一种方法。在这里非常感谢Nil的贡献!
我希望这篇文章可以帮组那些想要升级到sysbench0.5的同志,并且能质疑(探讨)-test=oltp去哪儿了。我很乐意看到你自己的关于sysbench用户案列,并且是否有其他人发布过他们自己的用于负载测试的lua脚本!