MySQL 性能压测工具深度实践:从部署到多环境对比的完整指南

核心问题:如何系统化地完成 MySQL 性能基准测试,并生成可用于横向对比的生产级性能报告?

在日常数据库运维与架构选型中,性能测试往往停留在零散的手动操作层面。执行几次 sysbench 命令、看一眼 QPS 数值、凭经验判断”够用”,这种模式无法支撑关键业务决策。本文介绍的这套基于 sysbench 与 tsar 的自动化压测方案,正是为了填补这一空白——它不仅实现了测试流程的标准化,更重要的是将性能数据与系统监控精准关联,让每一次测试都可复现、可对比、可量化。通过这套工具链,你将能够在相同基准下对比不同硬件配置、不同 MySQL 参数、不同云厂商实例的真实性能表现,为数据库选型与优化提供坚实的数据支撑。


一、工具的核心定位:它解决了什么痛点?

核心问题:这套工具与手动执行 sysbench 有何本质区别?

手动执行 sysbench 测试存在三个致命缺陷:数据准备不统一、监控采集不精确、结果整理碎片化。本工具通过三层设计彻底解决了这些问题。

1.1 完整的测试场景覆盖

工具预设了四种生产环境最具代表性的负载模型,而非简单的读写混合。每种场景对应真实的业务压力:

  • 点查询(oltp_point_select):模拟高频缓存命中场景,如用户会话查询、商品信息检索。这类查询侧重考验 InnoDB 缓冲池效率与 CPU 吞吐。
  • 只读事务(oltp_read_only):模拟复杂报表、数据分析场景,包含范围查询与聚合操作。它会压测排序缓冲区与临时表性能。
  • 读写混合(oltp_read_write):最接近真实业务,模拟订单处理、用户行为日志写入。该场景下日志刷盘策略与锁竞争成为瓶颈关键。
  • 只写事务(oltp_write_only):模拟批量数据导入、日志归档等高写入场景,直接暴露磁盘 I/O 子系统与 redo log 配置短板。

应用场景示例:某电商平台在”双十一”前需要评估新采购的 NVMe SSD 服务器是否能承担订单峰值的写入压力。通过单独执行 oltp_write_only 场景,并对比旧 SATA SSD 服务器的测试报告,发现新硬件在 128 线程下 TPS 提升 3.2 倍,但 IO 利用率仅 52%,说明仍有 40% 以上的性能余量,从而放心将核心交易库迁移。

1.2 精准的时间维度监控匹配

传统做法是在测试前后手动执行 iostattop,但采集时间点与压测时段不匹配,导致监控数据失真。本工具强制要求在被压测的 MySQL 宿主机上启动 tsar 监控,并以 1 秒为间隔持续记录。测试脚本会自动提取与压测时段精确对应的监控样本,确保每个 QPS 数据点都有对应的 CPU 与 IO 利用率。

配置要点:启动 tsar 时必须指定数据盘设备名。例如,若 MySQL 数据目录挂载在 /dev/sfdv0n1,命令应为:

nohup tsar --cpu --io -I sfdv0n1 -l -i1 >/tmp/tsar.log &

这里的 -I sfdv0n1 是指定磁盘设备,-i1 是 1 秒采集间隔,-l 是实时输出到日志。若设备名错误,监控数据将为空,生成的报告也会缺失关键 IO 指标。

1.3 自动化报告生成与多环境对比

单次测试生成 HTML 与 Markdown 双格式报告只是基础。真正的价值在于 merge_reports.py 脚本——它可以将不同机房、不同配置、不同云厂商的测试报告整合为统一格式的对比分析文档。例如,你可以清晰看到自建 IDC 的物理机与阿里云 RDS 在相同数据规模下的 QPS 差异、延迟分布与 CPU 消耗,为混合云架构决策提供直接依据。


二、环境准备:每一步都需严谨执行

核心问题:压测环境与生产环境不一致会导致测试结果完全失效,如何确保环境准备的准确性?

性能测试的有效性建立在环境一致性之上。以下准备步骤必须严格执行,任何疏忽都会让测试结果失去参考价值。

2.1 压测客户端配置

压测客户端是发起请求的源头,其自身性能不能成为瓶颈。

操作系统选择:文档明确要求 Linux 环境(CentOS/RHEL/AlmaLinux)。Windows 或 macOS 因网络栈与进程调度差异,无法产生稳定的并发连接。建议压测客户端与 MySQL 服务器位于同一机房内网,网络延迟应低于 1ms。若跨机房测试,需在结果中注明网络损耗。

