sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试。数据库目前支持MySQL/Oracle/PostgreSQL。本文只是简单演示一下几种测试的用法,具体的一些参数设置,需要根据不同的测试要求来进行调整。
测试环境
Ø DELL r310 PC Server MEM:16G RAID0:500G
Ø RHEL6.1 X86_64
Ø sysbench-0.4.12
编译安装
# wget http://sourceforge.net/projects/sysbench/files/latest/download # tar zxvf sysbench-0.4.12.tar.gz # cd sysbench-0.4.12 # ./configure \ –with-mysql-includes=/usr/local/mysql/include/ \ –with-mysql-libs=/usr/local/mysql/lib/ # make && make install |
如果需要测试Oracle/PostgreSQL,则在configure时需要加上–with-oracle或者–with-pgsql参数
参数
# sysbench 测试用例: sysbench [general-options]… –test=<test-name> [test-options]… command 通用选项: –num-threads=N 创建测试线程的数目。默认为1. –max-requests=N 请求的最大数目。默认为10000,0代表不限制。 –max-time=N 最大执行时间,单位是s。默认是0,不限制。 –forced-shutdown=STRING 超过max-time强制中断。默认是off。 –thread-stack-size=SIZE 每个线程的堆栈大小。默认是32K。 –init-rng=[on|off] 在测试开始时是否初始化随机数发生器。默认是off。 –test=STRING 指定测试项目名称。 –debug=[on|off] 是否显示更多的调试信息。默认是off。 –validate=[on|off] 在可能情况下执行验证检查。默认是off。 测试项目: fileio – File I/O test cpu – CPU performance test memory – Memory functions speed test threads – Threads subsystem performance test mutex – Mutex performance test(互斥性能测试) oltp – OLTP test (联机事务处理系统) 指令: prepare(测试前准备工作) run(正式测试) cleanup(测试后删掉测试数据) help version See ‘sysbench –test=<name> help’ for a list of options for each test. 查看每个测试项目的更多选项列表。 |
# ./sysbench –test=fileio help –file-num=N 创建测试文件的数量。默认是128 –file-block-size=N 测试时文件块的大小。默认是16384(16K) –file-total-size=SIZE 测试文件的总大小。默认是2G –file-test-mode=STRING 文件测试模式{seqwr(顺序写), seqrewr(顺序读写), seqrd(顺序读), rndrd(随机读), rndwr(随机写), rndrw(随机读写)} –file-io-mode=STRING 文件操作模式{sync(同步),async(异步),fastmmap(快速map映射),slowmmap(慢map映射)}。默认是sync –file-extra-flags=STRING 使用额外的标志来打开文件{sync,dsync,direct} 。默认为空 –file-fsync-freq=N 执行fsync()的频率。(0–不使用fsync())。默认是100 –file-fsync-all=[on|off] 每执行完一次写操作就执行一次fsync。默认是off –file-fsync-end=[on|off] 在测试结束时才执行fsync。默认是on –file-fsync-mode=STRING 使用哪种方法进行同步{fsync, fdatasync}。默认是fsync –file-merged-requests=N 如果可以,合并最多的IO请求数(0–表示不合并)。默认是0 –file-rw-ratio=N 测试时的读写比例。默认是1.5 |
# sysbench –test=cpu help –cpu-max-prime=N 最大质数发生器数量。默认是10000 |
# sysbench –test=memory help –memory-block-size=SIZE 测试时内存块大小。默认是1K –memory-total-size=SIZE 传输数据的总大小。默认是100G –memory-scope=STRING 内存访问范围{global,local}。默认是global –memory-hugetlb=[on|off] 从HugeTLB池内存分配。默认是off –memory-oper=STRING 内存操作类型。{read, write, none} 默认是write –memory-access-mode=STRING存储器存取方式{seq,rnd} 默认是seq |
# sysbench –test=threads help –thread-yields=N 每个请求产生多少个线程。默认是1000 –thread-locks=N 每个线程的锁的数量。默认是8 |
# sysbench –test=mutex help –mutex-num=N 数组互斥的总大小。默认是4096 –mutex-locks=N 每个线程互斥锁的数量。默认是50000 –mutex-loops=N 内部互斥锁的空循环数量。默认是10000 |
# sysbench –test=oltp help oltp options: –oltp-test-mode=STRING 执行模式{simple,complex(advanced transactional),nontrx(non-transactional),sp}。默认是complex –oltp-reconnect-mode=STRING 重新连接模式{session(不使用重新连接。每个线程断开只在测试结束),transaction(在每次事务结束后重新连接),query(在每个 SQL语句执行完重新连接),random(对于每个事务随机选择以上重新连接模式)}。默认是session –oltp-sp-name=STRING 存储过程的名称。默认为空 –oltp-read-only=[on|off] 只读模式。Update,delete,insert语句不可执行。默认是off –oltp-skip-trx=[on|off] 省略begin/commit语句。默认是off –oltp-range-size=N 查询范围。默认是100 –oltp-point-selects=N number of point selects [10] –oltp-simple-ranges=N number of simple ranges [1] –oltp-sum-ranges=N number of sum ranges [1] –oltp-order-ranges=N number of ordered ranges [1] –oltp-distinct-ranges=N number of distinct ranges [1] –oltp-index-updates=N number of index update [1] –oltp-non-index-updates=N number of non-index updates [1] –oltp-nontrx-mode=STRING 查询类型对于非事务执行模式{select, update_key, update_nokey, insert, delete} [select] –oltp-auto-inc=[on|off] AUTO_INCREMENT是否开启。默认是on –oltp-connect-delay=N 在多少微秒后连接数据库。默认是10000 –oltp-user-delay-min=N 每个请求最短等待时间。单位是ms。默认是0 –oltp-user-delay-max=N 每个请求最长等待时间。单位是ms。默认是0 –oltp-table-name=STRING 测试时使用到的表名。默认是sbtest –oltp-table-size=N 测试表的记录数。默认是10000 –oltp-dist-type=STRING 分布的随机数{uniform(均匀分布),Gaussian(高斯分布),special(空间分布)}。默认是special –oltp-dist-iter=N 产生数的迭代次数。默认是12 –oltp-dist-pct=N 值的百分比被视为’special’ (for special distribution)。默认是1 –oltp-dist-res=N ‘special’的百分比值。默认是75 General database options: –db-driver=STRING 指定数据库驱动程序(‘help’ to get list of available drivers) –db-ps-mode=STRING编制报表使用模式{auto, disable} [auto] Compiled-in database drivers: –mysql – MySQL driver mysql options: –mysql-host=[LIST,…] MySQL server host [localhost] –mysql-port=N MySQL server port [3306] –mysql-socket=STRING MySQL socket –mysql-user=STRING MySQL user [sbtest] –mysql-password=STRING MySQL password [] –mysql-db=STRING MySQL database name [sbtest] –mysql-table-engine=STRING storage engine to use for the test table {myisam,innodb,bdb,heap,ndbcluster,federated} [innodb] –mysql-engine-trx=STRING whether storage engine used is transactional or not {yes,no,auto} [auto] –mysql-ssl=[on|off] use SSL connections, if available in the client library [off] –myisam-max-rows=N max-rows parameter for MyISAM tables [1000000] –mysql-create-options=STRING additional options passed to CREATE TABLE [] |
测试
1、CPU测试
sysbench采用寻找最大素数的方式来测试CPU的性能
# sysbench –test=cpu –cpu-max-prime=20000 run sysbench 0.4.12: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 1 Doing CPU performance benchmark Threads started! Done. Maximum prime number checked in CPU test: 20000 Test execution summary: total time: 27.3193s total number of events: 10000 total time taken by event execution: 27.3180 per-request statistics: min: 2.73ms avg: 2.73ms max: 3.09ms approx. 95 percentile: 2.73ms Threads fairness: events (avg/stddev): 10000.0000/0.00 execution time (avg/stddev): 27.3180/0.00 |
2、线程数测试
thread-locks小于线程数除以2,lock越少,处理时间越长
# sysbench –test=threads –num-threads=512 –thread-yields=100 –thread-locks=2 run sysbench 0.4.12: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 512 Doing thread subsystem performance test Thread yields per test: 100 Locks used: 2 Threads started! Done. Test execution summary: total time: 0.2999s total number of events: 10000 total time taken by event execution: 143.0588 per-request statistics: min: 0.03ms avg: 14.31ms max: 290.74ms approx. 95 percentile: 86.57ms Threads fairness: events (avg/stddev): 19.5312/15.16 execution time (avg/stddev): 0.2794/0.01 |
3、磁盘IO性能测试
文件的大小:测试文件的大小应该大于内存,如果测试数据过小,内存缓存文件数据,则不能表示为一种i/o密集型的工作负载;
测试模式:
rndrw:合并的随机读写
rndwr:随机写入
rndrd:随机读取
seqrewr:顺序重写
seqwr:顺序写
生成测试文件à
首先生成需要的测试文件,文件总大小18G(DELL 服务器内存为16G),16个并发线程,随机读写模式。执行完后会在当前目录下生成一堆小文件:
# sysbench –test=fileio –num-threads=16 –file-total-size=18G –file-test-mode=rndrw prepare sysbench 0.4.12: multi-threaded system evaluation benchmark 128 files, 147456Kb each, 18432Mb total Creating files for the test… |
开始测试à
# sysbench –test=fileio –num-threads=16 –file-total-size=18G –file-test-mode=rndrw run sysbench 0.4.12: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 16 Extra file open flags: 0 128 files, 144Mb each 18Gb total file size Block size 16Kb Number of random requests for random IO: 10000 Read/Write ratio for combined random IO test: 1.50 Periodic FSYNC enabled, calling fsync() each 100 requests. Calling fsync() at the end of test, Enabled. Using synchronous I/O mode Doing random r/w test Threads started! Done. Operations performed: 5999 Read, 4001 Write, 12800 Other = 22800 Total Read 93.734Mb Written 62.516Mb Total transferred 156.25Mb (3.0139Mb/sec) 192.89 Requests/sec executed Test execution summary: total time: 51.8439s total number of events: 10000 total time taken by event execution: 42.6517 per-request statistics: min: 0.00ms avg: 4.27ms max: 1194.64ms approx. 95 percentile: 18.29ms Threads fairness: events (avg/stddev): 625.0000/94.90 execution time (avg/stddev): 2.6657/0.45 |
i/o子系统调整的主要信息:每秒的请求数量和总体的吞吐量:每秒192.89 个请求,每秒3.0139Mb传输量。
清理现场à
# sysbench –test=fileio –num-threads=16–file-total-size=18G –file-test-mode=rndrw cleanup sysbench 0.4.12: multi-threaded system evaluation benchmark Removing test files… |
4、内存测试
下面的参数指定了本次测试整个过程是在内存中传输 4G 的数据量,每个block大小为8K。
# sysbench –test=memory –num-threads=64 –memory-block-size=8192 –memory-total-size=4G run sysbench 0.4.12: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 64 Doing memory operations speed test Memory block size: 8K Memory transfer size: 4096M Memory operations type: write Memory scope type: global Threads started! Done. Operations performed: 524288 (942532.69 ops/sec) 4096.00 MB transferred (7363.54 MB/sec) Test execution summary: total time: 0.5563s total number of events: 524288 total time taken by event execution: 21.2037 per-request statistics: min: 0.00ms avg: 0.04ms max: 478.24ms approx. 95 percentile: 0.00ms Threads fairness: events (avg/stddev): 8192.0000/6258.63 execution time (avg/stddev): 0.3313/0.06 |
5、Mutex测试
测试mutex
# sysbench –test=mutex –num-threads=1500 –max-requests=2000 –mutex-num=10240 –mutex-locks=100000 –mutex-loops=15000 run sysbench 0.4.12: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 1500 Doing mutex performance test Threads started! Done. Test execution summary: total time: 26.3937s total number of events: 1500 total time taken by event execution: 37270.9321 per-request statistics: min: 19545.19ms avg: 24847.29ms max: 26349.79ms approx. 95 percentile: 26145.33ms Threads fairness: events (avg/stddev): 1.0000/0.00 execution time (avg/stddev): 24.8473/1.27 |
6、MySQL数据库测试
首先需要创建默认的sbtest数据库,或者使用–mysql-db指定一个已经存在的数据库
生成测试数据,引擎为myisam,表大小为1000000条记录
# sysbench –test=oltp –mysql-table-engine=myisam –oltp-table-size=1000000 –mysql-user=root –mysql-socket=/var/run/mysqld/mysql5.socket prepare sysbench 0.4.12: multi-threaded system evaluation benchmark No DB drivers specified, using mysql Creating table ‘sbtest’… Creating 1000000 records in table ‘sbtest’… # mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 14087 Server version: 5.5.20-ndb-7.2.5-log Source distribution Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL v2 license Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement. mysql> desc sbtest.sbtest; +——-+——————+——+—–+———+—————-+ | Field | Type | Null | Key | Default | Extra | +——-+——————+——+—–+———+—————-+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | k | int(10) unsigned | NO | MUL | 0 | | | c | char(120) | NO | | | | | pad | char(60) | NO | | | | +——-+——————+——+—–+———+—————-+ 4 rows in set (0.00 sec) mysql> |
执行测试à
# sysbench –test=oltp –mysql-table-engine=myisam –oltp-table-size=1000000 –mysql-user=root –mysql-socket=/var/run/mysqld/mysql5.socket runsysbench sysbench 0.4.12: multi-threaded system evaluation benchmark No DB drivers specified, using mysql Running the test with following options: Number of threads: 1 Doing OLTP test. Running mixed OLTP test Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases) Using “LOCK TABLES WRITE” for starting transactions Using auto_inc on the id column Maximum number of requests for OLTP test is limited to 10000 Threads started! Done. OLTP test statistics: queries performed: read: 140000 write: 50000 other: 20000 total: 210000 transactions: 10000 (534.56 per sec.) deadlocks: 0 (0.00 per sec.) read/write requests: 190000 (10156.56 per sec.) other operations: 20000 (1069.11 per sec.) —-事务数总计,每秒的事务处理量 Test execution summary: total time: 18.7071s total number of events: 10000 total time taken by event execution: 18.6649 per-request statistics: min: 1.68ms avg: 1.87ms max: 2.64ms approx. 95 percentile: 1.95ms —每个请求的统计信息 Threads fairness: —线程权重信息,工作负荷如何被均匀分配 events (avg/stddev): 10000.0000/0.00 execution time (avg/stddev): 18.6649/0.00 |
清理现场à
# sysbench –test=oltp –mysql-table-engine=myisam –oltp-table-size=1000000 –mysql-user=root –mysql-socket=/var/run/mysqld/mysql5.socket cleanup sysbench 0.4.12: multi-threaded system evaluation benchmark No DB drivers specified, using mysql Dropping table ‘sbtest’… Done. |