You need to enable JavaScript to run this app.
导航

使用SysBench测试MySQL应用性能

最近更新时间2024.03.21 19:44:22

首次发布时间2023.05.30 08:34:20

本文为您介绍使用SysBench工具测试云服务器MySQL应用性能的方法。

背景信息

  • MySQL简介
    MySQL是一个关系型数据库管理系统(Relational Database Management System,RDBMS),使用最常用的结构式查询语言SQL进行数据库管理。在web应用方面,MySQL在高负载的情况下对虚拟机的CPU算力、网络和存储等性能要求很高,经常被用作衡量虚拟机整体性能的应用软件之一。

  • SysBench工具
    SysBench是一个模块化的、跨平台、开源的多线程基准测试工具,可以执行数据库、CPU、内存、线程、IO等方面的性能测试,主要用于评估测试各种不同系统参数下的数据库负载情况。对于如何使用Sysbench测试CPU、内存、IO等,请参考使用Sysbench测试云服务器性能

测试指标

  • TPS(Transcantion Per Second):每秒事务数,即数据库每秒执行的事务数。
  • QPS(Query Per Second):每秒接收的请求查询次数,数据库每秒执行的 SQL 数,包含INSERTSELECTUPDATEDELETE等。

软件版本

  • MySQL/MariaDB:本文以MariaDB 10.6.12为例。
  • SysBench:本文以SysBench 1.0.19为例。

测试环境

两台相同规格的ECS实例,分别作为服务端(Sever)和客户端(Client),具体配置如下表所示。

创建实例请参见通过向导购买实例,更多实例规格请参见实例规格介绍

测试示例Sever端Client端
实例规格ecs.g3i.2xlargeecs.g3i.2xlarge
镜像类型Ubuntu 22.04Ubuntu 22.04
数据盘规格数据盘:1000GiB * 1-
实例数量11

请在Sever端、Client端(按需)参考下表优化实例配置以获得最佳的 MySQL 应用性能体验。

优化项
具体配置

云盘分区

在进行云盘分区时,建议设置起始磁柱值 ≥ 2048,且为8的倍数。详细分区操作见分区格式化云盘

说明

本文已通过步骤一将云盘成功分区并挂载至文件系统,您可跳过此项操作。

安装irqbalance-ng参考网卡中断绑定安装irqbalance-ng自动配置物理网卡中断,提升网络性能。

关闭napi_tx

该特性仅在 Linux内核版本 ≥ 5.3 时默认开启,您可以执行uname -r命令查看内核版本并按以下方式关闭napi_tx。

  • Ubuntu
# 关闭napi_tx:
rmmod virtio_net && modprobe virtio_net napi_tx=0 && systemctl restart systemd-networkd.service
# 打开napi_tx:
rmmod virtio_net && modprobe virtio_net napi_tx=1 && systemctl restart systemd-networkd.service
  • Debian
# 关闭napi_tx:
rmmod virtio_net && modprobe virtio_net napi_tx=0 && systemctl restart networking.service
# 打开napi_tx:
rmmod virtio_net && modprobe virtio_net napi_tx=1 && systemctl restart networking.service
  • CentOS
# 关闭napi_tx:
rmmod virtio_net && modprobe virtio_net napi_tx=0 && systemctl restart nmcli c reload
# 打开napi_tx:
rmmod virtio_net && modprobe virtio_net napi_tx=1 && systemctl restart nmcli c reload

执行cat /sys/module/virtio_net/parameters/napi_tx,返回N代表napi_tx关闭成功。
alt

操作步骤

说明

  • 本文的测试结果仅作为参考,不代表云服务器的真实最优性能。
  • 为避免数据丢失,建议您在新创建的无数据的实例上参考本文进行性能测试。

步骤一:Server端部署MySQL应用

  1. 登录Sever端云服务器

  2. 执行如下命令创建install_mysql.sh脚本。
    vim install_mysql.sh

  3. i进入编辑模式,并输入以下文件中的内容。

    该文件用于安装 MySQL 应用,将云盘进行分区并挂载至文件系统,并指定 MySQL 持久化存储路径到该文件系统。

    install_mysql.sh
    4.66KB
  4. Esc退出编辑模式,输入:wq并按Enter键,保存并退出文件。

  5. 执行如下命令运行脚本。
    bash install_mysql.sh >> install_mysql.log

