如果您希望提升磁碟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%。