本文介绍RDS MySQL通用云盘的IO加速功能,包括该功能的优势、适用范围、技术原理、性能测试等。
背景
将数据从磁盘读取到内存,或将内存数据写入磁盘是数据库系统常见的IO操作。相比内存操作,磁盘IO操作运行速度相对较慢,需消耗较多的时间。当出现大规模数据读写或频繁数据读写请求时,IO操作可能成为系统瓶颈。
因此,阿里云RDS产品推出新的存储类型——通用云盘。在兼容ESSD云盘所有特性的基础上,通用云盘采用三级存储架构对不同类型的数据和缓存进行分级管理和读写,并且引入IO突发和IO加速功能,提升了RDS实例的IO性能。更多信息,请参见什么是通用云盘。
IO加速功能介绍
缓存池(Buffer Pool)作为一个内存区域,用于缓存磁盘数据。当一个数据块需被从磁盘读取或被写入磁盘时,系统会先从缓存池中查找数据块:
若存在,则直接从缓存池中读写数据。
若不存在,则会从磁盘读写数据,并存储到缓存池。
基于此读写逻辑,缓存池能够有效减少磁盘IO操作,提升实例的IO性能。但缓存池的大小受系统内存大小的限制,当内存不足时,缓存池大小受限,从而影响IO性能。
RDS MySQL的IO加速功能引入缓存池拓展(Buffer Pool Extension)的能力,帮助扩展缓存池的大小,并结合RDS引擎内核能力,从技术上提升RDS MySQL的整体读写性能,让实例在一定时间内执行更多的读写命令,提高磁盘IO效率和系统的响应速度,实现缓存加速。
价值收益
RDS MySQL实例开启IO加速功能后,目前无需支付任何额外费用,业务不需要做任何改动。
您在无任何成本变化和业务改动的情况下,就可以获得实例IO性能的大幅度提升。以8核16 GB高可用系列通用型的RDS MySQL实例为例,开启IO加速功能后,可获得QPS读写性能提升。详情请参见性能测试。
功能优势
引入IO加速功能的缓存池拓展后,RDS MySQL的存储结构为三个层次,能够针对不同的数据存储场景和诉求,充分利用阿里云底座的各种存储介质,实现实例的IO性能提升:
提升读写性能,缩短SQL执行耗时
缓存池拓展通过缓存数据读取操作,大幅提升数据页的访问速度,缩短SQL执行时间。
缓存池拓展大幅降低访问实例ESSD数据盘中数据文件的频率,降低ESSD数据盘带宽。
提升实例的稳定性
缓存池拓展所在的磁盘(本地SSD盘)比ESSD数据盘延迟更低。同时,大幅降低ESSD数据盘IO抖动对数据库运行的影响,提升稳定性。
适用范围
目前仅满足如下条件的RDS实例支持该功能:
引擎:MySQL
版本:大于或等于MySQL 8.0 20221230
产品系列:高可用系列
规格类型:通用型
目前仅部分地域和可用区支持该功能:
产品系列
地域
可用区
高可用系列
cn-chengdu
cn-chengdu-a
cn-chengdu-b
cn-beijing
cn-beijing-h
cn-beijing-g
cn-beijing-i
cn-beijing-l
cn-guangzhou
cn-guangzhou-a
cn-hangzhou
cn-hangzhou-j
cn-hangzhou-k
cn-shanghai
cn-shanghai-l
cn-shanghai-m
cn-shanghai-b
cn-shanghai-f
cn-shanghai-g
cn-shenzhen
cn-shenzhen-e
cn-zhangjiakou
cn-zhangjiakou-c
注意事项
IO加速功能开启后,会占用实例内存,占用大小约为缓存池(Buffer Pool)大小的17%。因此,为了避免实例OOM的风险,开启IO加速功能的实例,其缓存池(Buffer Pool)的大小会自动对应下调17%。
持久化数据存放于数据盘,不依赖于缓存池拓展。因此,即使缓存池拓展中的数据全部丢失,也不会影响实例数据,不影响实例的正常使用。
在单独读操作场景或读写混合操作场景中,IO加速功能对实例IO性能的提升尤为显著。
对于CPU核数大于2的实例规格,IO加速功能对实例IO性能的提升尤为显著。
技术原理
通用云盘的IO加速功能利用了缓存池拓展技术,在不提升成本的情况下,将ESSD形态的性能进行衍生。基于冷热数据分离的思想,通过扩展Innodb的缓存池(Buffer Pool),将数据页缓存到Buffer Pool Extension中,将温数据存放在Buffer Pool Extension中,使得Innodb可以灵活使用多种存储介质,从而获得QPS性能提升。
技术架构
缓存池拓展的部署架构如下图所示。
缓存池拓展选用LocalSSD作为缓存介质,介于内存和ESSD之间。LocalSSD相比于ESSD,IO延迟更低,性能更加稳定。
LocalSSD仅存放缓存。
数据文件、Binlog文件、Redo文件等存放于ESSD盘上。
通过扩展Innodb Buffer Pool,将缓存池上的数据页缓存到缓存池扩展中,从而Innodb可以灵活使用多种缓存介质。
实现原理
开启IO加速功能后,实例的数据页会被缓存在LocalSSD的缓存池拓展上。
缓存池拓展上存放的数据页均为干净页,与ESSD中数据文件的数据保持一致。
一次数据页读取的过程如下:
客户端侧发起读取数据页的请求。
请求进入内存的缓存池(Buffer Pool)中查找指定数据页:
如果在缓存池中找到数据页,则返回结果给客户端侧,查询和读取结束。
如果在缓存池中未找到数据页,则执行步骤3。
请求进入LocalSSD的缓存池拓展中查找指定数据页:
如果在缓存池拓展中找到数据页,则返回数据页给缓存池,再返回结果给客户端侧,查询和读取结束。
如果在缓存池拓展中未找到数据页,则执行步骤4。
请求进入ESSD的数据表文件中查找指定数据页。找到数据页后返回给缓存池,再返回结果给客户端侧。
查询和读取请求结束。
性能测试
测试准备
测试方法:向同一规格实例执行数据读写操作,对比开启IO加速功能前后的QPS性能。
测试数据量:300 GB
测试工具:Sysbench(详情请参见Sysbench官方文档)
说明请提前开通ECS实例,本文测试工具安装在ECS上。
测试所用实例:分别准备一个4核8 GB和一个8核16 GB的高可用系列通用型RDS MySQL实例,并开启IO加速功能。
系列
规格代码
CPU和内存
高可用系列
mysql.n2.large.xc
4核8 GB
高可用系列
mysql.n2.xlarge.xc
8核16 GB
说明目前IO加速功能邀测中,如测试需要使用功能,请点击申请试用该功能,完成如下测试。
目前邀测仅支持创建实例时开通IO加速功能,正式上线后可在原实例上开通该功能。
测试方法
本文以CentOS系统为例进行性能测试,如果需要安装到其他操作系统测试,请参见Sysbench官方文档。
安装Sysbench
执行以下命令完成Sysbench的安装。
git clone https://github.com/akopytov/sysbench.git
cd sysbench
git checkout 0.5
yum -y install make automake libtool pkgconfig libaio-devel
yum -y install mariadb-devel
./autogen.sh
./configure
make -j
make install
测试实例QPS性能
参数说明
本测试所涉及的参数说明如下:
参数名 | 描述 |
--tables | 表数量 |
--table_size | 每个表的记录行数 |
--rand-type | 随机数分布类型 |
--rand-spec-pct | 对特定随机数分布来说被视为“特殊”值的百分比 |
--threads | 并发线程数 |
--time | 测试的持续时间(秒) |
测试读性能
准备数据:执行以下命令,在系统中准备300 GB数据量(30张数据表,每张表4000万行)。
sysbench oltp_read_only --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 prepare
测试读性能:执行以下命令测试实例的读性能。
sysbench oltp_read_only --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 run
测试写性能
准备数据:执行以下命令,在系统中准备300 GB数据量(30张数据表,每张表4000万行)。
sysbench oltp_write_only --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 prepare
测试读性能:执行以下命令测试实例的写性能。
sysbench oltp_write_only --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 run
测试读写性能
准备数据:执行以下命令,在系统中准备300 GB数据量(30张数据表,每张表4000万行)。
sysbench oltp_read_write --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 prepare
测试读写性能:执行以下命令测试实例的读写性能。
sysbench oltp_read_write --tables=30 --table_size=40000000 --rand-type=special --rand-spec-pct=15 --threads=64 --time=100 run
测试结果
4核8 GB高可用系列通用型RDS MySQL实例的测试结果如下:
读性能:开启IO加速前后,QPS性能基本持平。
写性能:开启IO加速后,QPS性能提升30%。
读写性能:开启IO加速后,QPS性能提升26%。
8核16 GB高可用系列通用型RDS MySQL实例的测试结果如下:
读性能:开启IO加速后,QPS性能提升80%。
写性能:开启IO加速后,QPS性能提升33%。
读写性能:开启IO加速后,QPS性能提升103%。