什么是基准测试

数据库的基准测试是对数据库的性能指标进行定量的、可复现的、可对比的测试。

基准测试与压力测试

基准测试可以理解为针对系统的一种压力测试。但基准测试不关心业务逻辑,更加简单、直接、易于测试,数据可以由工具生成,不要求真实;而压力测试一般考虑业务逻辑(如购物车业务),要求真实的数据。

基准测试的作用

对于多数Web应用,整个系统的瓶颈在于数据库;原因很简单:Web应用中的其他因素,例如网络带宽、负载均衡节点、应用服务器(包括CPU、内存、硬盘灯、连接数等)、缓存,都很容易通过水平的扩展(俗称加机器)来实现性能的提高。而对于MySQL,由于数据一致性的要求,无法通过增加机器来分散向数据库写数据带来的压力;虽然可以通过前置缓存(Redis等)、读写分离、分库分表来减轻压力,但是与系统其它组件的水平扩展相比,受到了太多的限制。

而对数据库的基准测试的作用,就是分析在当前的配置下(包括硬件配置、OS、数据库设置等),数据库的性能表现,从而找出MySQL的性能阈值,并根据实际系统的要求调整配置。

基准测试的指标

常见的数据库指标包括:

TPS/QPS:衡量吞吐量。

响应时间:包括平均响应时间、最小响应时间、最大响应时间、时间百分比等,其中时间百分比参考意义较大,如前95%的请求的最大响应时间。

并发量:同时处理的查询请求的数量。

基准测试的分类

对MySQL的基准测试,有如下两种思路:

(1)针对整个系统的基准测试:通过http请求进行测试,如通过浏览器、APP或postman等测试工具。该方案的优点是能够更好的针对整个系统,测试结果更加准确;缺点是设计复杂实现困难。

(2)只针对MySQL的基准测试:优点和缺点与针对整个系统的测试恰好相反。

在针对MySQL进行基准测试时,一般使用专门的工具进行,例如mysqlslap、sysbench等。其中,sysbench比mysqlslap更通用、更强大,且更适合Innodb(因为模拟了许多Innodb的IO特性),下面介绍使用sysbench进行基准测试的方法。

sysbench简介

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

cpu性能

磁盘io性能

调度程序性能

内存分配及传输速度

POSIX线程性能

数据库性能(OLTP基准测试)

Install_CentOS7_sysbench.sh

#!/bin/bash

Sysbench_Package=sysbench-1.0.5.zip
Package_Source=sysbench-1.0.5 PrepareENV()
{
yum -y install automake
yum -y install libtool
} InstallSysbench()
{
unzip ${Sysbench_Package}
cd ${Package_Source}
./autogen.sh
./configure --with-mysql-includes=/usr/local/mysql/include/ --with-mysql-libs=/usr/local/mysql/lib/ --prefix=/usr/local/sysbench
make
make install
echo 'export LD_LIBRARY_PATH=/usr/local/mysql/lib/' >>/root/.bash_profile
echo 'export PATH=/usr/local/sysbench/bin:$PATH' >>/root/.bash_profile
source /root/.bash_profile
which sysbench
} PrepareENV
InstallSysbench

sysben1.0.sh

