提起MySQL資料庫在硬體方面的優化無非是CPU、記憶體和IO。下麵我們著重梳理一下關於磁碟I/O方面的優化。 1.磁碟冗餘陣列RAID RAID(Redundant Array of Inexpensive Disk)的基本目的是把小型廉價的硬碟合併成一塊大容量的硬碟,用於解決數據冗餘性並降低成本, ...
提起MySQL資料庫在硬體方面的優化無非是CPU、記憶體和IO。下麵我們著重梳理一下關於磁碟I/O方面的優化。
1.磁碟冗餘陣列RAID
RAID(Redundant Array of Inexpensive Disk)的基本目的是把小型廉價的硬碟合併成一塊大容量的硬碟,用於解決數據冗餘性並降低成本,且提高數據處理性能。
1.1 RAID的優點
RAID的優點可以從高傳輸速率和容錯兩方面來闡述:
(1)提高傳輸速率。RAID通過在多個磁碟上同時存儲和讀取數據來大幅提高存儲系統的數據吞吐量(Throughput)。在RAID中,可以讓很多磁碟驅動器同時傳輸數據,而這些磁碟驅動器在邏輯上又是一個磁碟驅動器,所以使用RAID可以達到單個磁碟驅動器幾倍、幾十倍甚至上百倍的速率。這也是RAID最初想要解決的問題。因為當時CPU的速度增長很快,而磁碟驅動器的數據傳輸速率無法大幅提高,所以需要有一種方案解決二者之間的矛盾。
(2)通過數據校驗提供容錯功能。普通磁碟驅動器無法提供容錯功能,如果不包括寫在磁碟上的CRC(迴圈冗餘校驗)碼的話。RAID容錯是建立在每個磁碟驅動器的硬體容錯功能之上的,所以它提供更高的安全性。在很多RAID模式中都有較為完備的相互校驗/恢復的措施,甚至是直接相互的鏡像備份,從而大大提高了RAID系統的容錯度,提高了系統的穩定冗餘性。
1.2RAID常見類別
RAID0 數據在從記憶體緩衝區寫入磁碟時,根據磁碟數量將數據分成N份,這些數據同時併發寫入N塊磁碟,使得數據整體寫入速度是一塊磁碟的N倍。讀取時也是一樣的。因此RAID0具有極快的數據讀寫速度。但是RAID0不做數據冗餘,N塊磁碟中只要一塊損壞,數據完整性就被破壞,所有的數據都會損壞,即任何一塊硬碟的損壞都將導致數據的丟失。
RAID1 數據在寫入磁碟時,將一份數據同時寫入兩塊磁碟,這樣任何一塊磁碟損壞都不會導致數據丟失,插入一塊新磁碟就可以通過複製數據的方式自動修複,具有極高的可靠性。但對應的存儲能力有所降低,如兩塊相同硬碟組成的RAID1,則容量為其中一塊硬碟的大小,即磁碟利用率為50%。
RAID5 RAID5也是一種普遍使用的RAID類型,是一種存儲性能、數據安全和存儲成本兼顧的存儲解決方案。磁碟空間利用率要比RAID1高,存儲成本相對較低。RAID5 和RAID4、RAID3相比,校驗數據分佈在陣列中的所有磁碟上,而沒有採用專門的校驗磁碟。對於數據和校驗數據,它們的寫操作可以同時發生在完全不同的磁碟上。因此, RAID5 不存在 RAID4 中的併發寫操作時的校驗盤性能瓶頸問題。另外, RAID5 還具備很好的擴展性。當陣列磁碟 數量增加時,並行操作量的能力也隨之增長,可比 RAID4 支持更多的磁碟,從而擁有更高的容量以及更高的性能。RAID5 的磁碟上同時存儲數據和校驗數據,數據塊和對應的校驗信息存保存在不同的磁碟上,當一個數據盤損壞時,系統可以根據同一條帶的其他數據塊和對應的校驗數據來重建損壞的數據。與其他 RAID 等級一樣,重建數據時, RAID5 的性能會受到較大的影響。
說明:圖中零散分佈 AP BP CP DP 為校驗數據
RAID10 結合RAID0和RAID1兩種方案。Raid 10其實結構非常簡單,首先創建2個獨立的Raid1,然後將這兩個獨立的Raid1組成一個Raid0,當往這個邏輯Raid中寫數據時,數據被有序的寫入兩個Raid1中。磁碟1和磁碟2組成一個Raid1,磁碟3和磁碟4又組成另外一個Raid1;這兩個Raid1組成了一個新的Raid0。如寫在硬碟1上的數據0、2、4、6 寫在硬碟2中則為數據0、2、4、6,硬碟3中的數據為1、3、5、7,硬碟4中的數據則為1、3、5、7,因此數據在這四個硬碟上組合成Raid10,且具有raid0和raid1兩者的特性。雖然Raid10方案造成了50%的磁碟浪費,但是它提供了200%的速度和單磁碟損壞的數據安全性,並且當同時損壞的磁碟不在同一Raid1中,就能保證數據安全性。假如磁碟中的某一塊盤壞了,整個邏輯磁碟仍能正常工作的。 當我們需要恢復RAID 10中損壞的磁碟時,只需要更換新的硬碟,按照RAID10的工作原理來進行數據恢復,恢複數據過程中系統仍能正常工作。原先的數據會同步恢復到更換的硬碟中。
1.3 總結
為資料庫伺服器配置RAID的時候,建議採用RAID10配置,儘管RAID10會更浪費空間,但它提供了更好的性能。直觀地將,採用RAID5時,由於需要更新校驗數據信息,所以每寫一次數據,都需要讀取數據奇偶信息,經過計算後,再更新校驗數據,讓後再寫入實際數據,而RAID10則是直接寫入數據。
2. 儘可能地使用SSD硬碟
SSD(Solid State Disk 或 Solid State Drive 固態硬碟)是一種基於永久性存儲器的電腦外部存儲設備。
與傳統磁碟相比,其性能非常驚艷。
特點 | 數據對比 |
高IOPS | IOPS 即1秒內能夠完成的讀寫次數,是存儲性能的最直接的表現。傳統磁碟每秒差不多可以完成200次IO請求,而SSD每秒鐘可以高達60萬次。 |
低延遲 | 低延遲 即主機下達存儲指令後,存儲介質完成存儲並返回正確應答的時間。傳統磁碟由於驅動馬達轉動碟片和搖動磁頭手臂,完成單個IO需要2000微妙左右,而SSD只需要不到100微妙。 |
低功耗 | 如果使用傳統的磁碟來創建接近SSD性能的磁碟陣列總功耗高達幾百到上千瓦;而一塊PCIe SSD的功耗不會超過25瓦。 |
大容量 | 傳統磁碟容量在4TB以下,並且增長困難,而PCIe SSD已有單盤 12.8TB的容量,並且增長趨勢可期。 |
故障率低且可預測 | 傳統磁碟由於是機械部件,故障不可預測,年故障率在百分之三左右,而SSD的故障可以預測,年故障率在千分之五以內。 |
抗震能力強,且無噪音 | 傳統磁碟是機械旋轉設備,對震動敏感,甚至引發磁碟停轉,同時馬達也會發出噪音;而SSD完全是電子元件,抗震能力強,且不雜訊。 |
3 IO調度策略--SSD推薦設置為noop,SATA為deadline
3.1 IO調度器
每個塊設備或者塊設備的分區,都對應有自身的請求隊列(request_queue),而每個請求隊列都可以選擇一個I/O調度器來協調所遞交的request。I/O調度器的基本目的是將請求按照它們對應在塊設備上的扇區號進行排列,以減少磁頭的移動,提高效率。每個設備的請求隊列里的請求將按順序被響應。實際上,除了這個隊列,每個調度器自身都維護有不同數量的隊列,用來對遞交上來的request進行處理,而排在隊列最前面的request將適時被移動到請求隊列中等待響應。
IO調度器在內核棧中所處位置如下:
3.2 調度演算法
內核中實現的IO調度器主要有四種--Noop,Deadline,CFG, Anticipatory。
如果簡單概括總結的的話:1.NOOP 先進先出 2.Deadline 截止時間調度程式 3.CFQ 完全公平排隊I/O調度程式 4.AS(預料I/O調度程式) .
Noop調度演算法是內核中最簡單的IO調度演算法。Noop調度演算法也叫作電梯調度演算法,它將IO請求放入到一個FIFO隊列中,然後逐個執行這些IO請求,當然對於一些在磁碟上連續的IO請求,Noop演算法會適當做一些合併。這個調度演算法特別適合那些不希望調度器重新組織IO請求順序的應用。
Deadline演算法的核心在於保證每個IO請求在一定的時間內一定要被服務到,以此來避免某個請求饑餓。
CFQ(Completely Fair Queuing)演算法,顧名思義,絕對公平演算法。它試圖為競爭塊設備使用權的所有進程分配一個請求隊列和一個時間片,在調度器分配給進程的時間片內,進程可以將其讀寫請求發送給底層塊設備,當進程的時間片消耗完,進程的請求隊列將被掛起,等待調度。 每個進程的時間片和每個進程的隊列長度取決於進程的IO優先順序,每個進程都會有一個IO優先順序,CFQ調度器將會將其作為考慮的因素之一,來確定該進程的請求隊列何時可以獲取塊設備的使用權。
Anticipatory演算法的核心是局部性原理,它期望一個進程做完一次IO請求後還會繼續在此處做IO請求。在IO操作中,有一種現象叫“假空閑”(Deceptive idleness),它的意思是一個進程在剛剛做完一波讀操作後,看似是空閑了,不讀了,但是實際上它是在處理這些數據,處理完這些數據之後,它還會接著讀,這個時候如果IO調度器去處理另外一個進程的請求,那麼當原來的假空閑進程的下一個請求來的時候,磁頭又得seek到剛纔的位置,這樣大大增加了尋道時間和磁頭旋轉時間。所以,Anticipatory演算法會在一個讀請求做完後,再等待一定時間t(通常是6ms),如果6ms內,這個進程上還有讀請求過來,那麼我繼續服務,否則,處理下一個進程的讀寫請求。
對於一些非旋轉磁頭氏的存儲設備,使用Noop的效果更好。因為對於旋轉磁頭式的磁碟來說,IO調度器的請求重組要花費一定的CPU時間,但是對於SSD磁碟來說,這些重組IO請求的CPU時間可以節省下來,因為SSD提供了更智能的請求調度演算法,不需要內核去畫蛇添足。
3.3 性能對比
以下性能Report是在SSD存儲介質下,各調度策略的性能表現。
通過數據對比,我們也可以發現:SSD推薦設置為noop。
(網上還有一個別人相關的測試報告,大家可以參閱 https://www.percona.com/blog/2009/01/30/linux-schedulers-in-tpcc-like-benchmark/)
4.其它的註意事項
例如:進程打開文件數:65535 ;文件系統:選XFS(centos7已經預設是XFS了)等等。
參考文獻:
1. https://www.cnblogs.com/cobbliu/p/5389556.html
2.《MySQL 運維內參》
3. 網路分享
本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!