软件安装

# CentOS/RHEL 系统
yum install -y sysbench python3

# Ubuntu/Debian 系统  
apt-get install -y sysbench python3

验证安装

sysbench --version  # 应显示 1.0+
python3 --version   # 应显示 3.6+

作者反思:曾遇到压测客户端因内核参数 net.core.somaxconn 过小,导致高并发下连接队列溢出,测试结果呈现不稳定的断崖式下跌。因此,建议在测试前检查 ulimit -n(文件句柄数)与 net.ipv4.tcp_max_syn_backlog,确保其值大于测试线程数的 2 倍。

2.2 MySQL 服务器端配置

被压测的 MySQL 实例需要调整两个关键点:

安装 tsar 监控工具

yum install -y tsar

若官方源无 tsar,需从源码编译。tsar 是阿里开源的系统监控工具,比 sar 更轻量,输出格式更易解析。

调整 MySQL 参数

SET GLOBAL max_prepared_stmt_count = 1048576;

此参数默认值通常为 16382,在高并发 sysbench 测试中极易耗尽,导致”Can’t create more than max_prepared_stmt_count statements”错误。设置为 1048576 可确保测试顺利进行。

磁盘设备识别:这是最容易出错的环节。登录 MySQL 服务器执行:

lsblk | grep -E '(nvme|sda|vda|sfd)'  # 根据实际设备名筛选
df -h | grep mysql  # 查看数据目录挂载点

例如,若输出显示 /dev/sfdv0n1 挂载在 /data/mysql,则 tsar 命令必须是 tsar --cpu --io -I sfdv0n1。注意,这里不需要写完整路径,只需设备名。

2.3 权限与网络要求

MySQL 权限:测试账号需要具备创建库、创建表、插入数据的权限。建议在配置文件中使用专用测试账号:

CREATE USER 'sbtest'@'%' IDENTIFIED BY 'complex_password';
GRANT ALL PRIVILEGES ON sbtest.* TO 'sbtest'@'%';

SSH 免密登录:脚本需要通过 SSH 登录 MySQL 宿主机获取 tsar 日志。配置 root 账号的 SSH key 免密登录:

ssh-copy-id root@YOUR_MYSQL_HOST

验证方法:ssh root@YOUR_MYSQL_HOST "hostname" 应能直接执行并返回主机名。


三、配置文件详解:每个参数都影响测试结果

核心问题:配置文件中的参数如何映射到实际的测试行为与数据规模?

benchmark_config.conf 是测试的”蓝图”,参数设置直接决定了测试的严谨性与可比性。

3.1 基础数据库连接配置

MYSQL_HOST=192.168.1.100      # 必须是内网 IP,公网 IP 会引入网络抖动
MYSQL_PORT=3306               # 非默认端口需显式指定
MYSQL_USER=sbtest             # 专用测试账号
MYSQL_PASSWORD=complex_password
MYSQL_DB=sbtest               # 测试库名,建议与用户名一致避免混淆

场景示例:在混合云架构中,你需要对比腾讯云 MySQL 与自建 IDC 的性能。将两个环境的 IP、端口分别配置为 tencent_cloud.confidc.conf,保持其他参数(表数量、行数、线程数)完全一致,才能得出公允结论。

3.2 测试数据规模定义

TABLES=16                     # 表数量
TABLE_SIZE=10000000           # 单表行数(一千万)

这两个参数决定了数据集的总量与访问分散度。16 张表 × 一千万行 = 1.6 亿条数据,约 40GB 数据量(含索引)。对于 30GB 内存的实例,这能确保部分数据在缓冲池外,产生真实 IO 压力。若数据量过小,测试结果会虚高,无法反映生产环境。

调整策略

  • 缓冲池 16GB 以下:保持 16 张表 × 1000 万行
  • 缓冲池 32GB-64GB:可增至 32 张表 × 2000 万行
  • 缓冲池 128GB 以上:可增至 64 张表 × 5000 万行

3.3 测试时间与数据准备

TEST_TIME=30                  # 单场景测试时长(秒)
NEED_PREPARE=true             # 是否重新生成测试数据

TEST_TIME:30 秒是平衡测试效率与数据稳定性的经验值。时间过短(如 10 秒)会导致 QPS 波动大;时间过长(如 120 秒)在多次迭代测试中耗时严重。建议在正式基准测试用 30 秒,快速验证用 10 秒。