#!/bin/bash
TABLE_SIZE=1000000
HOST="127.0.0.1"
USER_NAME="sysbench"
PASS_WORD="sysbench"
PORT=3306 TEST_ENGINE="INNODB"
OLTP_TABLES=10 #### the number of tables for testing
MAX_TIME=86400 #### seconds #####
MIN_THREAD=16 ### concurrent threads for testing
MAX_THREAD=64
TEST_GROUP=3
DELAY_TIME=10000 ####ms#####
TEST_DB="test"
SLEEP_TIME=120 ###SECONDS###
REPORT_INTERVAL=10 ###the time interval that print info every time
NUM_THREAD=40 #MIN_ENGINE_THREADS=64
#MAX_ENGINE_THREADS=64, TEST_MODE="/usr/local/sysbench/share/sysbench/oltp_read_write.lua"
#sysbench --help 查看参数
#sysbench ${TEST_MODE} help 查看参数 #初始化脚本
sysbench ${TEST_MODE} --tables=${OLTP_TABLES} --report-interval=${REPORT_INTERVAL} \
--table_size=${TABLE_SIZE} --threads=${OLTP_TABLES} --mysql-user=${USER_NAME} \
--mysql-password=${PASS_WORD} --mysql_storage_engine=${TEST_ENGINE} --rand-type=uniform --mysql-host=${HOST} \
--mysql-port=${PORT} --mysql-db=${TEST_DB} prepare #压测脚本:
sysbench ${TEST_MODE} --tables=${OLTP_TABLES} --report-interval=${REPORT_INTERVAL} \
--table_size=${TABLE_SIZE} --mysql-user=${USER_NAME} --mysql-password=${PASS_WORD} \
--rand-type=uniform --mysql_storage_engine=${TEST_ENGINE} --mysql-host=${HOST} --mysql-port=${PORT} \
--mysql-db=${TEST_DB} --time=${MAX_TIME} --max-requests=0 --threads=${NUM_THREAD} --thread-stack-size=256 run #清理脚本:
sysbench ${TEST_MODE} --tables=${OLTP_TABLES} --report-interval=${REPORT_INTERVAL} \
--table_size=${TABLE_SIZE} --mysql-user=${USER_NAME} --mysql-password=${PASS_WORD} \
--mysql_storage_engine=${TEST_ENGINE} --mysql-host=${HOST} --mysql-port=${PORT} --mysql-db=${TEST_DB} cleanup

测试结果

测试结束后,查看输出文件,如下所示:

其中,对于我们比较重要的信息包括:

queries:查询总数及qps

transactions:事务总数及tps

Latency-95th percentile:前95%的请求的最大响应时间,本例中是344毫秒,这个延迟非常大,是因为我用的MySQL服务器性能很差;在正式环境中这个数值是绝对不能接受的。

下面是使用sysbench的一些建议。

1、在开始测试之前,应该首先明确:应采用针对整个系统的基准测试,还是针对MySQL的基准测试,还是二者都需要。

2、如果需要针对MySQL的基准测试,那么还需要明确精度方面的要求:是否需要使用生产环境的真实数据,还是使用工具生成也可以;前者实施起来更加繁琐。如果要使用真实数据,尽量使用全部数据,而不是部分数据。

3、基准测试要进行多次才有意义。

4、测试时需要注意主从同步的状态。

5、测试必须模拟多线程的情况,单线程情况不但无法模拟真实的效率,也无法模拟阻塞甚至死锁情况。

控制命令,总共有五个

prepare #准备测试,主要是生成测试数据

run #执行测试,根据选项限制来执行测试

cleanup #清除准备阶段生成的测试数据

help #获取帮助文档

version #获取版本信息

接下来进入各个测试模式的测试方法

fileio-磁盘io性能

sysbench fileio --file-total-size=10G --file-test-mode=rndrw --time=300 --file-num=10  prepare

sysbench fileio --file-total-size=10G --file-test-mode=rndrw --time=300 --file-num=10 --threads=16 --file-block-size=16384 run

sysbench fileio --file-total-size=10G --file-test-mode=rndrw --time=300 --file-num=10 cleanup

cpu-cpu性能测试

sysbench --test=cpu --cpu-max-prime=20000000 run

sysbench --test=cpu --num-threads=`grep "processor" /proc/cpuinfo | wc -l` --cpu-max-prime=20000000 run

memory-内存分配及传输速度

sysbench --test=memory --memory-block-size=8K --memory-total-size=100G  --num-threads=16 run

threads-POSIX线程性能

sysbench --test=threads --num-threads=64 run

mutex-调度程序性能

sysbench --test=mutex --num-threads=16 --mutex-num=2048 --mutex-locks=1000000 --mutex-loops=5000 run

