# sysbench_auto_opt **Repository Path**: shilei-wang/sysbench_auto_opt ## Basic Information - **Project Name**: sysbench_auto_opt - **Description**: sysbench性能自动优化工具 - **Primary Language**: Shell - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-13 - **Last Updated**: 2025-06-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 好的,这是一个使用 Markdown 格式编写的中文 `README.md` 文档。你可以将以下内容保存为 `README.md` 文件。 --- # MySQL 自动化性能优化框架 ## 概述 本项目是一个用于自动化 MySQL 性能调优的 Bash 脚本框架。它旨在解决在高性能服务器上进行 MySQL 性能测试和调优时繁琐且耗时的问题。 该框架能够系统性地部署多个 MySQL 实例,充分利用现代硬件特性,如 **NUMA (非统一内存访问)** 和 **NVMe 固态硬盘**,并通过并行的基准测试来寻找特定工作负载下的最优配置。 其核心理念是实现从 **清理 -> 准备 -> 配置 -> 测试 -> 分析 -> 重复** 的全流程自动化。这使得数据库管理员(DBA)或性能工程师只需定义一组测试场景,框架便会自动探索出能够产生最高性能(以总 TPS 衡量)的实例数量、NUMA 绑定策略和 MySQL 参数组合。 ## 核心特性 - **全流程自动化**: 从磁盘格式化到结果汇总,整个过程由单一命令驱动,无需人工干预。 - **NUMA 亲和性部署**: 自动将 MySQL 实例及其内存绑定到特定的 NUMA 节点,以最大化地减少内存访问延迟,提升性能。 - **I/O 隔离**: 为每个 MySQL 实例分配独立的存储设备(如 NVMe 硬盘),彻底避免 I/O 争用。 - **自动化磁盘准备**: 以幂等且具有破坏性的方式,自动格式化并挂载指定的块设备,为每次测试运行创建纯净的环境。 - **多实例并行测试**: 根据定义部署多个 MySQL 实例,并使用 `sysbench` 同时对所有实例进行并行基准测试。 - **迭代式优化**: 自动遍历预定义的“策略”列表,每个策略都是实例数量、NUMA 绑定和 MySQL 参数的独特组合。 - **自动化结果收集**: 解析所有实例的 `sysbench` 输出,为每个策略计算总 TPS(每秒事务数),并将结果记录下来,便于横向比较。 - **安全设计**: 内置多重安全检查,防止意外格式化系统根分区或引导分区。 ## 架构 该框架由三个核心脚本组成: 1. `find_best_mysql_config.sh` - **协调器 / 大脑**。 - 这是您需要执行的主脚本。 - 它包含一个 `STRATEGIES` 数组,您可以在此定义所有测试方案。 - 它会遍历每个策略,并调用其他两个脚本来完成部署和测试工作。 - 最后,它会分析结果并报告性能最佳的策略。 2. `setup_mysql_instances.sh` - **部署器 / 工人**。 - 负责所有环境准备工作。 - 执行“超级清理”操作,清除之前运行留下的任何痕迹。 - 格式化并挂载存储设备。 - 为每个 MySQL 实例创建配置文件 (`.cnf`) 和 Systemd 服务文件 (`.service`),并包含 NUMA 绑定规则。 - 初始化并启动 MySQL 实例,设置 root 密码。 3. `run_sysbench_benchmark.sh` - **测试器**。 - 接收一组当前活动的 MySQL 实例端口列表。 - 连接到每个实例并创建测试所需的数据库。 - 运行 `sysbench prepare` 准备测试数据。 - 并行运行 `sysbench run` 对所有实例进行基准测试。 - 将每次测试的详细输出日志保存到指定目录。 ## 环境要求 在运行此框架之前,请确保您的服务器上已安装以下软件包。 **对于 CentOS / RHEL / AlmaLinux 等系统:** ```bash sudo yum install -y mysql-server sysbench numactl parted xfsprogs bc ``` **对于 Debian / Ubuntu 等系统:** ```bash sudo apt-get update sudo apt-get install -y mysql-server sysbench numactl parted xfsprogs bc ``` > **注意:** 本框架假定 `sysbench` 已被编译安装,并且其可执行文件位于 `/usr/local/bin/sysbench`。如果您的 `sysbench` 安装在其他路径,请务必修改 `run_sysbench_benchmark.sh` 脚本中的 `SYSBENCH_EXECUTABLE` 变量。 ## 配置与使用 整个优化流程完全由 `find_best_mysql_config.sh` 脚本中的 `STRATEGIES` 数组驱动。 ### 第 1 步:授予执行权限 首先,为所有脚本添加可执行权限: ```bash chmod +x *.sh ``` ### 第 2 步:定义测试策略 使用文本编辑器打开 `find_best_mysql_config.sh` 文件,找到 `STRATEGIES` 数组。数组中的每一行都代表一个完整的测试方案。 每个策略字符串的格式如下: `"策略名称;实例数量;NUMA节点列表;设备路径列表;MySQL参数"` - **`策略名称`**: 对该测试的一个描述性名称(例如:`4i-4n-4d-48G-BP-safe`)。 - **`实例数量`**: 要创建的 MySQL 实例总数(例如:`4`)。 - **`NUMA节点列表`**: 一个用逗号分隔的 NUMA 节点 ID 列表,用于绑定实例。其长度必须与 `实例数量` 相匹配。例如:`0,1,2,3`。 - **`设备路径列表`**: 一个用逗号分隔的块设备路径列表,用于数据存储。其长度必须与 `实例数量` 相匹配。例如:`/dev/nvme0n1,/dev/nvme1n1,/dev/nvme2n1,/dev/nvme3n1`。 - **`MySQL参数`**: 一个用分号分隔的 MySQL 参数列表,它们将被应用到 `my.cnf` 配置文件中。例如:`innodb_buffer_pool_size=48G;innodb_flush_log_at_trx_commit=1`。 #### 策略示例解析 让我们来解析下面这个策略: `"4i-4n-4d-48G-BP-fast;4;0,1,2,3;/dev/nvme0n1,/dev/nvme1n1,/dev/nvme2n1,/dev/nvme3n1;innodb_buffer_pool_size=48G;innodb_flush_log_at_trx_commit=2"` - **名称**: `4i-4n-4d-48G-BP-fast` (4 实例, 4 NUMA节点, 4 硬盘, 48G 缓冲池, 快速刷新模式) - **实例数量**: `4` - **NUMA 节点**: `0,1,2,3` (实例1绑定节点0,实例2绑定节点1,以此类推) - **设备路径**: `/dev/nvme0n1,/dev/nvme1n1,/dev/nvme2n1,/dev/nvme3n1` (实例1使用nvme0n1,以此类推) - **MySQL 参数**: `innodb_buffer_pool_size=48G` 和 `innodb_flush_log_at_trx_commit=2`。 ### 第 3 步:运行框架 使用 `sudo` 权限执行主协调脚本。在格式化磁盘之前,脚本会要求您输入 `YES` 进行确认。 ```bash sudo ./find_best_mysql_config.sh ``` 脚本现在将开始遍历您定义的所有策略,自动完成环境设置、基准测试和清理工作。根据策略数量和测试时长,此过程可能需要较长时间。 ## 解读结果 1. **实时控制台输出**: 脚本会打印详细的日志,显示当前正在执行的阶段和测试的策略。 2. **运行结束总结**: 所有测试完成后,会在控制台打印最终的总结报告,明确指出性能最佳的策略及其总 TPS。 3. **概要日志 (`optimization_summary.log`)**: 框架会创建一个 CSV 风格的日志文件,其中每行记录一个策略的配置及其最终的总 TPS。这是进行高层次比较的最佳工具。 4. **详细日志 (`sysbench_results/`)**: 如果需要深入分析,每个实例在每次运行中的完整 `sysbench` 输出都保存在 `sysbench_results/port_[端口号]/` 目录中。 ## ⚠️ 重要警告 - **破坏性操作**: 本框架会 **完全擦除并重新格式化** 您在策略中指定的存储设备。**这些设备上的所有数据都将永久丢失。** - **验证设备路径**: 在运行前,请再三检查您提供的设备路径(如 `/dev/nvme...`, `/dev/sd...`)是否正确。尽管脚本包含防止格式化系统盘的安全检查,但您仍需对提供正确的目标设备负最终责任。 - **专用服务器**: 本工具专为在专用的、非生产环境的基准测试服务器上使用而设计。**请勿在生产环境中运行此框架。** ## 问题排查 - **`sysbench: command not found` (命令未找到)**: 请确保 `run_sysbench_benchmark.sh` 脚本中的 `SYSBENCH_EXECUTABLE` 变量指向了 `sysbench` 二进制文件的正确且完整的路径(例如 `/usr/local/bin/sysbench`)。 - **`Access denied for user 'root'@'localhost'` (访问被拒绝)**: 这通常意味着密码不匹配。请检查 `setup_mysql_instances.sh` 中的 `DEFAULT_ROOT_PASSWORD` 变量是否与 `run_sysbench_benchmark.sh` 中的 `MYSQL_PWD` 变量一致。 - **`mkfs.xfs: contains a mounted filesystem` 或 `initialize ... failed` (初始化失败)**: 这通常是由于上一次运行被中断导致的。最新版本的 `setup_mysql_instances.sh` 中的“超级清理”阶段应能处理此问题。如果问题依旧,您可以在重新运行前,尝试手动卸载测试磁盘(`sudo umount /mnt/disk*`)。