数据库压测工具SysBench


简介

SysBench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。它主要包括以下几种方式的测试:cpu性能、磁盘io性能、调度程序性能、内存分配及传输速度、POSIX线程性能、数据库性能(OLTP基准测试)。 目前SysBench主要支持 MySQL,pgsql,oracle这3种数据库。

SysBench的测试原理: 通过自动向数据库里构造出来大量的数据,然后执行相关增删查改以及事务提交的操作,记录整个过程耗时情况;同时可以实现模拟几千个线程并发的访问数据库,模拟使用各种各样的操作,实现模拟出几十万的TPS去压测数据库,达到对数据库性能的基本了解。

安装

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench

查看安装的版本号

sysbench --version

使用

构建测试数据

基于SysBench构建10个测试表(可以配置更多但是要注意磁盘空间是否足够),每个表里有100万条数据,接着使用10个并发线程去对这个数据库发起访问, 连续访问5分钟,也就是300秒,然后对其进行压力测试。下面是在demo_user这个库里面做测试,shell命令如下:

sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.102 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=demo_user --tables=10 --table_size=1000000 oltp_read_write --db-ps-mode=disable prepare

命令解析:

  • –db-driver=mysql 指定数据库驱动
  • –time=300:连续访问300秒
  • –threads=10:用10个线程模拟并发访问
  • –report-interval=1:每隔1秒输出一下压测情况
  • –mysql-host=127.0.0.1 地址
  • –mysql-port=3306 端口号
  • –mysql-user=root 用户名
  • –mysql-password=123456 密码
  • –mysql-db=demo_user 数据库名称
  • –tables=10 建多少张表
  • –table_size=1000000:每张表的数据量
  • oltp_read_write:这个就是说,执行oltp数据库的读写测试
  • –db-ps-mode=disable:这个就是禁止ps模式

最后有一个prepare,意思是参照这个命令的设置去构造出需要的数据,它会自动创建10个测试表,然后向每个表里插入100万条测试数据。

对数据库进行360度的全方位测试

  • 测试数据库的综合读写TPS,使用的是oltp_read_write模式:
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.102 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=demo_user --tables=10 --table_size=1000000 oltp_read_write --db-ps-mode=disable run
  • 测试数据库的只读性能,使用的是oltp_read_only模式:
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.102 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=demo_user --tables=10 --table_size=1000000 oltp_read_only --db-ps-mode=disable run
  • 测试数据库的删除性能,使用的是oltp_delete模式:
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.102 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=demo_user --tables=10 --table_size=1000000 oltp_delete --db-ps-mode=disable run
  • 测试数据库的更新索引字段的性能,使用的是oltp_update_index模式:
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.102 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=demo_user --tables=10 --table_size=1000000 oltp_update_index --db-ps-mode=disable run
  • 测试数据库的更新非索引字段的性能,使用的是oltp_update_non_index模式:
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.102 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=demo_user --tables=10 --table_size=1000000 oltp_update_non_index --db-ps-mode=disable run
  • 测试数据库的插入性能,使用的是oltp_insert模式:
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.102 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=demo_user --tables=10 --table_size=1000000 oltp_insert --db-ps-mode=disable run
  • 测试数据库的写入性能,使用的是oltp_write_only模式:
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.102 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=demo_user --tables=10 --table_size=1000000 oltp_write_only --db-ps-mode=disable run
  • 完成压测之后,可以执行下面的cleanup命令,清理数据
sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=192.168.56.102 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=demo_user --tables=10 --table_size=1000000 oltp_read_write --db-ps-mode=disable cleanup

压测结果分析

[ 22s ] thds: 10 tps: 380.99 qps: 7312.66 (r/w/o: 5132.99/1155.86/1321.35) lat (ms, 95%): 21.33 err/s: 0.00 reconn/s:0.00
  • 22s: 第22s输出的一段压测统计报告
  • thds: 10,有10个线程在压测
  • tps: 380.99,每秒执行了380.99个事务
  • qps: 7610.20,每秒可以执行7610.20个请求
  • (r/w/o: 5132.99/1155.86/1321.35),在每秒7610.20个请求中,有5132.99个请求是读请求,1155.86个请求是写请求,1321.35个请求是其他的请求,就是对QPS进行了拆解
  • lat (ms, 95%): 21.33,95%的请求的延迟都在21.33毫秒以下
  • err/s: 0.00 reconn/s: 0.00,每秒有0个请求是失败的,发生了0次网络重连.

这个压测结果会根据测试机器的性能不同有很大的差距,要是测试机器性能特别高,那么可以开很多的并发线程去压测,比如100个线程,此时可能会发现数据库每秒的TPS有上千个,如果你的机器性能很低,可能压测出来你的TPS才二三十个、QPS 才几百个。

注意:在完成压测之后,最后会显示一个总的压测报告。

SQL statistics:
    queries performed: read: 1480084 // 在300s的压测期间执行了148万多次的读请求
    write: 298457 // 在压测期间执行了29万多次的写请求 
    other: 325436 // 在压测期间执行了30万多次的其他请求 
    total: 2103977 // 一共执行了210万多次的请求
    // 这是说一共执行了10万多个事务,每秒执行350多个事务 
    transactions: 105180( 350.6 per sec. ) 
    // 这是说一共执行了210万多次的请求,每秒执行7000+请求
    queries: 2103977 ( 7013.26 per sec. ) 
    ignored errors: 0 (0.00 per sec.) 
    reconnects: 0 (0.00 per sec.)
// 下面就是说,一共执行了300s的压测,执行了10万+的事务 
General staticstics:
    total time: 300.0052s 
    total number of events: 105180
Latency (ms): 
    min: 4.32 // 请求中延迟最小的是
    4.32ms avg: 13.42 // 所有请求平均延迟是13.42ms 
    max: 45.56 // 延迟最大的请求是45.56ms 
    95th percentile: 21.33 // 95%的请求延迟都在21.33ms以内

阿里云的官方说明:https://helpcdn.aliyun.com/document_detail/65637.html


特别提醒:扫码关注微信订阅号'起岸星辰',实时掌握IT业界技术资讯! 转载请保留原文中的链接!
 上一篇
Elasticsearch7学习笔记(上) Elasticsearch7学习笔记(上)
Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。
下一篇 
基于Prometheus+Grafana搭建MySQL数据库可视化监控 基于Prometheus+Grafana搭建MySQL数据库可视化监控
基于Prometheus+Grafana搭建MySQL数据库可视化监控,通过Prometheus对MySQL数据库信息的监控,使用Grafana对监控的数据进行界面化展示。
2021-04-10
  目录