sysbench测试的更多相关文章

  1. sysbench测试工具

    sysbench简介 Sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况.它主要包括以下几种方式的测试:cpu性能,磁盘io性能,线程调度性 ...

  2. sysbench测试阿里云ECS云磁盘的IOPS,吞吐量

    测试阿里云ECS 对象:在aliyun上买了一个ECS附加的云盘,使用sysbench测试云盘的IOPS和吞吐量 sysbench prepare 准备文件,10个文件,1个1G [root@iZwz ...

  3. 【巨杉数据库SequoiaDB】巨杉Tech | 分布式数据库Sysbench测试最佳实践

    引言 作为一名DBA,时常需要对某些数据库进行一些基准测试,进而掌握数据库的性能情况.本文就针对sysbench展开介绍,帮助大家了解sysbench的一般使用方法. ​ sysbench简介 什么是 ...

  4. 使用sysbench测试mysql及postgresql(完整版)

    使用sysbench测试mysql及postgresql(完整版) 转载请注明出处https://www.cnblogs.com/funnyzpc/p/14592166.html 前言 使用sysbe ...

  5. sysbench 测试mysql性能

    ===== #1sysbench --test=oltp --oltp-table-size=10000 --mysql-db=test --mysql-user=root --mysql-passw ...

  6. sysbench测试阿里云CPU

    参考 https://wiki.mikejung.biz/Benchmarking 买了一个1核的ECS,测试一下CPU性能 第一次是只用1个thread去跑 [root@iZwz9fy718twfi ...

  7. ubuntu 18.04使用sysbench测试MySQL性能

    首先下载安装sysbench: sudo apt-get install sysbench -y 查看一下sysbench版本是多少: zifeiy@zifeiy-S1-Series:~$ sysbe ...

  8. Sysbench测试神器:一条命令生成百万级测试数据

    1. 基准测试 基准测试(benchmarking)是性能测试的一种类型,强调的是对一类测试对象的某些性能指标进行定量的.可复现.可对比的测试. 进一步来理解,基准测试是在某个时候通过基准测试建立一个 ...

  9. 来一个使用sysbench测试cpu性能的简单脚本

    #!/bin/bash for ((i=1; i<16; i++)); do sysbench cpu run --cpu-max-prime=10000 --threads=4 --time= ...

随机推荐

  1. Dubbo 节点telnet测试

        Dubbo 节点telnet测试 本地安装telnet客户端 Telnet 服务地址 端口 如telnet 127.0.0.1 1234 出现此对话框表示连接成功 输入status –l 会显 ...

  2. RabbitMQ 简使用案例

    第一步导入依赖 : <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-clie ...

  3. crawler 使用jQuery风格实现

    以前写过java版的crawler,最近看了Groovy的XmlSlurper,效果还是不太满意,直到这篇文章启发了我:how-to-make-a-simple-web-crawler-in-java ...

  4. OUC_Summer Training_ DIV2_#11 722

    企鹅很忙系列~(可惜只会做3道题T_T) A - A Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d &am ...

  5. CDN之Web Cache

    1. Cache 的工作方式 Web Cache 作为一种网页缓存技术,可以在用户访问网站服务器的任何一个中间网元上实现.根据 HTTP 协议的定义,在一次网页访问中,用户从客户端发出请求到网站服务器 ...

  6. 【软件工程】Alpha冲刺 (5/6)

    链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 学习调用中国天气网API,接近实现天气推送功能 对天气推送的形式进行讨论及重确 ...

  7. antd源码分析之——对话框(modal)

    目录 一.组件结构 1.antd代码结构 2.rc-ant代码结构 3.组件结构 二.antd组件调用关系及功能详解 1.Model.tsx 2.confirm 三.rc-dialog详解 1.e.t ...

  8. MySQL Cluster 集群部署

    前言 此篇博客用以介绍 MySQL Cluster 集群部署方法 一.节点规划 序号 IP地址 节点名称 1 172.16.1.201 mysql-manage 2 172.16.1.202 mysq ...

  9. 发布机制-灰度发布-例子:QZone

    ylbtech-发布机制-灰度发布-例子:QZone QZone是另外一个采用灰度发布的例子.大家都知道,QZone在过去的一年中改进是巨大的,从以前慢悠悠的老爷爷变成了一个充满青春活力的小伙子.其中 ...

  10. python 通过 实例方法 名字的字符串调用方法

    方式1 - 反射 hasattr 方法 判断当前实例中是否有着字符串能映射到的属性或者方法, 一般会在  getattr 之前作为判断防止报错 getattr 方法 获取到当前实例中传入字符串映射到的 ...