天天看點

為提高MySQL性能而在磁盤IO方面的設定

提起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塊磁盤中隻要一塊損壞,資料完整性就被破壞,所有的資料都會損壞,即任何一塊硬碟的損壞都将導緻資料的丢失。

為提高MySQL性能而在磁盤IO方面的設定

RAID1 資料在寫入磁盤時,将一份資料同時寫入兩塊磁盤,這樣任何一塊磁盤損壞都不會導緻資料丢失,插入一塊新磁盤就可以通過複制資料的方式自動修複,具有極高的可靠性。但對應的存儲能力有所降低,如兩塊相同硬碟組成的RAID1,則容量為其中一塊硬碟的大小,即磁盤使用率為50%。

為提高MySQL性能而在磁盤IO方面的設定

RAID5 RAID5也是一種普遍使用的RAID類型,是一種存儲性能、資料安全和存儲成本兼顧的存儲解決方案。磁盤空間使用率要比RAID1高,存儲成本相對較低。RAID5 和RAID4、RAID3相比,校驗資料分布在陣列中的所有磁盤上,而沒有采用專門的校驗磁盤。對于資料和校驗資料,它們的寫操作可以同時發生在完全不同的磁盤上。是以, RAID5 不存在 RAID4 中的并發寫操作時的校驗盤性能瓶頸問題。另外, RAID5 還具備很好的擴充性。當陣列磁盤 數量增加時,并行操作量的能力也随之增長,可比 RAID4 支援更多的磁盤,進而擁有更高的容量以及更高的性能。RAID5 的磁盤上同時存儲資料和校驗資料,資料塊和對應的校驗資訊存儲存在不同的磁盤上,當一個資料盤損壞時,系統可以根據同一條帶的其他資料塊和對應的校驗資料來重建損壞的資料。與其他 RAID 等級一樣,重建資料時, RAID5 的性能會受到較大的影響。

為提高MySQL性能而在磁盤IO方面的設定

說明:圖中零散分布 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的工作原理來進行資料恢複,恢複資料過程中系統仍能正常工作。原先的資料會同步恢複到更換的硬碟中。

為提高MySQL性能而在磁盤IO方面的設定

 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排程器在核心棧中所處位置如下:

為提高MySQL性能而在磁盤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存儲媒體下,各排程政策的性能表現。

為提高MySQL性能而在磁盤IO方面的設定

通過資料對比,我們也可以發現: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. 網絡分享

本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!