本文为您介绍使用SysBench工具测试云服务器MySQL应用性能的方法。
MySQL简介
MySQL是一个关系型数据库管理系统(Relational Database Management System,RDBMS),使用最常用的结构式查询语言SQL进行数据库管理。在web应用方面,MySQL在高负载的情况下对虚拟机的CPU算力、网络和存储等性能要求很高,经常被用作衡量虚拟机整体性能的应用软件之一。
SysBench工具
SysBench是一个模块化的、跨平台、开源的多线程基准测试工具,可以执行数据库、CPU、内存、线程、IO等方面的性能测试,主要用于评估测试各种不同系统参数下的数据库负载情况。对于如何使用Sysbench测试CPU、内存、IO等,请参考使用Sysbench测试云服务器性能。
INSERT
、SELECT
、UPDATE
、DELETE
等。两台相同规格的ECS实例,分别作为服务端(Sever)和客户端(Client),具体配置如下表所示。
测试示例 | Sever端 | Client端 |
---|---|---|
实例规格 | ecs.g3i.2xlarge | ecs.g3i.2xlarge |
镜像类型 | Ubuntu 22.04 | Ubuntu 22.04 |
数据盘规格 | 数据盘:1000GiB * 1 | - |
实例数量 | 1 | 1 |
请在Sever端、Client端(按需)参考下表优化实例配置以获得最佳的 MySQL 应用性能体验。
优化项 | 具体配置 |
---|---|
云盘分区 | 在进行云盘分区时,建议设置起始磁柱值 ≥ 2048,且为8的倍数。详细分区操作见分区格式化云盘。 说明 本文已通过步骤一将云盘成功分区并挂载至文件系统,您可跳过此项操作。 |
安装irqbalance-ng | 参考网卡中断绑定安装irqbalance-ng自动配置物理网卡中断,提升网络性能。 |
关闭napi_tx | 该特性仅在 Linux内核版本 ≥ 5.3 时默认开启,您可以执行
执行 |
说明
执行如下命令创建install_mysql.sh脚本。vim install_mysql.sh
按i
进入编辑模式,并输入以下文件中的内容。
该文件用于安装 MySQL 应用,将云盘进行分区并挂载至文件系统,并指定 MySQL 持久化存储路径到该文件系统。
按Esc
退出编辑模式,输入:wq
并按Enter
键,保存并退出文件。
执行如下命令运行脚本。bash install_mysql.sh >> install_mysql.log
vim install_sysbench.sh
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
Esc
退出编辑模式,输入:wq
并按Enter
键,保存并退出文件。bash install_sysbench.sh
vim mysql_test_run.sh
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
Esc
退出编辑模式,输入:wq
并按Enter
键,保存并退出文件。vim mysql_test_result.sh
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}"}"
Esc
退出编辑模式,输入:wq
并按Enter
键,保存并退出文件。获取 Server端的私网IP地址,然后登录Client端云服务器,执行如下命令进行测试。
您可在云服务器控制台实例列表页的“主IPv4地址”列查看Sever端云服务器的私网IP地址。
serverIP=192.168.x.xx bash mysql_test_run.sh
待上述命令运行结束后,执行如下命令获取测试结果。 bash mysql_test_result.sh
回显如下所示,其中“mysql_write_tps”表示此次测得的 MySQL 的 TPS 指标,“mysql_read_qps”表示 MySQL 的 QPS 指标。
Client端测试结束后,您也可以执行如下命令查看更详细的测试结果。
cat oltp_read_only.log
cat oltp_write_only.log
下文以查看oltp_read_only(QPS)为例,对相关指标说明如下。
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 // 前者表示平均每个线程执行的时间,后者表示标准差