如果您希望提升磁盤IO效率和系統的響應速度,可以使用RDS MySQL通用云盤的IO加速功能,該功能可以幫助擴展緩存池的大小,實現緩存加速,提升RDS實例的整體讀寫性能。本文介紹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效率和系統的響應速度,實現緩存加速。
功能優勢
引入IO加速功能的緩存池拓展后,RDS MySQL的存儲結構分為三個層次,能夠針對不同的數據存儲場景和訴求,充分利用阿里云底座的各種存儲介質,實現實例的IO性能提升:
提升讀寫性能,縮短SQL執行耗時
緩存池拓展通過緩存數據讀取操作,大幅提升數據頁的訪問速度,縮短SQL執行時間。
緩存池拓展大幅降低訪問實例通用云盤中數據文件的頻率,降低通用云盤帶寬。
提升實例的穩定性
緩存池拓展所在的磁盤比通用云盤延遲更低。同時,大幅降低通用云盤IO抖動對數據庫運行的影響,提升穩定性。
在IO加速解決方案體驗館中,通過構建真實的RDS資源,可以直觀看到開啟IO加速和不開啟IO加速的實時壓測情況,且功能免費。詳情請參見RDS通用云盤IO加速(BPE)性能&價格力觀測。
價值收益
RDS MySQL實例開啟IO加速功能后,目前無需支付任何額外費用,業務不需要做任何改動。
您在無任何成本變化和業務改動的情況下,就可以獲得實例IO性能的大幅度提升。以8核16 GB高可用系列通用型的RDS MySQL實例為例,開啟IO加速功能后,可獲得QPS讀寫性能提升。詳情請參見性能測試。
技術原理
通用云盤的IO加速功能利用了緩存池拓展技術,在不提升成本的情況下,將ESSD形態的性能進行衍生。基于冷熱數據分離的思想,通過擴展InnoDB的緩存池(Buffer Pool),將數據頁緩存到Buffer Pool Extension中,將溫數據存放在Buffer Pool Extension中,使得InnoDB可以靈活使用多種存儲介質,從而獲得QPS性能提升。
技術架構
緩存池拓展的部署架構如下圖所示。
緩存池拓展選用多種高速磁盤作為緩存介質,介于內存和通用云盤之間。高速磁盤相比于通用云盤,IO延遲更低,性能更加優異。
高速磁盤僅用于存放緩存。
數據文件、Binlog文件、Redo文件等存放于通用云盤上。
通過擴展InnoDB Buffer Pool,將緩存池上的數據頁緩存到緩存池擴展中,從而InnoDB可以靈活使用多種緩存介質。
實現原理
開啟IO加速功能后,實例的數據頁會被緩存在高速磁盤的緩存池拓展上。
緩存池拓展上存放的數據頁均為干凈頁,與通用云盤中數據文件的數據保持一致。
一次數據頁讀取的過程如下:
客戶端發起讀取數據頁的請求。
請求進入內存的緩存池(Buffer Pool)中查找指定的數據頁:
如果在緩存池中找到數據頁,則將結果返回給客戶端側,查詢和讀取結束。
如果在緩存池中未找到數據頁,則執行步驟3。
請求進入高速磁盤的緩存池拓展中查找指定數據頁:
如果在緩存池拓展中找到數據頁,則將數據頁返回給緩存池,然后將結果返回給客戶端側,查詢和讀取結束。
如果在緩存池拓展中未找到數據頁,則執行步驟4。
請求進入通用云盤的數據表文件中查找指定數據頁。找到數據頁后返回給緩存池,再將結果返回給客戶端側。
查詢和讀取請求結束。
適用范圍
引擎:RDS MySQL
版本:大于或等于MySQL 8.0 20230914
產品系列:高可用系列、集群系列
產品類型:標準版
規格族:通用型
地域和可用區(僅做參考,實際請以控制臺為準):
地域
可用區
西南1(成都)
可用區B
華北2(北京)
可用區I
華東2(上海)
可用區M
可用區N
華東1(杭州)
可用區J
說明在售賣頁面開啟IO加速功能后,可在主可用區及網絡處查看是否支持。
費用
RDS MySQL通用型規格的通用云盤IO加速功能免費。
注意事項
RDS MySQL通用型規格的IO加速功能免費。
緩存池拓展中的數據丟失與否不影響實例的業務數據(業務持久化數據存放于數據盤),也不影響實例的正常使用。
開啟IO加速功能會占用一定內存(buffer_pool_size的4%)。因此,默認的buffer_pool_size會自動下調4%,后續如需修改buffer_pool_size,請根據內存使用率指標合理調整。
開啟或關閉IO加速功能后,實例約有30秒不可用,建議在業務低峰期執行功能的開啟和關閉操作。
開啟IO加速功能后,實例性能會有明顯提升,實例規格越大,提升效果越明顯。例如,8核16 GB標準版高可用系列通用型RDS MySQL實例性能可提升103%。
緩存池能夠有效減少磁盤IO操作,提升實例的IO性能。但緩存池的大小受系統內存大小的限制,當內存不足時,緩存池大小受限,從而影響IO性能。
使用IO加速功能
開啟IO加速
購買新實例時開啟IO加速
您可以在購買實例時,選擇滿足通用云盤IO加速功能的參數后,開啟IO加速功能:
滿足通用云盤IO加速功能的已有實例開啟IO加速
訪問實例列表,在上方選擇地域,然后單擊目標實例ID。
在基本信息區域,單擊存儲類型右側的通用云盤開關設置,在彈出的對話框中,開啟IO加速開關。
關閉IO加速
訪問實例列表,在上方選擇地域,然后單擊目標實例ID。
在基本信息區域,單擊存儲類型右側的通用云盤開關設置,在彈出的對話框中,關閉IO加速開關。
性能測試
測試準備
測試方法:向同一規格實例執行數據讀寫操作,對比開啟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
測試方法
本文以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%。