SysBench是一个跨平台且支持多线程的模块化基准测试工具,用于评估系统在运行高负载的数据库时相关核心参数的性能表现。它目的是为了绕过复杂的数据库基准设置,甚至在没有安装数据库的前提下,快速了解数据库系统的性能。
sysbench主要支持以下几种测试模式:
- CPU运算性能
- 磁盘IO性能
- 调度程序性能
- 内存分配及传输速度
- POSIX线程性能
- 数据库性能(OLTP基准测试)
目前sysbench主要支持 MySQL,Drizzle,PgSQL,Oracle等几种数据库。
1、sysbench安装:
二进制包安装
- Debian/Ubuntu
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash sudo apt-get -y install sysbench
- RHEL/CentOS:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash sudo yum -y install sysbench
- Fedora:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash sudo dnf -y install sysbench
源码安装
- RHEL/CentOS
1、安装依赖:
$ yum -y install gcc gcc-c++ make automake libtool pkgconfig libaio-devel vim-common $ yum -y install zlib zlib-devel openssl openssl-devel mysql mysql-devel
2、编译安装sysbench:
$ git clone https://github.com/akopytov/sysbench.git $ cd sysbench $ ./autogen.sh $ ./configure --prefix=/opt/sysbench # Add --with-pgsql to build with PostgreSQL support $ make $ sudo make install
2、OLTP场景测试:
2.1、数据初始化:
$ sysbench \ /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \ --db-driver=mysql \ --mysql-host=1.1.1.1 \ --mysql-port=3306 \ --mysql-user=root \ --mysql-password=xxxx \ --mysql-db=sysbench \ --oltp_tables_count=10 \ --oltp-table-size=100000 \ --rand-init=on \ prepare sysbench 1.0.6 (using bundled LuaJIT 2.1.0-beta2) Creating table 'sbtest1'... Inserting 100000 records into 'sbtest1' Creating secondary indexes on 'sbtest1'... Creating table 'sbtest2'... Inserting 100000 records into 'sbtest2' Creating secondary indexes on 'sbtest2'... Creating table 'sbtest3'... Inserting 100000 records into 'sbtest3' Creating secondary indexes on 'sbtest3'... Creating table 'sbtest4'... Inserting 100000 records into 'sbtest4' Creating secondary indexes on 'sbtest4'... Creating table 'sbtest5'... Inserting 100000 records into 'sbtest5' Creating secondary indexes on 'sbtest5'... Creating table 'sbtest6'... Inserting 100000 records into 'sbtest6' Creating secondary indexes on 'sbtest6'... Creating table 'sbtest7'... Inserting 100000 records into 'sbtest7' Creating secondary indexes on 'sbtest7'... Creating table 'sbtest8'... Inserting 100000 records into 'sbtest8' Creating secondary indexes on 'sbtest8'... Creating table 'sbtest9'... Inserting 100000 records into 'sbtest9' Creating secondary indexes on 'sbtest9'... Creating table 'sbtest10'... Inserting 100000 records into 'sbtest10' Creating secondary indexes on 'sbtest10'...
命令行参数解读:
参数 | 说明 |
---|---|
oltp_legacy/oltp.lua | 调用的脚本进行oltp模式测试 |
–db-driver | 指定使用的数据库的驱动程序 |
–mysql-host | 压测的mysql的服务器IP地址 |
–mysql-user | 提供给sysbench的mysql用户名 |
–mysql-port | mysql实例的端口号 |
–mysql-password | 上述mysql用户的密码 |
–mysql-db | 压测的database name(需要提前创建) |
–oltp_tables_count | 指定生成测试表的数量 |
–oltp-table-size | 指定每个测试表填充数据量(行) |
–rand-init | 每个测试表都是用随机数据来填充的(默认为off) |
真实测试场景中,数据表建议不低于10个,单表数据量不低于500万行,当然了,要视服务器硬件配置而定。如果是配备了SSD或者PCIE SSD这种高IOPS设备的话,则建议单表数据量最少不低于1亿行。
2.2、OLTP测试:
$ sysbench \ /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \ --db-driver=mysql \ --mysql-host=1.1.1.1 \ --mysql-port=3306 \ --mysql-user=root \ --mysql-password=xxxx \ --mysql-db=sysbench \ --oltp_tables_count=10 \ --oltp-table-size=10000000 \ --threads=8 \ --oltp-read-only=off \ --report-interval=10 \ --rand-type=uniform \ --time=60 \ --events=0 \ --percentile=99 \ run sysbench 1.0.6 (using bundled LuaJIT 2.1.0-beta2) Running the test with following options: Number of threads: 8 Report intermediate results every 10 second(s) Initializing random number generator from current time Initializing worker threads... Threads started! [ 10s ] thds: 8 tps: 441.99 qps: 8855.05 (r/w/o: 6199.09/456.69/2199.27) lat (ms,99%): 28.67 err/s: 0.00 reconn/s: 0.00 [ 20s ] thds: 8 tps: 434.81 qps: 8696.19 (r/w/o: 6087.33/447.91/2160.95) lat (ms,99%): 29.72 err/s: 0.00 reconn/s: 0.00 [ 30s ] thds: 8 tps: 444.20 qps: 8884.03 (r/w/o: 6218.82/457.30/2207.91) lat (ms,99%): 27.66 err/s: 0.00 reconn/s: 0.00 [ 40s ] thds: 8 tps: 438.49 qps: 8770.52 (r/w/o: 6140.01/452.79/2177.73) lat (ms,99%): 30.26 err/s: 0.10 reconn/s: 0.00 [ 50s ] thds: 8 tps: 418.48 qps: 8368.70 (r/w/o: 5857.82/430.68/2080.20) lat (ms,99%): 30.81 err/s: 0.00 reconn/s: 0.00 [ 60s ] thds: 8 tps: 417.33 qps: 8348.20 (r/w/o: 5843.72/431.33/2073.15) lat (ms,99%): 36.89 err/s: 0.00 reconn/s: 0.00 SQL statistics: queries performed: read: 363482 write: 26770 other: 129006 total: 519258 transactions: 25962 (432.60 per sec.) queries: 519258 (8652.21 per sec.) ignored errors: 1 (0.02 per sec.) reconnects: 0 (0.00 per sec.) General statistics: total time: 60.0126s total number of events: 25962 Latency (ms): min: 5.54 avg: 18.49 max: 218.13 99th percentile: 30.26 sum: 479982.91 Threads fairness: events (avg/stddev): 3245.2500/12.65 execution time (avg/stddev): 59.9979/0.00
命令行参数解读:
参数 | 说明 |
---|---|
–threads | 发起N个并发连接 |
–oltp-read-only=off | 不要进行只读测试,采用读写混合模式测试 |
–report-interval=10 | 每10秒输出一次测试进度报告 |
–rand-type=uniform | 表示随机类型为固定模式,其他几个可选随机模式:uniform(固定),gaussian(高斯),special(特定的),pareto(帕累托) |
–time | 压测时长为N秒 |
–events=0 | 表示总请求数为 0,因为上面已经定义了总执行时长,所以总请求数可以设定为 0;也可以只设定总请求数,不设定最大执行时长 |
–percentile=99 | 表示设定采样比例,默认是 95%,即丢弃1%的长请求,在剩余的99%里取最大值 |
测试结果解读:
Threads started! # 每10秒钟报告一次测试结果,tps、qps,每秒读、每秒写、99%以上的响应时长统计 [ 60s ] thds: 8 tps: 417.33 qps: 8348.20 (r/w/o: 5843.72/431.33/2073.15) lat (ms,99%): 36.89 err/s: 0.00 reconn/s: 0.00 SQL statistics: queries performed: read: 363482 # 读总数 write: 26770 # 写总数 other: 129006 # 其他操作总数(SELECT、INSERT、UPDATE、DELETE之外的操作,例如COMMIT等) total: 519258 # 全部总数 transactions: 25962 (432.60 per sec.) # 总事务数(每秒事务数) queries: 519258 (8652.21 per sec.) # 读写总数(每秒读写次数) ignored errors: 1 (0.02 per sec.) # 忽略的错误数 reconnects: 0 (0.00 per sec.) General statistics: ## 一些统计信息 total time: 60.0126s ## 总耗时 total number of events: 25962 ## 事务总数 Latency (ms): ## 响应统计 min: 5.54 ## 最小耗时 avg: 18.49 ## 平均耗时 max: 218.13 ## 最长耗时 99th percentile: 30.26 ## 超过99%平均耗时 sum: 479982.91 Threads fairness: ## events (avg/stddev): 3245.2500/12.65 execution time (avg/stddev): 59.9979/0.00
2.3、测试数据的清理:
$ sysbench \ /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \ --db-driver=mysql \ --mysql-host=1.1.1.1 \ --mysql-port=3306 \ --mysql-user=root \ --mysql-password=xxxx \ --mysql-db=sysbench \ --oltp_tables_count=10 \ cleanup sysbench 1.0.6 (using bundled LuaJIT 2.1.0-beta2) Dropping table 'sbtest1'... Dropping table 'sbtest2'... Dropping table 'sbtest3'... Dropping table 'sbtest4'... Dropping table 'sbtest5'... Dropping table 'sbtest6'... Dropping table 'sbtest7'... Dropping table 'sbtest8'... Dropping table 'sbtest9'... Dropping table 'sbtest10'...
暂无评论