步骤二:Client端安装SysBench工具并创建测试脚本

  1. 登录Client端云服务器
  2. 安装 SysBench 工具。
    1. 执行如下命令创建install_sysbench.sh文件。
      vim install_sysbench.sh
    2. i进入编辑模式,输入以下内容。
      #!/bin/bash
      
      if which apt;then
          apt update
          apt-get install -y automake libtool pkg-config default-libmysqlclient-dev:amd64 
      elif which yum;then
          yum install -y libtool mysql-devel automake
      fi
      
      wget https://github.com/akopytov/sysbench/archive/1.0.19/sysbench-1.0.19.tar.gz
      tar xzvf sysbench-1.0.19.tar.gz
      
      cd sysbench-1.0.19/
      ./autogen.sh
      ./configure --with-mysql
      make -j8
      make install
      
    3. Esc退出编辑模式,输入:wq并按Enter键,保存并退出文件。
    4. 执行如下命令,安装 SysBench 工具。
      bash install_sysbench.sh
  3. 创建测试时的运行脚本mysql_test_run.sh。
    1. 执行如下命令创建一个测试时的运行脚本。
      vim mysql_test_run.sh
    2. i进入编辑模式,输入以下内容,此处暂不执行该脚本。
      #!/bin/bash
      
      dest_host=$serverIP
      thread_count=128
      
      VIRT_BENCHMARCK_TARGET=/usr/local
      VIRT_BENCHMARCK_OUTPUT=$(pwd)
      
      echo "------------------------------------------------"
      date
      echo "BENCHMARK PREPARE sysbench mysql ${dest_host} ${thread_count}"
      
      for MYSQLTEST in oltp_read_only oltp_write_only
      do
         $VIRT_BENCHMARCK_TARGET/bin/sysbench --mysql-host=${dest_host} --mysql-port=3306 --mysql-user=sbtest --mysql-password=sbpasswd $VIRT_BENCHMARCK_TARGET/share/sysbench/oltp_common.lua --tables=10 --table_size=100000 prepare > $VIRT_BENCHMARCK_OUTPUT/oltp_prepare.log
          echo "------------------------------------------------"
          
          echo "BENCHMARK STATR [$MYSQLTEST] ${dest_host} ${thread_count}"
          $VIRT_BENCHMARCK_TARGET/bin/sysbench --threads=${thread_count} --time=120 --report-interval=1 --mysql-host=${dest_host} --mysql-port=3306 --mysql-user=sbtest --mysql-password=sbpasswd $VIRT_BENCHMARCK_TARGET/share/sysbench/$MYSQLTEST.lua --tables=10 --table_size=100000 run > $VIRT_BENCHMARCK_OUTPUT/$MYSQLTEST.log
          
          echo "BENCHMARK RESULT [$MYSQLTEST] ${dest_host} ${thread_count}"
          grep -E "transactions:|queries:" $VIRT_BENCHMARCK_OUTPUT/$MYSQLTEST.log
          $VIRT_BENCHMARCK_TARGET/bin/sysbench --mysql-host=${dest_host} --mysql-port=3306 --mysql-user=sbtest --mysql-password=sbpasswd $VIRT_BENCHMARCK_TARGET/share/sysbench/oltp_common.lua --tables=10 --table_size=100000 cleanup > $VIRT_BENCHMARCK_OUTPUT/oltp_cleanup.log
          
          sleep 300s # Avoid MySQL's WAL mechanism affecting QPS test
      done
      
    3. Esc退出编辑模式,输入:wq并按Enter键,保存并退出文件。
  4. 创建获取结果的脚本mysql_test_result.sh。
    1. 执行如下命令创建一个获取结果的脚本。
      vim mysql_test_result.sh
    2. i进入编辑模式,输入以下内容,此处暂不执行该脚本。
      #!/bin/bash
      VIRT_BENCHMARCK_OUTPUT=$(pwd)
      
      write_tps=$(grep -E "transactions:" $VIRT_BENCHMARCK_OUTPUT/oltp_write_only.log |awk '{print $3}')
      read_qps=$(grep -E "queries:" $VIRT_BENCHMARCK_OUTPUT/oltp_read_only.log |awk '{print $3}')
      
      echo "{\"mysql_write_tps\":"${write_tps:1}",\"mysql_read_qps\":"${read_qps:1}"}"
      
    3. Esc退出编辑模式,输入:wq并按Enter键,保存并退出文件。

步骤三:Client端执行脚本测试并获取结果

  1. 获取 Server端的私网IP地址,然后登录Client端云服务器,执行如下命令进行测试。

    您可在云服务器控制台实例列表页的“主IPv4地址”列查看Sever端云服务器的私网IP地址。

    serverIP=192.168.x.xx bash mysql_test_run.sh

  2. 待上述命令运行结束后,执行如下命令获取测试结果。
    bash mysql_test_result.sh

    回显如下所示,其中“mysql_write_tps”表示此次测得的 MySQL 的 TPS 指标,“mysql_read_qps”表示 MySQL 的 QPS 指标。
    alt
    Client端测试结束后,您也可以执行如下命令查看更详细的测试结果。

    • 查看 QPS 指标:cat oltp_read_only.log
    • 查看 TPS 指标:cat oltp_write_only.log

    下文以查看oltp_read_only(QPS)为例,对相关指标说明如下。
    alt

    SQL statistics:
        queries performed:
            read:                            49552244  // 执行读请求的总数,如SELECT操作
            write:                           0         // 执行写请求的总数,如UPDATE、INSERT和DELETE操作
            other:                           7078892   // 执行其他请求总数,如CREATE、DROP和COMMIT等操作
            total:                           56631136  // 执行所有请求操作的总数
        transactions:                        3539446 (29492.41 per sec.)    // 前者表示总共完成的事务数,后者表示TPS
        queries:                             56631136 (471878.50 per sec.)  // 前者表示总共完成的查询次数,后者表示QPS
        ignored errors:                      0      (0.00 per sec.)   // 出现且已经忽略的错误数
        reconnects:                          0      (0.00 per sec.)   // 请求重连次数
    
    General statistics:
        total time:                          120.0110s    // 测试时长
        total number of events:              3539446      // 总共完成的event数量
    
    Latency (ms):
             min:                                    1.48  // 表示完成1个event的最短耗时
             avg:                                    4.34  // 表示完成所有event的平均耗时
             max:                                  210.23  // 表示完成1个event的最长耗时
             95th percentile:                        6.79  // 表示95%的event耗时在这个时间完成
             sum:                             15356801.48  // 表示所有线程测试期间的总耗时
    
    Threads fairness:
        events (avg/stddev):           27651.9219/929.10  // 前者表示平均每个线程完成的event数量,后者表示标准差
        execution time (avg/stddev):   119.9750/0.00     // 前者表示平均每个线程执行的时间,后者表示标准差