现在的位置: 首页 > 综合 > 正文

sysbench的安装和性能测试

2013年11月06日 ⁄ 综合 ⁄ 共 8011字 ⁄ 字号 评论关闭

介绍

sysbench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。关于这个项目的详细介绍请看:http://sysbench.sourceforge.net。
它主要包括以下几种方式的测试:
1、cpu性能
2、磁盘io性能
3、调度程序性能,互斥体性能
4、内存分配及传输速度
5、POSIX线程性能
6、数据库性能(OLTP基准测试)
目前sysbench主要支持 MySQL,pgsql,oracle 这3种数据库。

一、安装

首先,在 http://sourceforge.net/projects/sysbench 下载源码包。
接下来,按照以下步骤安装:

tar zxf sysbench-0.4.8.tar.gz
cd sysbench-0.4.8
./configure && make && make install
strip /usr/local/bin/sysbench

以上方法适用于 MySQL 安装在标准默认目录下的情况,如果 MySQL 并不是安装在标准目录下的话,那么就需要自己指定 MySQL 的路径了。比如我的 MySQL 喜欢自己安装在 /usr/local/mysql 下,则按照以下方法编译:

/configure --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/mysql/lib && make && make install
注意:指定mysql位置:
 ./configure --with-mysql-includes=/data/mysql/3307/include/mysql --with-mysql-libs=/data/mysql/3307/lib/mysql
 find / -name mysql -print
 find / -name mysql.h -print 

当然了,用上面的参数编译的话,就要确保你的 MySQL lib目录下有对应的 so 文件,如果没有,可以自己下载 devel 或者 share 包来安装。
另外,如果想要让 sysbench 支持 pgsql/oracle 的话,就需要在编译的时候加上参数
--with-pgsql
或者
--with-oracle
这2个参数默认是关闭的,只有 MySQL 是默认支持的。

二、开始测试

编译成功之后,就要开始测试各种性能了,测试的方法官网网站上也提到一些,但涉及到 OLTP 测试的部分却不够准确。在这里我大致提一下:
1、cpu性能测试

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

cpu测试主要是进行素数的加法运算,在上面的例子中,指定了最大的素数为 20000,自己可以根据机器cpu的性能来适当调整数值。

2、线程测试

sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run

3、磁盘IO性能测试

sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw prepare
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw run
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw cleanup

上述参数指定了最大创建16个线程,创建的文件总大小为3G,文件读写模式为随机读。

4、内存测试

sysbench --test=memory --memory-block-size=8k --memory-total-size=4G run

上述参数指定了本次测试整个过程是在内存中传输 4G 的数据量,每个 block 大小为 8K。

5、互斥体性能测试

sysbench --test=mutex --num-threads=16 --mutex-num=1024 --mutex-locks=10000 --mutex-loops=5000 run

6、OLTP测试

sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=1000000 \
--mysql-socket=/tmp/mysql.sock --mysql-user=test --mysql-host=localhost \
--mysql-password=test prepare

上述参数指定了本次测试的表存储引擎类型为 myisam,这里需要注意的是,官方网站上的参数有一处有误,即 --mysql-table-engine,官方网站上写的是 --mysql-table-type,这个应该是没有及时更新导致的。另外,指定了表最大记录数为 1000000,其他参数就很好理解了,主要是指定登录方式。测试 OLTP 时,可以自己先创建数据库 sbtest,或者自己用参数 --mysql-db 来指定其他数据库。--mysql-table-engine 还可以指定为 innodb 等 MySQL
支持的表存储引擎类型。

   MySQL OLTP测试:

    (1) OLTP测试准备阶段:

 root>$sysbench --num-threads=8  --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000 --mysql-user=root  --mysql-password=root --mysql-db=test --mysql-socket=/tmp/mysql.sock prepare

    (2) OLTP测试运行阶段:

root>$sysbench --num-threads=8  --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000 --mysql-user=root  --mysql-password=root --mysql-db=test --mysql-socket=/tmp/mysql.sock run

    (3) OLTP测试清理阶段:

root>$sysbench --num-threads=8  --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000 --mysql-user=root  --mysql-password=root --mysql-db=test --mysql-socket=/tmp/mysql.sock cleanup

在进行OLTP测试时遇到的一些问题及解决办法:

   1 数据库连接数200: 出现问题error 1040: Too many connections:

[root@server170 test]# sysbench --num-threads=200/400/600/800/1000  --test=oltp --mysql-table-engine=innodb --oltp-table
-size=1000000 --mysql-user=root  --mysql-password=root --mysql-db=test --mysql-socket=/tmp/mysql.sock run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

No DB drivers specified, using mysql
FATAL: unable to connect to MySQL server, aborting...
FATAL: error 1040: Too many connections
FATAL: failed to connect to database server!
FATAL: thread#152: failed to connect to database server, aborting...
[root@server170 test]#

