最近更新时间:2023.05.30 08:34:20
首次发布时间:2023.05.30 08:34:20
MySQL 是一个关系型数据库管理系统(Relational Database Management System,RDBMS),使用最常用的结构式查询语言 SQL 进行数据库管理。在 WEB 应用方面,MySQL 在高负载的情况下对虚拟机的 CPU 算力、网络和存储等性能要求很高,经常被用作衡量虚拟机整体性能的应用软件之一。
本文为您介绍使用 SysBench 工具测试云服务器实例 MySQL 应用性能的方法。
说明
SysBench 是一个模块化的、跨平台、开源的多线程基准测试工具,可以执行数据库、 CPU 、内存、线程、 IO 等方面的性能测试,主要用于评估测试各种不同系统参数下的数据库负载情况。
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 // 前者表示平均每个线程执行的时间,后者表示标准差