本文更新於2020-04-05,使用MySQL 5.7,操作系統為Deepin 15.4。 使用符號連接分佈IO 利用操作系統的符號連接,將不同的資料庫、表、索引指向不同的物理磁碟,從而達到分佈磁碟IO的目的。 禁止操作系統更新文件的atime屬性 對於讀寫頻繁的資料庫文件來說,記錄文件的訪問時間一 ...
本文更新於2020-04-05,使用MySQL 5.7,操作系統為Deepin 15.4。
目錄
使用符號連接分佈IO
利用操作系統的符號連接,將不同的資料庫、表、索引指向不同的物理磁碟,從而達到分佈磁碟IO的目的。
禁止操作系統更新文件的atime屬性
對於讀寫頻繁的資料庫文件來說,記錄文件的訪問時間一般沒有用處,卻會增加磁碟的負擔,影響IO性能。
用裸設備(Raw Device)存放InnoDB共用表空間
因InnoDB使用緩存機制來緩存索引和數據,操作系統的磁碟IO緩存對其性能不僅沒有幫助,甚至還有反作用。在InnoDB緩存充足的情況下,可以考慮使用裸設備來存放共用表空間。
調整IO調度演算法
Linux實現了4中IO調度演算法:
- NOOP演算法(No Operation):不對IO請求排序,除了合併請求也不會進行其他任何優化,用最簡單的先進先出FIFO隊列順序提交IO請求。NOOP演算法主要面向隨機訪問設備,如SSD。
- 最後期限演算法(Deadline):除了維護一個擁有合併和排序功能的請求隊列外,額外維護兩個帶有超時的FIFO隊列,分別是讀請求隊列和寫請求隊列。當調度器發現讀/寫請求隊列中的請求超時,會優先處理這些請求。
- 預期演算法(Anticipatory):是基於預測的IO演算法,和Deadline類似,也維護了三個請求隊列。區別在於,Anticipatory處理完一個IO請求後並不會直接返回處理下一個請求,而是等待片刻(預設6ms),等待期間如果有新來的相鄰扇區的請求,會直接處理新來的請求。Anticipatory適合寫入較多的環境,不適合資料庫等隨機讀較多的環境。
- 完全公平隊列(Complete Fair Queuing/CFQ):把IO請求按照進程分別放入進程對應的隊列中,其公平是針對進程而言的。CFQ以時間片演算法為前提,輪轉調動隊列。
建議MySQL資料庫環境設置為Deadline演算法。
使用磁碟陣列(RAID)
RAID(Redundant Array of Inexpensive Disks),即廉價磁碟冗餘陣列,通常叫做磁碟陣列。
RAID級別:
- RAID0:也叫條帶化。
- RAID1:也叫磁碟鏡像。
- RAID10:先做磁碟鏡像,再條帶化。
- RAID4:像RAID0一樣條帶化,但額外增加一個磁碟用於糾錯。
- RAID5:對RAID4的改進,但將糾錯數據也分別寫到各個磁碟而不是一個磁碟。
RAID卡電池充放電問題
RAID卡都有寫緩存(Battery Backed Write Cache),寫緩存對IO性能的提升非常明顯。為了避免掉電丟失寫緩存中的數據,RAID卡都有電池(Battery Backup Unit,簡稱BBU)。
RAID緩存策略包括4部分:
- 寫策略
- WriteBack:將數據寫入緩存後直接返回。
- WriteThrough:不使用寫緩存,直接寫入磁碟才返回。
- 預讀策略
- ReadAheadNone:不開啟預讀。
- ReadAhead:開啟預讀,預先把後面的數據載入入緩存。
- ReadAdaptive:自適應預讀,在緩存和I/O空閑的時候進行預讀。
- 讀策略
- Direct:讀操作不進行緩存。
- Cached:讀操作進行緩存。
- 故障策略
- Write Cache OK if Bad BBU:如果BBU出問題,不使用寫緩存,從WriteBack自動切換到WriteThrough。
- No Write Cache if Bad BBU:如果BBU出問題,仍然使用寫緩存。
RAID卡電池會定期啟動自動校準模式,即定期充放電。期間,RAID卡控制器不會啟動BBU。同時(除非修改緩存策略),也會禁用WriteBack寫緩存策略,以保證數據完整性,造成系統IO性能會出現較大波動。
解決方案:
- 根據RAID卡電池下次充放電的時間,在業務量較低的時候,提前進行充放電。
- 即使電池電量低於警戒值甚至電池放電完畢,強制使用WriteBack寫緩存策略。此時一定要有UPS之類的後備電源。
NUMA架構優化
目前的商用伺服器系統架構大體分為三類(一般SMP或NUMA較多):
- 對稱多處理器架構(SMP/Symmetric Multi-Processor):一臺電腦上彙集了一組CPU,各CPU平等地共用記憶體、IO等資源。SMP也被稱為一致存儲訪問架構(UMA/Uniform Memory Access)。由於共用,導致SMP伺服器的擴展能力非常有限,最受限制的是記憶體,因每個CPU必需通過相同的匯流排訪問相同的記憶體資源。
- 非一致存儲訪問架構(NUMA/Non-Uniform Memory Access):一臺電腦分為多個節點,每個節點內部擁有多個CPU,節點內部使用共有的記憶體控制器,節點之間通過互聯模塊進行連接和信息交互。節點的所有記憶體對於本節點的所有CPU都是等同的,對於其他節點的所有CPU都是不同的。每個CPU都可以訪問整個系統的記憶體,但訪問本地節點的較快,訪問非本地節點的較慢。因此,隨著CPU數量的增加,系統性能並不能線性增加。
- 海量並行處理架構(MPP/Massive Parallel Processing):由多個SMP伺服器通過一定的節點互聯網路進行連接,每個節點只訪問本地資源,不訪問其他節點的資源。因而,理論上可以無限擴展。
NUMA的記憶體分配策略有4種:
- 預設default:總是在當前進程運行的本地節點分配。其節點之間記憶體分配不均衡,當某個CPU節點記憶體不足時,會導致swap產生。
- 綁定bind:強制分配到指定節點上。
- 交叉interleave:在所有節點或指定節點上交叉分配記憶體。
- 優先preferred:在指定節點上分配,失敗則在其他節點上分配。
MySQL對NUMA特性支持不好。