文档章节

mysql运维-基准测试之sysbench

坦途abc
 坦途abc
发布于 2018/08/27 15:56
字数 2654
阅读 181
收藏 1

基准测试简介
?    什么是基准测试:数据库的基准测试是对数据库的性能指标进行定量的、可复现的、可对比的测试。
?    基准测试与压力测试:基准测试可以理解为针对系统的一种压力测试。但基准测试不关心业务逻辑,更加简单、直接、易于测试,数据可以由工具生成,不要求真实;而压力测试一般考虑业务逻辑(如购物车业务),要求真实的数据。
?    基准测试的作用:对于多数Web应用,整个系统的瓶颈在于数据库;原因很简单:Web应用中的其他因素,例如网络带宽、负载均衡节点、应用服务器(包括CPU、内存、硬盘灯、连接数等)、缓存,都很容易通过水平的扩展(俗称加机器)来实现性能的提高。而对于MySQL,由于数据一致性的要求,无法通过增加机器来分散向数据库写数据带来的压力;虽然可以通过前置缓存(Redis等)、读写分离、分库分表来减轻压力,但是与系统其它组件的水平扩展相比,受到了太多的限制。而对数据库的基准测试的作用,就是分析在当前的配置下(包括硬件配置、OS、数据库设置等),数据库的性能表现,从而找出MySQL的性能阈值,并根据实际系统的要求调整配置。

基准测试的指标:
常见的数据库指标包括:
    TPS/QPS:衡量吞吐量。
    响应时间:包括平均响应时间、最小响应时间、最大响应时间、时间百分比等,其中时间百分比参考意义较大,如前95%的请求的最大响应时间。。
    并发量:同时处理的查询请求的数量。

在针对MySQL进行基准测试时,一般使用专门的工具进行,例如sysbench。

sysbench是跨平台的基准测试工具,支持多线程,支持多种数据库;主要包括以下几种测试:

    cpu性能
    磁盘io性能
    调度程序性能
    内存分配及传输速度
    POSIX线程性能
    数据库性能(OLTP基准测试)

安装篇:

下载:https://github.com/akopytov/sysbench
解压:unzip sysbench-1.0.zip
进入目录:cd sysbench-1.0
开始安装:
./autogen.sh
./configure
#ERROR: cannot find MySQL libraries. If you want to compile with MySQL support 没找到mysql库 需要用参数指定下 --with-mysql-includes和--with-mysql-libs
./configure --with-mysql-includes=/d/app/mysql5.7/include/ --with-mysql-libs=/d/app/mysql5.7/lib/
make
make install
测试安装是否成功:sysbench --version

参数介绍篇:执行sysbench –help,可以看到sysbench的详细使用方法。

sysbench的基本语法如下:
sysbench [options]... [testname] [command]

(1)command
command是sysbench要执行的命令,包括prepare、run和cleanup,顾名思义,prepare是为测试提前准备数据,run是执行正式的测试,cleanup是在测试完成后对数据库进行清理。
(2)testname
testname指定了要进行的测试,在老版本的sysbench中,可以通过--test参数指定测试的脚本;而在新版本中,--test参数已经声明为废弃,可以不使用--test,而是直接指定脚本。

例如,如下两种方法效果是一样的:
1)sysbench --test=./tests/include/oltp_legacy/oltp.lua
2)sysbench ./tests/include/oltp_legacy/oltp.lua

测试时使用的脚本为lua脚本,可以使用sysbench自带脚本,也可以自己开发。对于大多数应用,使用sysbench自带的脚本就足够了。不同版本的sysbench中,lua脚本的位置可能不同,可以自己在sysbench路径下使用find命令搜索oltp.lua。P.S.:大多数数据服务都是oltp类型的,如果你不了解什么是oltp,那么大概率你的数据服务就是oltp类型的。

(3)options

sysbench的参数有很多,其中比较常用的包括:

MySQL连接信息参数

    --mysql-host:MySQL服务器主机名,默认localhost;如果在本机上使用localhost报错,提示无法连接MySQL服务器,改成本机的IP地址应该就可以了。
    --mysql-port:MySQL服务器端口,默认3306
    --mysql-user:用户名
    --mysql-password:密码
MySQL执行参数

    --oltp-test-mode:执行模式,包括simple、nontrx和complex,默认是complex。simple模式下只测试简单的查询;nontrx不仅测试查询,还测试插入更新等,但是不使用事务;complex模式下测试最全面,会测试增删改查,而且会使用事务。可以根据自己的需要选择测试模式。
    --oltp-tables-count:测试的表数量,根据实际情况选择
    --oltp-table-size:测试的表的大小,根据实际情况选择
    --threads:客户端的并发连接数
    --time:测试执行的时间,单位是秒,该值不要太短,可以选择120
    --report-interval:生成报告的时间间隔,单位是秒,如10

