sysbench介绍
sysbench是一个模块化的、跨平台、多线程基准测试工具,主要用于测试系统及数据库的性能。它主要包括以下几种方式的测试:
1、cpu性能(系统级别)
2、磁盘io性能(系统级别)
3、调度程序性能(系统级别)
4、内存分配及传输速度(系统级别)
5、POSIX线程性能(系统级别)
6、数据库性能(OLTP基准测试)
目前sysbench主要支持 MySQL,pgsql,oracle 这3种数据库。
2. 命令格式:
sysbench [common-options] --test=name [test-options] command
Common-option list:
Option | Description | Default value |
--num-threads | The total number of worker threads to create | 1 |
--max-requests | Limit for total number of requests. 0 means unlimited | 10000 |
--max-time | Limit for total execution time in seconds. 0 (default) means unlimited | 0 |
--forced-shutdown | Amount of time to wait after --max-time before forcing shutdown. The value can be either an absolute number of seconds or as a percentage of the " | off |
--thread-stack-size | Size of stack for each thread | 32K |
--init-rnd | Specifies if random numbers generator should be initialized from timer before the test start | off |
--test | Name of the test mode to run | Required |
--debug | Print more debug info | off |
--validate | Perform validation of test results where possible | off |
--help | Print help on general syntax or on a test mode specified with --test, and exit | off |
--verbosity | Verbosity level (0 - only critical messages, 5 - debug) | 4 |
--percentile | SysBench measures execution times for all processed requests to display statistical information like minimal, average and maximum execution time. For most benchmarks it is also useful to know a request execution time value matching some percentile (e.g. 95% percentile means we should drop 5% of the most long requests and choose the maximal value from the remaining ones). This option allows to specify a percentile rank of query execution times to count | 95 |
--batch | Dump current results periodically | off |
--batch-delay | Delay between batch dumps in secods | 300 |
--validate | Perform validation of test results where possible | off |
3. 测试CPU
sysbench --test=cpu --cpu-max-prime=20000 run
cpu测试主要是进行素数的加法运算,在上面的例子中,指定了最大的素数为 20000,自己可以根据机器cpu的性能来适当调整数值。
4. 线程测试
sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run
5.磁盘IO性能测试
准备对IO测试
./sysbench --test=fileio --num-threads=16 --file-total-size=
数据量一定要大于内存可存放的数据量。因为内存可以保存数据,那么操作系统会缓存这些数据,以及I/O边界测试就不能反映出正确的结果了。我们来创建一个数据集
开始测试
./sysbench --test=fileio --num-threads=16 --file-total-size=
清除测试数据
./sysbench --test=fileio --num-threads=16 --file-total-size=
上述参数指定了最大创建16个线程,创建的文件总大小为3G,文件读写模式为随机读。
6. 内存测试
sysbench --test=memory --memory-block-size=8k --memory-total-size=4G run
上述参数指定了本次测试整个过程是在内存中传输 4G 的数据量,每个 block 大小为 8K。
7. OLTP测试(mysql数据库的基准测试)
准备数据
./sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test --mysql-user=root
prepare
开始测试
./sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test --mysql-user=root --
max-time=60 --oltp-read-only=on --max-requests=0 --num-threads=8 run
运行8个并发下,60s内只读的基准测试。
sysbench --num-threads=8 --max-requests=1000000 --test=oltp --mysql-table-engine=innodb --oltp-table-size=10000000 --mysql-socket=/tmp/mysql.sock --mysql-user=root --mysql-host=localhost --mysql-password=xxxx --mysql-db=sbtest run
上述参数指定了本次测试的表存储引擎类型为 myisam,这里需要注意的是,官方网站上的参数有一处有误,即 --mysql-table-engine,官方网站上写的是 --mysql-table-type,这个应该是没有及时更新导致的。另外,指定了表最大记录数为 1000000,其他参数就很好理解了,主要是指定登录方式。测试 OLTP 时,可以自己先创建数据库 sbtest,或者自己用参数 --mysql-db 来指定其他数据库 。--mysql-table-engine 还可以指定为 innodb 等 MySQL 支持的表存储引擎类型。
下面是相关的配置
Option | Description | Default value | ||||||||
--oltp-test-mode | Execution mode (see above). Possible values: simpe (simple), complex (advanced transactional) and nontrx (non-transactional) | complex | ||||||||
--oltp-read-only | Read-only mode. No UPDATE , DELETE or INSERT queries will be performed. | off | ||||||||
--oltp-skip-trx | Omit BEGIN /COMMIT statements, i.e. run the same queries as the test would normally run but without using transactions. | off | ||||||||
--oltp-reconnect-mode | Reconnect mode. Possible values:
| session | ||||||||
--oltp-range-size | Range size for range queries | 100 | ||||||||
--oltp-point-selects | Number of point select queries in a single transaction | 10 | ||||||||
--oltp-simple-ranges | Number of simple range queries in a single transaction | 1 | ||||||||
--oltp-sum-ranges | Number of SUM range queries in a single transaction | 1 | ||||||||
--oltp-order-ranges | Number of ORDER range queries in a single transaction | 1 | ||||||||
--oltp-distinct-ranges | Number of DISTINCT range queries in a single transaction | 1 | ||||||||
--oltp-index-updates | Number of index UPDATE queries in a single transaction | 1 | ||||||||
--oltp-non-index-updates | Number of non-index UPDATE queries in a single transaction | 1 | ||||||||
--oltp-nontrx-mode | Type of queries for non-transactional execution mode (see above). Possible values: select , update_key , update_nokey , insert , delete . | select | ||||||||
--oltp-connect-delay | Time in microseconds to sleep after each connection to database | 10000 | ||||||||
--oltp-user-delay-min | Minimum time in microseconds to sleep after each request | 0 | ||||||||
--oltp-user-delay-max | Maximum time in microseconds to sleep after each request | 0 | ||||||||
--oltp-table-name | Name of the test table | sbtest | ||||||||
--oltp-table-size | Number of rows in the test table | 10000 | ||||||||
--oltp-dist-type | Distribution of random numbers. Possible values: With special distribution a specified percent of numbers is generated in a specified percent of cases (see options below). | special | ||||||||
--oltp-dist-pct | Percentage of values to be treated as 'special' (for special distribution) | 1 | ||||||||
--oltp-dist-res | Percentage of cases when 'special' values are generated (for special distribution) | 75 | ||||||||
--db-ps-mode | If the database driver supports Prepared Statements API, SysBench will use server-side prepared statements for all queries where possible. Otherwise, client-side (or emulated) prepared statements will be used. This option allows to force using emulation even when PS API is available. Possible values: disable , auto . | auto |
Also, each database driver may provide its own options. Currently only MySQL driver is available. Below is a list of MySQL-specific options:
Option | Description | Default value |
--mysql-host | MySQL server host. Starting from version 0.4.5 you may specify a list of hosts separated by commas. In this case SysBench will distribute connections between specified MySQL hosts on a round-robin basis. Note that all connection ports and passwords must be the same on all hosts. Also, databases and tables must be prepared explicitely on each host before executing the benchmark. | localhost |
--mysql-port | MySQL server port (in case TCP/IP connection should be used) | 3306 |
--mysql-socket | Unix socket file to communicate with the MySQL server | |
--mysql-user | MySQL user | user |
--mysql-password | MySQL password | |
--mysql-db | MySQL database name. Note SysBench will not automatically create this database. You should create it manually and grant the appropriate privileges to a user which will be used to access the test table. | sbtest |
--mysql-table-engine | Type of the test table. Possible values: myisam , innodb , heap , ndbcluster , bdb , maria , falcon , pbxt | innodb |
--mysql-ssl | Use SSL connections. | no |
--myisam-max-rows | MAX_ROWS option for MyISAM tables (required for big tables) | 1000000 |
--mysql-create-options | Additional options passed to CREATE TABLE. |
默认情况下,OLTP会创建一个100行的数据库,数据库具体的定义为
CREATE TABLE `sbtest` (
`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`);
执行模分为:
1)Simple
SELECT c FROM sbtest WHERE id=N
其中N是1到--oltp-range-size
的随机值
2)Advanced transactional
每个事物包含下列语句:
- Point queries:
SELECT c FROM sbtest WHERE id=N
- Range queries:
SELECT c FROM sbtest WHERE id BETWEEN N AND M
- Range SUM() queries:
SELECT SUM(K) FROM sbtest WHERE id BETWEEN N and M
- Range ORDER BY queries:
SELECT c FROM sbtest WHERE id between N and M ORDER BY c
- Range DISTINCT queries:
SELECT DISTINCT c FROM sbtest WHERE id BETWEEN N and M ORDER BY c
- UPDATEs on index column:
UPDATE sbtest SET k=k+1 WHERE id=N
- UPDATEs on non-index column:
UPDATE sbtest SET c=N WHERE id=M
- DELETE queries:
DELETE FROM sbtest WHERE id=N
- INSERT queries:
INSERT INTO sbtest VALUES (...)
这个类似于simple mode,但你可以选择任意的sql语句去测试,可选择的sql语句有:
- Point queries:
SELECT pad FROM sbtest WHERE id=N
- UPDATEs on index column:
UPDATE sbtest SET k=k+1 WHERE id=N
- UPDATEs on non-index column:
UPDATE sbtest SET c=N WHERE id=M
- DELETE queries:
DELETE FROM sbtest WHERE id=N
- INSERT queries:
INSERT INTO sbtest (k, c, pad) VALUES(N, M, S)
8. 互斥锁测试(mutex)
在大部分时间,线程并发的情形下,仅仅获取互斥锁来测量互斥性能。(互斥十一哥数据结果,保证了独自的访问一些资源,避免了并发访问所引起的问题。)