解决思路:

          mysql> show status like 'max_used_connections';
          修改配置my.cnf

          max_connections=16384 (默认值100,比较小,建议增大,可以修改为:16384)
          重启Mysql服务器

          max_connections = n MySQL服务器同时处理的数据库连接的最大数量(默认设置是100)。

2  数据库连接数2000:error 1040: Too many connections

[root@server170 ~]# sysbench --num-threads=2000  --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000 --mysql-user=root  --mysql-password=root --mysql-db=test --mysql-socket=/tmp/mysql.sock run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

No DB drivers specified, using mysql
FATAL: unable to connect to MySQL server, aborting...
FATAL: error 1040: Too many connections
FATAL: failed to connect to database server!
FATAL: thread#1000: failed to connect to database server, aborting...
[root@server170 ~]# sysbench --num-threads=2000  --test=oltp --mysql-table-engine=innodb --oltp-table-s
ize=1000000 --mysql-user=root  --mysql-password=root --mysql-db=test --mysql-socket=/tmp/mysql.sock runsysbench 0.4.12:  multi-threaded system evaluation benchmark

[root@server170 ~]# sysbench --num-threads=2000  --test=oltp --mysql-table-engine=innodb --oltp-table-s
ize=1000000 --mysql-user=root  --mysql-password=root --mysql-db=test --mysql-socket=/tmp/mysql.sock runsysbench 0.4.12:  multi-threaded system evaluation benchmark

No DB drivers specified, using mysql
FATAL: unable to connect to MySQL server, aborting...
FATAL: error 2013: Lost connection to MySQL server at 'reading initial communication packet', system error: 0
FATAL: failed to connect to database server!
FATAL: thread#1008: failed to connect to database server, aborting...

解决思路:

(1)在my.cnf [mysqld]下面加了配置项skip_name_resolve  -->禁用DNS

 修改参数    open_files_limit = 65535

 原来 mysql 中的 open_files_limit 只是限制 mysql 这个进程打开的最大文件个数。

3 数据库连接数3000:FATAL: error 2001: Can't create UNIX socket (24)

[root@server170 ~]# sysbench --num-threads=3000  --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000 --mysql-user=root  --mysql-password=root --mysql-db=test --mysql-socket=/tmp/mysql.sock run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

No DB drivers specified, using mysql
FATAL: unable to connect to MySQL server, aborting...
FATAL: error 2001: Can't create UNIX socket (24)
FATAL: failed to connect to database server!
FATAL: thread#1021: failed to connect to database server, aborting...
[root@server170 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
pending signals                 (-i) 1024
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 32767
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@server170 ~]# ulimit -n 10240
[root@server170 ~]# ulimit -a
core file size          (blocks, -c) 0

(1) 解决思路:

而Linux内核也会对 mysql 打开的进程数进行限制,并且优先级要高。

通过 ulimit -a 查看 mysql 这个用户的最大打开文件个数,发现其值为 1024(linux 默认都是1024)。

open files                      (-n) 1024

通过修改 /etc/security/limits.conf 配置文件,添加如下行:

*                -       nofile          4096,把该限制放大。

4 数据库连接数2000:Can't create more than max_prepared_stmt_count statements

MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)"

[root@server170 etc]# sysbench --num-threads=2000  --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000 --mysql-user=root  --mysql-password=root --mysql-db=test --mysql-socket=/tmp/mysql.sock run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

No DB drivers specified, using mysql
FATAL: mysql_stmt_prepare() failed
FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)"
FATAL: thread#1638: failed to prepare statements for test

解决思路:

my.cnf  [mysqld]下面加了配置项

max_prepared_stmt_count=1048576默认值:16382 值域:0~1048576

5 数据库连接数8000:MySQL error: 5 "Out of memory (Needed 8164 bytes)":

[root@server170 ~]# sysbench --num-threads=8000  --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000 --mysql-user=root  --mysql-password=root --mysql-db=test --mysql-socket=/tmp/mysql.sock run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

No DB drivers specified, using mysql
FATAL: mysql_stmt_prepare() failed
FATAL: MySQL error: 5 "Out of memory (Needed 8164 bytes)"
FATAL: thread#6556: failed to prepare statements for test

解决思路:

参考:

sysbench0.5 版本安装参考:http://www.zhdba.com/mysqlops/2013/09/28/mariadb-sysbench-0-5/

sysbench 0.5使用手册:http://mingxinglai.com/cn/2013/07/sysbench/
Sysbench OLTP 性能测试: MySQL-5.6 vs. MariaDB-10.0:http://www.oschina.net/question/12_46098

Sysbench测试脚本及my.cnf配置测试结果:http://bazaar.launchpad.net/~ahel/maria/mariadb-benchmarks/revision/20/sysbench-runs/series15/my.cnf.01#sysbench-runs/series15/my.cnf.01

sysbench测试MySQL服务器性能(cpu,io,内存,mysql等):http://m.blog.csdn.net/blog/mchdba/8970056

抱歉!评论已关闭.