NEED_PREPARE:首次测试必须设为 true,脚本会调用 sysbench prepare 生成数据。后续测试若数据未变动,设为 false 可节省 20-30 分钟数据加载时间。但需注意,若表结构或数据被篡改,必须重新准备。

3.4 测试场景与并发线程

SCENARIOS="oltp_point_select oltp_read_only oltp_read_write oltp_write_only"
THREADS="1 8 16 32 64 128"

场景选择:不必每次都运行全部四种。例如,只读业务系统可仅测试 oltp_point_selectoltp_read_only;日志写入系统重点测试 oltp_write_only

线程选择:线程数序列应覆盖从低到高的完整梯度。1 线程反映串行处理能力与单请求延迟;8-32 线程反映日常并发;64-128 线程模拟峰值流量。若服务器 CPU 核心数为 8,线程数超过 128 后性能提升有限,反而会增加调度开销。

作者反思:曾因线程数设置跳跃过大(1, 16, 128)误判了性能拐点。实际应在 32 线程时发现 CPU 已饱和,但缺少 64 线程数据,误以为 128 线程会更高。后来补充 8, 16, 32, 64 后才发现性能在 48 线程达到顶峰后下降。因此,线性递增的线程序列至关重要。


四、首次压测完整操作流程

核心问题:从零开始,如何确保第一次压测就能得到有效的、可信的结果?

4.1 启动 tsar 监控

登录 MySQL 服务器,执行:

# 确认数据盘设备名
lsblk
# 输出示例:sfdv0n1  259:2    0  3.5T  0 disk /data

# 启动监控(设备名替换为你的实际盘符)
nohup tsar --cpu --io -I sfdv0n1 -l -i1 >/tmp/tsar.log 2>&1 &

# 验证监控运行
ps aux | grep tsar | grep -v grep
tail -5 /tmp/tsar.log

常见错误:若 tail 输出为空,说明 tsar 未正常写入。检查设备名是否正确,或尝试用 tsar --cpu --io -I sfdv0n1 -l -i1 直接在终端运行看是否有输出。

4.2 准备配置文件

创建 benchmark_config.conf

# 数据库配置
MYSQL_HOST=192.168.1.100
MYSQL_PORT=3306
MYSQL_USER=sbtest
MYSQL_PASSWORD=your_secure_password
MYSQL_DB=sbtest

# 测试配置
TABLES=16
TABLE_SIZE=10000000
TEST_TIME=30
NEED_PREPARE=true

# 测试场景
SCENARIOS="oltp_point_select oltp_read_only oltp_read_write oltp_write_only"

# 并发线程
THREADS="1 8 16 32 64 128"

安全提示:配置文件含明文密码,必须设置文件权限 chmod 600 benchmark_config.conf,避免泄露。

4.3 执行测试

# 赋予执行权限
chmod +x mysql_benchmark.sh

# 启动测试(自动生成报告)
./mysql_benchmark.sh benchmark_config.conf

执行过程解析

  1. 脚本读取配置文件,验证 MySQL 连接
  2. NEED_PREPARE=true,执行 sysbench prepare,生成 16 张表并插入 1000 万行数据/表
  3. SCENARIOS 顺序依次测试,每种场景按 THREADS 列表递增线程数
  4. 每个线程数测试时长为 TEST_TIME 秒,结束后自动采集 tsar 日志
  5. 所有场景完成后,调用 Python 脚本生成 HTML 与 Markdown 报告

自定义执行

# 快速测试(10秒/场景)
./mysql_benchmark.sh benchmark_config.conf 10

# 使用已有数据(跳过 prepare)
./mysql_benchmark.sh benchmark_config.conf 30 false

作者反思:第一次在生成环境运行,因未评估磁盘空间导致 prepare 阶段失败。16 张表 × 1000 万行写入时,磁盘占用达到 85% 触发告警。建议测试前预留至少 50GB 空闲空间,并监控 df -h 实时变化。若空间不足,可临时将 TABLE_SIZE 调整为 5000000。


五、测试报告深度解读:不止于 QPS

核心问题:自动生成的报告包含哪些关键信息?如何从这些数据中提取可行动的性能洞察?

测试完成后,会在 mysql_benchmark_YYYYMMDD_HHMMSS/ 目录生成两个文件:

5.1 报告结构概览

以默认配置为例,报告包含:

