MySQL是一个开源的关系型数据库管理系统(Relational Database Management System,RDBMS),是业界最流行的RDBMS之一,广泛用于Web应用程序的后端数据存储。它是一种轻量级、快速、可靠的数据库解决方案,被广泛应用于各个行业领域,包括电子商务、金融服务、制造业和社交媒体等。
MySQL具有很高的可扩展性和稳定性,能够应对大规模数据存储和处理需求。它支持复杂的查询语言,事务处理和数据安全功能,为开发人员提供了一个强大的工具来管理和操作大规模数据。
与Redis等内存型数据库不同,MySQL的数据通常存储在磁盘上,这意味着它可以处理大量数据并且不会受到内存容量的限制。在生产环境中,MySQL通常部署在高性能的服务器上,以确保系统的稳定性和性能。它能够处理大量的并发请求,并提供高吞吐量的数据处理能力。
基于倚天710的数据中心服务器具备很强的单核计算能力,我们也通过微架构、编译、内核、操作系统、应用层等的全面优化大大提升了MySQL在倚天上的性能。
在本文中,我们总结了在倚天上自建MySQL的基本优化手段,并在阿里云ECS G8y实例(基于Armv9的倚天710处理器)和G8i实例(x86)上做了开源8.0.34版本的MySQL的性能测试对比,优化后MySQL在G8y上的性能相对于未优化在G8i上的性能在只读场景有63%的性能优势,在读写混合场景有35%的性能优势;相对于优化后的G8i仍能保持只读场景20%的性能优势,读写混合场景5%的性能优势。
优化手段
平头哥解决方案应用优化团队对MySQL应用进行了自顶向下的全面优化,具体包括应用层参数优化、系统层及OS层配置优化、编译器层优化、微架构分析优化、硬件能力优化等。
- 应用层:
- 对MySQL应用侧关键参数进行分析,针对倚天机器进行适配优化。结合当前机器内存、cache等配置合适的buffer size、innodb pool size、logfile等方式激发硬件性能潜力。
- 系统及OS层:
- 通过分析MySQL运行时系统特征,针对应用侧无关的系统参数如调度参数等进行优化,提升CPU利用率,最大程度发挥倚天性能优势。
- 通过开启代码段大页,将应用程序代码段 (.text) 通过file THP映射,减少TLB entry开销,显著降低iTLB miss,降低了整个系统中的资源竞争。
- 编译器层:
- 启用LSE指令扩展,使用原生的CAS 等指令实现数据库的原子操作,优化了加锁、解锁等操作的性能,极大提高了数据库高并发场景下的性能。
- 使用链接时优化(LTO)技术,扩展了编译器过程间分析的范围,全局优化数据库代码。
- 对OS内核及MySQL服务端应用进行PGO优化。通过更优的代码冷热重新布局,降低在典型场景运行时应用的Frontend Bound。
- 微架构分析优化:
- 基于解决方案团队自主研发的Micro-Optimizer微架构分析优化工具,通过抓取运行时指令流,进行分支跳转分析,建立基于Basic Block的分析模型,可以获取更精确的代码冷热情况,可以在PGO的基础上进一步降低i-cache miss率。
- 基于Micro-Optimizer,通过对指令流中的ldr str等访存指令进行分析建模,通过配置硬件参数进行仿真或直接采样抓取SPE数据的方式可以获取应用在运行时的d-cache miss情况。抓取热点并通过合适的指令预取或缓存锁定优化手段可针对特定PC进行缓存优化,从而降低应用整体d-cache miss率,进而在微架构层面降低backend bound。
- 硬件能力优化:
- 通过合适的硬件预取策略配置,可以进一步发挥倚天710的硬件能力。数据库的内存访问与常见workload不同,访问模式更加随机,不适合通用的数据预取策略。在数据库场景下,过于激进的数据预取可能无法提高缓存命中率,反而会增加内存带宽的使用,并且在缓存中填充无效的数据。调整预取策略,为缓存设置合理的指令预留,能给MySQL带来显著的性能收益。
综合以上各种不同层面的优化,可以在自建的开源版本MySQL同样达到很高的性能水平。其中有部分优化手段也适用于x86,我们在x86上也进行了同样的优化,也获取了一定的性能收益,但是综合来看在倚天上优化效果更佳,性能也最终得以反超x86。
测试环境及结果
我们使用sysbench作为负载生成器和性能基准测试工具。在数据库领域中,Sysbench经常被用来测试各种数据库管理系统(如MySQL、PostgreSQL等)在不同负载下的性能表现。它可以模拟并发用户访问数据库,测量数据库的读写能力、事务处理性能和并发连接处理能力等指标。
配置说明
benchmark客户端使用了一个单独的ECS.G7.8xlarge实例。
两种服务端ECS实例类型配置如下:
Processor |
ECS Type |
Yitian 710 |
G8y.2xlarge |
x86 cpu |
G8i.2xlarge |
MySQL软件版本:
Component Name |
Version |
MySQL |
8.0.34 |
GCC version |
10.2.1 20200825 (Alibaba 10.2.1-3.5 2.32) |
Sysbench |
1.0.20 |
Operating System |
5.10.134-0.git.e660833cf.al8.aarch64 |
Sysbench测试参数:
Test Config Parameter |
Value |
Number of Thread |
64 |
Number of Tables |
32 |
Table Size |
25000 |
Test Time |
1200 |
Event |
oltp_read_only/oltp_read_write/oltp_write_only |
我们将MySQL优化手段集成在ptg-accelerator中,可以在自建MySQL基础上一键调优。
注意部分优化手段也可应用在G8i上,但是整体收益依然不如G8y
TPS性能数据
G8i.2xlarge |
G8y.2xlarge |
Perf benifit gain |
||||
Read Only |
Read Write |
Read Only |
Read Write |
Read Only |
Read Write |
|
基础性能 |
7253.02 |
5204.89 |
6638.50 |
3934.25 |
-8.47% |
-24.40% |
调优后性能 |
9904.48 |
6686.58 |
11822.05 |
6990.4 |
19.36% |
4.54% |
微架构性能数据
这里对比了在倚天环境优化前后的前后端微架构指标变化数据。
指标说明:
- Frontend Stall-Rate = Frontend Stalls / (Frontend Stalls + Backend Stalls)
- Backend Stall-Rate = Backend Stalls / (Frontend Stalls + Backend Stalls)
- 基准场景的Instruction TLB Miss、Instruction L1 Miss、Branch Miss、Data TLB Miss、Data L1 Cache Miss、Data L2 Cache Miss都设置为100%,方便优化状态下作对比。
- 优化场景的以上数据为[优化/基准]的结果,以更方便地体现优化的比例
可以看到经过我们整体的优化,MySQL在g8y上的微架构性能表现有明显的提升
- 前端Bound的比例有一定的降低,在Instruction TLB Miss率上相对优化前有43.9%的提升,Instruction L1 Miss率相对优化前有25.8%的提升,Branch Miss率相对优化前有 56.3%的提升。
- 后端数据也体现出一定的性能提升,Data TLB Miss率相对优化前有47.3%的提升,Data L2 Cache Miss率有18.5%的提升。
总结
通过优化MySQL在倚天上的性能达到并反超x86的性能水平,叠加倚天在价格上的优势可获取更高的性价比优势。