在执行sysbench时,应该注意:
(1)尽量不要在MySQL服务器运行的机器上进行测试,一方面可能无法体现网络(哪怕是局域网)的影响,另一方面,sysbench的运行(尤其是设置的并发数较高时)会影响MySQL服务器的表现。
(2)可以逐步增加客户端的并发连接数(--thread参数),观察在连接数不同情况下,MySQL服务器的表现;如分别设置为10,20,50,100等。
(3)一般执行模式选择complex即可,如果需要特别测试服务器只读性能,或不使用事务时的性能,可以选择simple模式或nontrx模式。
(4)如果连续进行多次测试,注意确保之前测试的数据已经被清理干净。
        在OLTP测试过程中,数据库初始化后,冷备data目录,每次测试完毕后删除当前数据目录,拷贝data目录重新启动,为的是每次开始测试前环境保持一致。
(5)基准测试要进行多次才有意义。
(6)测试完成后,需要再系统层做一些清理的工作
        shell>sync                                                  #刷新脏数据到磁盘
        shell>echo 3 >/proc/sys/vm/drop_cache #清除cache
        shell>swapoff -a && swapon -a               #释放swap
(7)压测过程中需要修改参数max_prepared_stmt_count默认为16382,修改为65536
(8)如果是SSD硬盘的话,innodb_io_capacity和innodb_io_capacity_max两个参数也要相应调大,建议调整到50000以上。
(9)对于测试数据的准备,我们通过show engine innodb status观察Free buffers,尽量模拟生产环境,让测试数据填满整个buffer pool。我这里innodb_buffer_pool_size设置的40G,测试表数量10张,每张表数据2000万,差不多填满buffer pool。

压测实例以及结果解读篇:

1.cpu测试
sysbench --test=cpu --cpu-max-prime=2000000 run

cpu测试主要是进行素数的加法运算,上面我们的例子中,指定了最大的质数发生器数量为 2000000,可以看出服务器此次测试 执行时间 大约为11.05秒

2.磁盘IO测试
sysbench --test=fileio --num-threads=16 --file-total-size=30G --file-test-mode=rndrw prepare
sysbench --test=fileio --num-threads=16 --file-total-size=30G --file-test-mode=rndrw run

可以看到,磁盘的读IOPS可以达到68491.05,写IOPS可以达到45660.96,fsync可以达到146103.57

3.线程测试
sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run

(发送64次/个测试线程请求,每次/个线程请求产生/生成100个数量,每个线程的锁数量为2) ,测试执行时间为10秒

4.内存测试
sysbench --test=memory --memory-block-size=8k --memory-total-size=40G run

上述参数指定了本次测试整个过程是在内存中传输 40G 的数据量,每个 block 大小为 8K。测试结果显示:
执行时间为3.6323秒,每秒传输速度为11276.59Mb每秒

5.OLTP测试
(1)100线程
数据准备:
sysbench /usr/local/share/sysbench/oltp_common.lua --mysql-user=tpcc --mysql-password=tpcc --mysql-socket=/tmp/mysql3306.sock --tables=10 --table_size=20000000 --threads=100 --max-requests=0 prepare
开始测试:
sysbench /usr/local/share/sysbench/oltp_read_write.lua --mysql-host=localhost --mysql-port=3306 --mysql-db=sbtest --mysql-user=tpcc --mysql-password=tpcc --table_size=20000000 --tables=10 --threads=100 --time=3600 --report-interval=10 --mysql-socket=/tmp/mysql3306.sock run > /tmp/40_100.log

6.增删改查基准测试
(1)准备数据
##其中,执行模式为complex,使用了10个表,每个表有10万条数据,客户端的并发线程数为10,执行时间为120秒,每10秒生成一次报告。
sysbench ./tests/include/oltp_legacy/oltp.lua --mysql-host=192.168.10.10 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --oltp-test-mode=complex --oltp-tables-count=10 --oltp-table-size=100000 --threads=10 --time=120 --report-interval=10 prepare
(2)执行测试

将测试结果导出到文件中,便于后续分析。
sysbench ./tests/include/oltp_legacy/oltp.lua --mysql-host=192.168.10.10 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --oltp-test-mode=complex --oltp-tables-count=10 --oltp-table-size=100000 --threads=10 --time=120 --report-interval=10 run >> /home/test/mysysbench.log
(3)清理数据

执行完测试后,清理数据,否则后面的测试会受到影响。
sysbench ./tests/include/oltp_legacy/oltp.lua --mysql-host=192.168.10.10 --mysql-port=3306 --mysql-user=root --mysql-password=123456 cleanup