场景 线程数 QPS/TPS 95%延迟 (ms) CPU% IO% 监控样本数
oltp_point_select 1 17,109 0.06 1.2% 0.1% 30
oltp_point_select 128 321,410 0.41 12.9% 0.1% 30
oltp_write_only 1 12,740 0.08 0.8% 2.1% 30
oltp_write_only 128 139,564 1.83 6.4% 52.3% 30

监控样本数:30 表示 30 秒测试期采集了 30 个 tsar 样本(每秒一个),与 TEST_TIME 完全对应。若样本数少于预期,说明 tsar 采集丢失,需检查监控稳定性。

5.2 关键指标解读

QPS vs TPS

  • oltp_point_selectoltp_read_only 主要关注 QPS(每秒查询数)
  • oltp_read_writeoltp_write_only 主要关注 TPS(每秒事务数,一个事务含多个语句)

延迟分布:95% 延迟反映了绝大多数用户的体验。若 95% 延迟超过 10ms,说明系统在高并发下响应恶化,需排查锁等待或 IO 瓶颈。

CPU% 与 IO% 的关联分析

  • 高 QPS + 低 CPU% + 低 IO%:查询命中缓冲池,CPU 未饱和,有上升空间
  • 高 QPS + 高 CPU% + 低 IO%:CPU 成为瓶颈,需优化查询或升级 CPU
  • 低 QPS + 低 CPU% + 高 IO%:磁盘 IO 瓶颈,需优化索引或升级存储
  • 低 QPS + 高 CPU% + 高 IO%:系统性瓶颈,需综合调优

场景示例:某次测试中,oltp_read_write 场景在 64 线程时 QPS 为 45,000,CPU 利用率 85%,IO 利用率 15%。当线程增至 128 时,QPS 仅微增至 46,500,CPU 达到 98%,IO 仍为 15%。结论:该配置下,性能瓶颈在 CPU,增加线程无益,应优化查询复杂度或升级 CPU 主频。

5.3 报告文件内容

performance_report.html:可视化图表,适合向管理层展示。包含 QPS/TPS 折线图、延迟柱状图、CPU/IO 利用率趋势图。

performance_report.md:结构化文本,适合技术归档与版本对比。包含详细配置、原始数据表格、环境信息(通过 SHOW VARIABLES 采集的 MySQL 参数)。

tsar.log:原始监控数据,可用于二次分析。格式为时间戳 + CPU% + IO%,例如:

20241130 14:30:01  45.2  12.3
20241130 14:30:02  47.8  13.1

六、多环境性能对比:挖掘数据背后的架构决策价值

核心问题:当拥有多个环境的测试报告后,如何科学地对比并得出可指导架构选型的结论?

6.1 对比的价值与前提

单一环境的测试只能回答”这个配置性能如何”,无法回答”A 配置比 B 配置好多少,好在哪里”。通过 merge_reports.py,可将不同环境的报告合并,生成横向对比。

前提条件:各环境的测试配置必须严格一致——相同的表数量、行数、线程数、测试时长。唯一差异应是待对比的变量(如 CPU 型号、磁盘类型、MySQL 版本)。

6.2 操作步骤

假设已有三个环境的测试报告:

  • idc/:自建机房,Intel 6248R,SATA SSD
  • huawei/:华为云,鲲鹏 920,NVMe SSD
  • aliyun/:阿里云,Intel 8269CY,ESSD

目录结构:

sysbench_report/
├── merge_reports.py
├── idc/
│   └── performance_report.md
├── huawei/
│   └── performance_report.md
└── aliyun/
│   └── performance_report.md

执行合并:

python3 merge_reports.py idc,huawei,aliyun

输出 mysql_sysbench.md,包含:

  1. 环境配置对比表:自动提取各环境的 innodb_buffer_pool_size 并转换为 GB,对比 CPU、内存、磁盘类型
  2. 性能汇总表:四种场景、所有线程数的 QPS/TPS 并列对比,直接显示百分比差异
  3. 延迟分析:95% 延迟的横向比较
  4. 关键发现:自动识别性能最高/最低的环境,并给出初步分析

6.3 实际案例解读

某互联网公司需将数据库从自建 IDC 迁移至公有云,通过对比发现:

场景 IDC (QPS) 华为云 (QPS) 阿里云 (QPS) 结论
点查询 (128线程) 280,000 320,000 340,000 阿里云领先 21%
只写 (128线程) 95,000 145,000 138,000 华为云领先 52%
CPU 利用率 95% 78% 82% 华为云 CPU 效率更高

