zoukankan      html  css  js  c++  java
  • sysbench测试

    什么是基准测试

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

    基准测试与压力测试

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

    基准测试的作用

    对于多数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

  • 相关阅读:
    SpringBoot定制修改Servlet容器
    springboot配置i18n
    idea properties编码问题
    多线程分页查询
    浏览器 私有属性&内核
    css添加样式的四种方式
    html、css、js注释
    JS中的 变量提升
    ECMAScript
    NOSCRIPT标签的用处
  • 原文地址:https://www.cnblogs.com/allenhu320/p/11338839.html
Copyright © 2011-2022 走看看