• MySQL数据库压测


    作为开发人员,对数据库进行基准测试,以掌握数据库的性能情况是非常必要的。本文介绍了MySQL基准测试的基本概念,以及使用 sysbench 对MySQL进行基准测试的详细方法。

    数据库基准测试

    什么是基准测试

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

    基准测试与压力测试

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

    基准测试的作用

    对于多数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进行基准测试的方法。

    使用mtr进行网络时延测试

    mtr简介

    mtr是Linux中有一个非常棒的网络连通性判断工具,它结合了ping, traceroute,nslookup 的相关特性。

    mtr结果说明

    第一列:显示的是IP地址和本机域名,这点和traceroute很像
    第二列:snt:10 设置每秒发送数据包的数量,默认值是10 可以通过参数 -c来指定。其中-c的说明是:–report-cycles COUNT
    第三列:是显示的每个对应IP的丢包率
    第四列:显示的最近一次的返回时延
    第五列:是平均值 这个应该是发送ping包的平均时延
    第六列:是最好或者说时延最短的
    第七列:是最差或者说时延最常的
    第八列:是标准偏差
    

    mtr测试网络时延

    旧库网络延时

    $ mtr -s 100 --report -n 11.171.68.253
    Start: Wed Dec 29 17:51:31 2021
    HOST: ack-troopers033011196118.pr Loss%   Snt   Last   Avg  Best  Wrst StDev
      1.|-- 11.57.244.37               0.0%    10    4.4   5.0   4.3   8.1   0.9
      2.|-- 11.57.244.37               0.0%    10    4.1   4.6   4.1   5.4   0.0
      3.|-- 11.129.109.46              0.0%    10    2.8   4.3   2.7  10.1   2.4
      4.|-- 11.171.68.253              0.0%    10    2.2   2.2   2.2   2.3   0.0
     
    # 辅助 ping 测试
    $ ping -s 100 -c 5 11.171.68.253
    PING 11.171.68.253 (11.171.68.253) 100(128) bytes of data.
    108 bytes from 11.171.68.253: icmp_seq=1 ttl=99 time=2.21 ms
    108 bytes from 11.171.68.253: icmp_seq=2 ttl=99 time=2.24 ms
    108 bytes from 11.171.68.253: icmp_seq=3 ttl=99 time=2.22 ms
    108 bytes from 11.171.68.253: icmp_seq=4 ttl=99 time=2.23 ms
    108 bytes from 11.171.68.253: icmp_seq=5 ttl=99 time=2.21 ms
    
    --- 11.171.68.253 ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 4003ms
    rtt min/avg/max/mdev = 2.216/2.226/2.240/0.052 ms
    

    新库网络延时

    $ mtr -s 100 --report -n 11.20.31.251
    Start: Wed Dec 29 17:49:44 2021
    HOST: ack-troopers033011196118.pr Loss%   Snt   Last   Avg  Best  Wrst StDev
      1.|-- 11.20.31.251               0.0%    10    1.0   1.0   1.0   1.0   0.0
    
    # ping 测试
    $ ping -s 100 -c 5 11.20.31.251
    PING 11.20.31.251 (11.20.31.251) 100(128) bytes of data.
    108 bytes from 11.20.31.251: icmp_seq=1 ttl=102 time=0.984 ms
    108 bytes from 11.20.31.251: icmp_seq=2 ttl=102 time=0.988 ms
    108 bytes from 11.20.31.251: icmp_seq=3 ttl=102 time=1.00 ms
    108 bytes from 11.20.31.251: icmp_seq=4 ttl=102 time=0.995 ms
    108 bytes from 11.20.31.251: icmp_seq=5 ttl=102 time=0.997 ms
    
    --- 11.20.31.251 ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 4003ms
    rtt min/avg/max/mdev = 0.984/0.993/1.003/0.028 ms
    

    结果分析

    • 单从网络时延来看,应用连接上海OXS区的时延比应用连接旧库的时延小。

    使用sysbench进行基准测试

    sysbench简介

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

    • cpu性能

    • 磁盘io性能

    • 调度程序性能

    • 内存分配及传输速度

    • POSIX线程性能

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

    此次主要介绍对数据库性能的测试。

    sysbench工具安装

    sysbench 在 Linux 系统上采用手动编译的方式进行安装:

    # 安装编译用到的工具包
    $ yum -y install mariadb-devel automake libtool make
    
    # 获取 sysbench 源码包,解压,并进入sysbench目录
    $ wget https://github.com/akopytov/sysbench/archive/1.0.zip -O "sysbench-1.0.zip"
    $ unzip sysbench-1.0.zip && cd sysbench-1.0
    
    # 编译sysbench
    $ ./autogen.sh
    $ ./configure
    $ make && make install
    
    # 查看是否编译成功,查看 sysbench 版本信息
    $ sysbench --version
    

    sysbench压测参数

    sysbench的语法,这里就不在介绍了。稍微介绍下 sysbench 的参数,因为解析来我们会用到这些参数。下面以压测mysql为例:

    ### 数据库连接信息参数
    #MySQL服务器主机名,默认localhost;如果在本机上使用localhost报错,提示无法连接MySQL服务器,改成本机的IP地址应该就可以了。
    --mysql-host 
    #MySQL服务器端口,默认3306
    --mysql-port
    #用户名
    --mysql-user
    #密码
    --mysql-password
    
    ### 执行参数,或者说压测定义参数
    #执行模式,包括simple、nontrx和complex,默认是complex。simple模式下只测试简单的查询;nontrx不仅测试查询,还测试插入更新等,但是不使用事务;complex模式下测试最全面,会测试增删改查,而且会使用事务。可以根据自己的需要选择测试模式。
    --oltp-test-mode
    #测试的表数量,根据实际情况选择
    --oltp-tables-count
    #测试的表的大小,根据实际情况选择
    --oltp-table-size
    #客户端的并发连接数
    --threads
    #测试执行的时间,单位是秒,该值不要太短,可以选择120
    --time
    #生成报告的时间间隔,单位是秒,如10
    --report-interval
    

    sysbench压测用例

    用例一:10表并发写,每表写10w条数据,执行时间120s

    #准备数据
    $ sysbench ./tests/include/oltp_legacy/oltp.lua \
    --mysql-host=11.20.31.251 \
    --mysql-port=3306 \
    --mysql-user=test_db \
    --mysql-password=**** \
    --oltp-test-mode=complex \
    --oltp-tables-count=10 \
    --oltp-table-size=100000 \
    --threads=10 \
    --time=120 \
    --report-interval=10 prepare
    
    #执行测试,并将结果输出至本地文件 mysysbench.log
    $ sysbench ./tests/include/oltp_legacy/oltp.lua \
    --mysql-host=11.20.31.251 \
    --mysql-port=3306 \
    --mysql-user=test_db \
    --mysql-password=**** \
    --oltp-test-mode=complex \
    --oltp-tables-count=10 \
    --oltp-table-size=100000 \
    --threads=10 \
    --time=120 \
    --report-interval=10 run >> ./mysysbench.log
    
    #清理数据
    $ sysbench ./tests/include/oltp_legacy/oltp.lua \
    --mysql-host=11.20.31.251 \
    --mysql-port=3306 \
    --mysql-db=sbtest \
    --mysql-user=test_db \
    --mysql-password=**** cleanup
    

    结果分析:上海(p95 latency) = 64.47ms, 杭州(p95 latency) = 244.38ms

    img

    img

    用例二:10表并发写,单表500w条数据,执行120s

    #准备数据
    sysbench ./tests/include/oltp_legacy/oltp.lua \
    --mysql-host=11.20.31.251 \
    --mysql-port=3306 \
    --mysql-user=test_db \
    --mysql-password=xxx \
    --oltp-test-mode=complex \
    --oltp-tables-count=10 \
    --oltp-table-size=5000000 \
    --threads=10 \
    --time=120 \
    --report-interval=10 prepare
    
    #执行测试
    sysbench ./tests/include/oltp_legacy/oltp.lua \
    --mysql-host=11.20.31.251 \
    --mysql-port=3306 \
    --mysql-user=test_db \
    --mysql-password=xxx \
    --oltp-test-mode=complex \
    --oltp-tables-count=10 \
    --oltp-table-size=5000000 \
    --threads=10 \
    --time=120 \
    --report-interval=10 run >> ./mysysbench.log
    
    #清理数据
    $ sysbench ./tests/include/oltp_legacy/oltp.lua \
    --mysql-host=11.20.31.251 \
    --mysql-port=3306 \
    --mysql-db=sbtest \
    --mysql-user=test_db \
    --mysql-password=xxx cleanup
    

    结果分析:p95 latency = 69.29ms

    img

    用例三:单表500w条数据,执行120s

    #准备数据
    sysbench ./tests/include/oltp_legacy/oltp.lua \
    --mysql-host=11.20.31.251 \
    --mysql-port=3306 \
    --mysql-user=test_db \
    --mysql-password=xxx \
    --oltp-test-mode=complex \
    --oltp-tables-count=1 \
    --oltp-table-size=5000000 \
    --threads=10 \
    --time=120 \
    --report-interval=10 prepare
    
    #执行测试
    sysbench ./tests/include/oltp_legacy/oltp.lua \
    --mysql-host=11.20.31.251 \
    --mysql-port=3306 \
    --mysql-user=test_db \
    --mysql-password=xxx \
    --oltp-test-mode=complex \
    --oltp-tables-count=1 \
    --oltp-table-size=5000000 \
    --threads=10 \
    --time=120 \
    --report-interval=10 run >> ./mysysbench.log
    
    #清理数据
    $ sysbench ./tests/include/oltp_legacy/oltp.lua \
    --mysql-host=11.20.31.251 \
    --mysql-port=3306 \
    --mysql-db=sbtest \
    --mysql-user=test_db \
    --mysql-password=xxx cleanup
    

    结果分析:p95 latency = 64.47ms

    img

    用例四:单表1000w条数据,执行120s

    #准备数据
    sysbench ./tests/include/oltp_legacy/oltp.lua \
    --mysql-host=11.20.31.251 \
    --mysql-port=3306 \
    --mysql-user=test_db \
    --mysql-password=xxx \
    --oltp-test-mode=complex \
    --oltp-tables-count=1 \
    --oltp-table-size=10000000 \
    --threads=10 \
    --time=120 \
    --report-interval=10 prepare
    
    #执行测试
    sysbench ./tests/include/oltp_legacy/oltp.lua \
    --mysql-host=11.20.31.251 \
    --mysql-port=3306 \
    --mysql-user=test_db \
    --mysql-password=xxx \
    --oltp-test-mode=complex \
    --oltp-tables-count=1 \
    --oltp-table-size=10000000 \
    --threads=10 \
    --time=120 \
    --report-interval=10 run >> ./mysysbench.log
    
    #清理数据
    $ sysbench ./tests/include/oltp_legacy/oltp.lua \
    --mysql-host=11.20.31.251 \
    --mysql-port=3306 \
    --mysql-db=sbtest \
    --mysql-user=test_db \
    --mysql-password=xxx cleanup
    

    结果分析:p95 latency = 69.29ms

    img

    结果分析

    • p95 latency 平均在 60~70ms
  • 相关阅读:
    海岛争霸
    hihocoder 1089 最短路径·二:Floyd算法
    hihocoder1081 :最短路径·一
    [蓝桥杯][历届试题]蚂蚁感冒
    牛客网Wannafly挑战赛27 A: 灰魔法师
    hdu1875:畅通工程再续
    hdu1863:畅通工程
    hdu1879:继续畅通工程
    hdu1233:还是畅通工程
    洛谷 P1546 最短网络 Agri-Net
  • 原文地址:https://www.cnblogs.com/vinsent/p/15867250.html
Copyright © 2020-2023  润新知