决策洞察:虽然阿里云点查询性能最强,但华为云在写入场景优势明显,且 CPU 利用率更低,意味着在同等负载下资源更充裕。由于业务以订单写入为主,最终选择华为云,并将节省的 CPU 资源用于部署只读副本。


七、常见问题排查与性能调优

核心问题:测试过程中遇到的典型问题有哪些根源?如何系统性调优而非盲目尝试?

7.1 高频问题排查

问题一:连接失败

# 测试连通性
mysql -h MYSQL_HOST -P 3306 -u sbtest -p

# 检查防火墙
telnet MYSQL_HOST 3306

根源:可能是账号权限限制、MySQL bind-address 未开放、安全组/iptables 拦截。

问题二:tsar 监控数据为空

# 在 MySQL 服务器上检查
ps aux | grep tsar
ls -la /tmp/tsar.log
ssh root@MYSQL_HOST "tail /tmp/tsar.log"

根源:99% 是设备名错误。必须确认 tsar -I 后的参数与实际数据盘设备名完全一致。

问题三:max_prepared_stmt_count 耗尽
表现:sysbench 报错 “Can’t create more than max_prepared_stmt_count statements”
解决:在 MySQL 中执行 SET GLOBAL max_prepared_stmt_count = 1048576;,并建议写入 my.cnf 永久生效。

问题四:prepare 阶段磁盘空间不足
表现sysbench prepare 中途失败,磁盘使用率 100%
解决:清理日志或扩容。预防性检查:df -h 确保空闲空间 > 50GB。

7.2 MySQL 参数调优建议

基于测试反馈的调优方向:

缓冲池大小:若点查询场景 IO% > 10%,说明缓冲池不足

-- 建议设置为物理内存的 70%
SET GLOBAL innodb_buffer_pool_size = '24G';  -- 对于 32GB 内存服务器

日志刷盘策略:若只写场景延迟高,IO 利用率正常,可调整:

-- 性能模式,每秒刷盘,可能丢失 1 秒事务
SET GLOBAL innodb_flush_log_at_trx_commit = 2;

-- 双一模式,每次事务刷盘,最安全但性能最低
SET GLOBAL innodb_flush_log_at_trx_commit = 1;

连接数限制:若测试中报 “Too many connections”

SET GLOBAL max_connections = 500;

作者反思:调优最忌讳”一步到位”。曾将 innodb_buffer_pool_size 从 8G 直接调到 48G(64G 内存),结果导致系统 SWAP 激增,性能反而下降。正确做法是每次调整 20%,观察 10 分钟,确认无 SWAP 且 QPS 提升后再继续。性能调优是渐进过程,数据驱动比经验主义更可靠。


八、实用摘要与操作清单

核心问题:如何快速将本文转化为可执行的行动计划?

8.1 测试前检查清单

  • [ ] 客户端:已安装 sysbench 1.0+ 与 Python 3.6+
  • [ ] 服务器:已安装 tsar,并确认数据盘设备名
  • [ ] MySQL:已创建专用测试账号,授予足够权限
  • [ ] 参数:已设置 max_prepared_stmt_count = 1048576
  • [ ] 网络:客户端与服务器内网延迟 < 1ms,SSH 免密登录正常
  • [ ] 磁盘:服务器空闲空间 > 50GB,df -h 确认
  • [ ] 配置benchmark_config.conf 中设备名、IP、密码已修改
  • [ ] 监控:已启动 tsar 并验证日志有输出

8.2 标准测试流程

  1. 准备环境:按清单检查,启动 tsar
  2. 编辑配置:复制 benchmark_config.confmytest.conf,填写真实参数
  3. 执行测试./mysql_benchmark.sh mytest.conf
  4. 等待完成:观察日志输出,确保无错误
  5. 查看报告:打开 performance_report.html,检查样本数是否完整
  6. 保存结果:将报告目录重命名为有意义的名字,如 mysql_benchmark_idc_v1

8.3 多环境对比流程

  1. 统一配置:确保各环境的 benchmark_config.conf 中测试参数完全一致
  2. 分别测试:在每个环境独立执行测试,生成报告目录
  3. 整理目录:将所有报告目录移至同一父目录,确保每个目录下有 performance_report.md
  4. 执行合并python3 merge_reports.py env1,env2,env3
  5. 分析结论:阅读生成的 mysql_sysbench.md,识别性能差异与瓶颈

九、一页速览(One-page Summary)