测试结果分析:
SQL statistics:
##queries performed:  #性能统计
read:1994860   #总 select 数量
write: 0       #总update、insert、delete语句数量
other: 284980  #commit、unlock tables以及其他mutex的数量
total: 2279840 #总的执行语句数
transactions:142490 (1186.20 per sec.)  #总的事物数(每秒处理事物数)|通常需要关注的数字(TPS)
queries: 2279840 (18979.13 per sec.)    #读写请求次数(每秒的读写次数)|通常需要关注的数字(QPS)
other operations: 9375 (156.13 per sec.)#其它操作的每秒执行数
ignored errors:0(0.00 per sec.)         #忽略的错误数
reconnects:0(0.00 per sec.)
##General statistics:
total time:120.1216s                    #即time指定的压测总时间
total number of events:142490           #总的事件数,一般与transactions相同
total time taken by event execution: 600.0783s   #所有事务耗时相加(不考虑并行因素)
##response time:    //应答时间
min:8.52
avg:107.84
max:480.08
95th percentile:170.48                  #95%的语句的平均响应时间
sum:15365843.76
##Threads fairness:
events (avg/stddev): 1113.2031/14.76
execution time (avg/stddev): 120.0457/0.04

我们一般关注的指标主要有:

response time avg: 平均响应时间。(后面的95%的大小可以通过–percentile=98的方式去更改)
transactions: 精确的说是这一项后面的TPS 。但如果使用了-skip-trx=on,这项事务数恒为0,需要用total number of events 去除以总时间,得到tps(其实还可以分为读tps和写tps)
queries: 用它除以总时间,得到吞吐量QPS

 

参考:
https://www.cnblogs.com/kismetv/archive/2017/09/30/7615738.html
https://www.jianshu.com/p/9823b4aa445a
https://github.com/akopytov/sysbench
https://help.aliyun.com/document_detail/53632.html?spm=a2c4g.11186623.6.788.MQgp4u

© 著作权归作者所有

坦途abc
粉丝 4
博文 68
码字总数 79734
作品 0
海淀
程序员
私信 提问
加载中

评论(0)

详解MySQL基准测试和sysbench工具

原文出处:编程迷思 作为一名后台开发,对数据库进行基准测试,以掌握数据库的性能情况是非常必要的。本文介绍了MySQL基准测试的基本概念,以及使用sysbench对MySQL进行基准测试的详细方法。...

编程迷思
2018/04/25
0
0
sysbench的安装及使用

sysbench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。关于这个项目的详细介绍请看:http://sysbench.sourceforge.net。 它主要包括以...

范堡
2009/08/24
5.4K
5
sysbench 0.5 oltp测试笔记

sysbench 0.5相比0.4版本的主要变化是,oltp测试结合了lua脚本,不需要修改源码,通过自定义lua脚本就可以实现不同业务类型的测试。同时0.5相比0.4需要消耗更多的cpu资源。 1、查看帮助 sysb...

AnthonyYau
2014/07/12
4.9K
5
服务器IO测试,及利用sysbench工具进行mysql oltp性能测试

背景 公司打算2018年有把服务迁移到云上的计划,于是选择了市场上的几款云产品来进行比较,其中对磁盘IO与mysql读写性能的测试是很重要的一个环节。故此,针对云产品的磁盘IO以及云数据库的读...

icenycmh
2018/06/26
0
0
MySQL基准测试工具-sysbench安装测试

环境:CentOS6.5,MySQL5.7.22 1.下载 sysbench下载地址 2.安装 3.简介 sysbench是跨平台的基准测试工具,支持多线程,支持多种数据库,主要包括以下几种测试: CPU性能 磁盘io性能 调度程序...

Lydialyd
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Vue组件通信应知必知

前言 本章我们来学习Vue组件通信中的可以算是所有内容,在此之前,您最好掌握Vue的基础语法、指令等内容,同时也建议您查看我其他的文章进行补充。 组件通信 父子组件关系 通过上图顺带给大家...

涂老师
25分钟前
64
0
按下时会两次调用UILongPressGestureRecognizer

我正在检测用户是否已按下2秒钟: UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self......

javail
29分钟前
48
0
图示JVM工作原理

JDK,JRE,JVM的联系是啥? JVM Java Virtual Machine JDK Java Development Kit JRE Java Runtime Environment 看上图官方的介绍讲的很清楚 JVM的作用是啥? JVM有2个特别有意思的特性,语言...

erlieStar
37分钟前
59
0
webpack 阶段回顾 之 webpack-dev-server

webpack-dev-server是一个让我们可以模拟线上环境进行项目调试的工具 主要功能有: 路径重定向 浏览器中显示编译错误 接口代理 如解决跨域 热更新 使用步骤 安装webpack-dev-server 配置dev...

东东笔记
今天
78
0
sql按任意时间段分组统计

任意时间序列数据都可以按时间分组。 timestamp 为时间戳。 按每五分钟统计日志的数目 select floor(cast(logs.timestamp as int) / 60 / 5) as dt, count(logs.id)from ( selec...

Mr小Z
今天
90
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部