TDSQL-C MySQL 版的 TXSQL 内核支持编译优化高性能版本,可以在保持原有兼容性、不更改内核内部实现逻辑的前提下,借助动态编译器优化手段考虑用户可能的输入行为,使得数据库内核在业务通用场景下表现出更强的性能、同时降低其使用功耗。本文为您介绍 TDSQL-C MySQL 版的编译优化高性能版本。
支持版本
内核版本 TDSQL-C MySQL 版5.7 2.1.11及以上。
内核版本 TDSQL-C MySQL 版8.0 3.1.12及以上。
说明:
背景
随着现代 CPU 内部实现的日益复杂,云数据库默认的编译、配置和运行方法很难充分发挥 CPU 的性能潜力,导致大量 CPU 周期空转。这种现象在规模效应叠加的情况下,不仅造成硬件资源的浪费,而且还会浪费大量的功耗。因此,需要对云数据库进行优化,以最大限度地发挥 CPU 的性能潜力,减少 CPU 周期的空转,提高硬件资源的利用率,并降低功耗的浪费。
TDSQL-C MySQL 版在不更改数据库内核业务逻辑代码前提下,借助动态编译器优化手段,以最小的代价完成了内核性能提升和功耗减少。通过收集云数据库在典型/真实业务场景下的行为和性能消耗数据,解决默认编译方式对业务行为无感知的问题;分析数据库运行时的行为特征,结合 CPU 微架构的特点,利用编译优化技术使得优化之后的版本对 CPU 微架构更友好,可充分发挥 CPU 的性能潜力;通过大量的场景测试以保证优化效果在各种条件下不劣化。
通过以上技术手段,此版本实现了如下优化:
1. 基于数据库运行行为数据实现反馈优化,提升函数内联/函数重排/基本库重排的优化能力,从而大幅降低数据库 CPU ICache/ITLB 失效,提升性能。
2. 通过“链接时优化技术”增加编译优化视野,从单文件单函数扩展到跨文件/全二进制文件范围,可极大提升内联的优化空间,降低指令数。
3. 在实践中摸索出一套高效验证和分析的方法,确保效果接近理论极限和保证在各种场景下不劣化。
什么是编译优化
编译优化是指在编译代码时,通过对代码进行优化和调整编译参数,以提高程序的执行效率和性能的过程。
优化原理
TDSQL-C MySQL 版的编译优化高性能版本使用 PGO(profile guided optimization) 技术进行优化,PGO 技术能够解决传统编译器在执行优化时,只基于静态代码信息,而不去考虑用户可能的输入,从而无法对代码进行有效优化的问题。
PGO 技术主要分为以下三个阶段:
1. instrument:在 instrument 阶段,先对应用做一次编译,在此编译中,编译器会向代码中插入指令,以便下一阶段可以收集数据。这些指令分为三种类型,分别用于统计每个函数被执行了多少次、每个分支被执行了多少次(例如 if-else 的场景)以及某些变量的值(主要用于 switch-case 的场景)。
2. train:在 train 阶段,用户需要使用最常用的输入来运行上一阶段编译生成后的应用。由于上一阶段已经做好了收集数据的准备,所以在经过 train 阶段之后,该应用最常见的使用场景对应的数据就会被收集下来。
3. optimization:在 optimization 阶段中,编译器会利用上一阶段收集到的数据,对应用进行重新编译。由于上一阶段的数据来自于用户输入的最常见的用户场景,所以最后优化得到的结果就能在该场景下有更好的优化。
通过以上三个阶段的优化,TDSQL-C MySQL 版的编译优化高性能版本就能更好地适应用户的需求,提高应用的性能和效率。
性能测试
测试场景
混合读写(point select)测试场景,主要测试数据库在同时进行读写操作时的性能表现,可以帮助评估数据库在实际应用场景下的性能表现,包括并发读写操作的处理能力、响应时间、吞吐量等指标。
测试结果
规格 | 并发 | 单表数据量(table_size) | 表总数(tables) | QPS | |
| | | | 使用编译优化版本 | 提升百分比 |
2核16GB | 64 | 800000 | 150 | 29207 | 27% |
4核16GB | 256 | 800000 | 300 | 65562 | 27% |
4核32GB | 256 | 800000 | 300 | 78973 | 27% |
8核32GB | 256 | 800000 | 300 | 139845 | 28% |
8核64GB | 256 | 800000 | 450 | 154894 | 28% |
16核64GB | 256 | 800000 | 450 | 249954 | 29% |
16核96GB | 256 | 800000 | 600 | 238061 | 29% |
16核128GB | 512 | 5000000 | 300 | 253848 | 29% |
32核128GB | 512 | 5000000 | 300 | 399647 | 30% |
32核256GB | 512 | 5000000 | 400 | 402105 | 30% |
64核256GB | 512 | 6000000 | 450 | 596706 | 31% |