工具定位:基于 sysbench + tsar 的 MySQL 自动化压测与报告生成解决方案。

核心功能

  • 四种生产级测试场景(点查询、只读、读写、只写)
  • 1 秒级精准系统监控采集
  • HTML/Markdown 双格式自动报告
  • 多环境性能横向对比

环境要求

  • 客户端:Linux, sysbench 1.0+, Python 3.6+
  • 服务器:MySQL 5.7/8.0, tsar, SSH root 访问

快速启动三步骤

# 1. 安装
yum install -y sysbench python3 tsar

# 2. 配置
vi benchmark_config.conf  # 修改 IP、端口、密码、设备名

# 3. 启动监控与测试
ssh root@MYSQL_HOST "tsar --cpu --io -I nvme0n1 -l -i1 >/tmp/tsar.log &"
./mysql_benchmark.sh benchmark_config.conf

关键参数

  • TABLES=16, TABLE_SIZE=10000000 → 1.6 亿数据量
  • TEST_TIME=30 → 每线程数测试 30 秒
  • THREADS="1 8 16 32 64 128" → 覆盖低至高并发
  • max_prepared_stmt_count=1048576 → 避免高并发报错

输出mysql_benchmark_YYYYMMDD_HHMMSS/performance_report.html

多环境对比python3 merge_reports.py idc,huawei,aliyun


十、常见问题解答 (FAQ)

Q1: 为什么测试前必须启动 tsar?能否用其他监控工具替代?

A: tsar 的 1 秒级采集能与 sysbench 测试时段精确匹配,确保每个性能数据点都有对应的系统负载数据。虽然可用 iostat -x 1vmstat 1 替代,但脚本已集成 tsar 日志解析,替换需修改 Python 报告生成器代码。tsar 轻量、格式规范,是推荐方案。

Q2: 测试数据量如何确定?文档中的 16 张表 × 1000 万行是否固定?

A: 这个规模适用于 16GB-32GB 内存的实例,确保数据量大于缓冲池,产生真实 IO。若服务器内存 64GB,可调整为 32 张表 × 2000 万行;若内存仅 8GB,可减为 8 张表 × 500 万行。原则是 数据总量 = 2-3 倍缓冲池大小

Q3: 测试时报 “Can’t create more than max_prepared_stmt_count” 错误,如何解决?

A: 这是高并发下 sysbench 预编译语句耗尽。必须在 MySQL 中执行:SET GLOBAL max_prepared_stmt_count = 1048576;。建议同时写入 my.cnf[mysqld] 段:max_prepared_stmt_count = 1048576,避免重启失效。

Q4: 生成的监控样本数少于预期,可能原因是什么?

A: 三种可能:1) tsar 启动时间晚于测试开始时间,提前启动可解决;2) tsar 因设备名错误未写入日志,检查 /tmp/tsar.log 有无数据;3) 测试时长 TEST_TIME 过短,脚本采集频率为 1 秒,若测试 5 秒则样本数为 5。

Q5: 多环境对比时,为何要求测试配置完全相同?

A: 性能对比需控制变量。若表数量、行数、线程数不同,性能差异无法归因于硬件或配置。唯一应变的量是对比目标(如磁盘类型),其他所有参数必须一致,这是科学测试的基本原则。

Q6: 如何判断当前配置是 CPU 瓶颈还是 IO 瓶颈?

A: 查看报告中的 CPU% 与 IO%:若 CPU% > 90% 且 IO% < 30%,为 CPU 瓶颈;若 CPU% < 50% 且 IO% > 80%,为 IO 瓶颈;若两者均高,需综合优化。点查询场景通常为 CPU 瓶颈,只写场景常为 IO 瓶颈。

Q7: 测试过程中能否中断?中断后如何恢复?

A: 可直接 Ctrl+C 中断。若已生成部分数据,下次测试将 NEED_PREPARE=false 即可跳过数据准备阶段,从第一个未完成的场景开始。但建议完整测试以减少数据不一致性。

Q8: 报告中的 95% 延迟与 99% 延迟有何区别?为何重点关注 95%?

A: 95% 延迟表示 95% 的请求在此时间内完成,反映大多数用户体验;99% 延迟反映最差 1% 的请求,受毛刺影响大。文档关注 95% 是因为它更具代表性,能平滑异常值,适合作为 SLA 指标。若 95% 延迟达标而 99% 延迟过高,需排查偶发性锁竞争或刷盘抖动。