(4)Linux性能調優之磁盤I/O子系統

1、前言

前面咱們談了的內容以下:node

(1)Linux性能調優之Linux進程管理算法

(2)Linux性能調優之Linux內存體系數據庫

(3)Linux性能調優之Linux文件系統緩存

這一節咱們將談下Linux磁盤I/O子系統服務器

2、概覽

在進程解碼和執行指令以前,要把數據從盤片的扇區中恢復到進程的緩存和寄存器中。程序執行結果又被寫回到磁盤中。能夠說,如今的服務器大部分都是I/O出現了瓶頸。網絡

下圖展現了基本的I/O子系統架構:數據結構

咱們以把數據寫入磁盤爲例。當執行向磁盤寫入數據操做的時候,會發生以下的一系列基本操做。假設文件數據存在於磁盤扇區上,而且已經被讀入到頁緩存中。架構

  1. 進程使用write()系統調用寫入文件。
  2. 內核更新映射到文件的page cache。
  3. 內核線程pdflush負責把頁緩存刷入到磁盤中。
  4. 文件系統層把各個塊緩存放入一個bio結構,而且提交一個寫入到塊設備層的請求。
  5. 塊設備層從上層得到請求,執行I/O elevator操做,把請求放入到I/O請求隊列中。
  6. 磁盤驅動,例如SCSI或其它特定驅動將會負責寫操做。
  7. 磁盤驅動固件執行硬件操做,例如尋址、旋轉、數據傳送到磁盤的扇區。

以上就是程序把數據寫到硬盤的大概過程。ide

3、緩存

在過去的20年裏,處理器的性能提高要大於其它計算機組件(例如處理器緩存、總線、RAM 和磁盤等)。由於存儲器和磁盤的速度限制了整個系統性能,因此係統的總體性能並無因 爲處理器速度的提高而提高。可是,經過把經常使用數據放入到更快速度的內存中,以緩存機制 能夠解決這個問題。它減小了訪問比較慢的存儲器的次數。現代計算機系統在幾乎全部的I/O 組件中都使用了這項技術,例如硬盤驅動緩存(hard disk drive cache)、磁盤控制器緩存 (disk controller cache)和文件系統緩存(file system cache),各個應用都使用到了緩存。post

3.1 存儲器層次

上展現了緩存等級的概念,因爲CPU寄存器和磁盤之間的訪問速度差別很大,CPU會花很 多時間等待磁盤中的數據,這致使CPU的高性能無用武之地。存儲器層次結構經過L1 cache、L2 cache、RAM和其它在CPU和磁盤之間的緩存來消除這種影響。這減小了進程訪 問較慢存儲器和磁盤的機會。離處理器比較近的緩存擁有更高的CPU訪問速度和較小的空間。

3.2 局部性引用(Locality of reference)

如上文所說,高緩存命中率是提高性能的關鍵。爲了得到高緩存命中率,使用」局部性引用「的 技術。這個技術基於以下的原則:

  • 最近使用過的數據即將被使用的可能性很高(時間局部性,temporal locality)。
  • 使用過數據的附近數據被使用的可能性很高(空間局部性,spatial locality)。

Linux在不少組件中用到了這個原則,例如頁緩存、文件對象緩存(i-node緩存、目錄條 目緩存等等)、預讀緩衝區等。以下圖所示:

3.3 刷新髒緩衝區(Flushing a dirty buffer)

在進程從磁盤中讀數據時,數據被複制到內存中。該進程和其它進程均可以在內存緩存中讀 取一樣的數據副本。當進程嘗試改變數據,進程首先修改內存中的數據,這時候,磁盤和內 存中的數據就不一致了,內存中的數據就叫作髒緩衝(dirty buffer)。髒緩衝應該儘快同步到 磁盤上,不然,若是忽然崩潰,內存中的數據會丟失。

同步髒緩衝的進程叫作flush,在Linux內核2.6中,pdflush內核線程負責把數據寫入到磁盤 上。數據會定時刷新(kupdate),或者當內存中的髒緩衝到了閥值的比例的時候 (bdflush)。這個閥值在/proc/sys/vm/dirty_background_ratio文件中。

下圖展現刷新髒緩衝區的過程:

4、塊層

塊層處理全部和塊設備相關的操做。塊層中的關鍵數據結構是bio。bio結構是文件系統層和塊 層之間的一個接口。

在執行寫操做時,文件系統層嘗試寫入由塊緩衝組成的頁緩存。經過把相鄰的塊放在一塊兒, 組成bio結構,而後把bio發送給塊層。

塊層處理bio請求,而且把請求連接到I/O請求隊列中。這個連接操做叫作I/O elevator。在 Linux內核2.6中,有四種類型的I/O elevator算法。

4.1 塊大小

驅動器上能夠讀出和寫入的最小數據量會對服務器性能有直接影響。做爲參考,若是服務器 要處理不少小文件,設置較小的塊大小比較好。若是服務是須要處理大文件的,較大的塊大 小可能會提升性能。不能改變運行中的文件系統的塊大小,只有從新格式化才能修改當前的 塊大小。

這裏的塊大小就是文件系統在格式化時指定的存儲數據的block大小,如今的服務器由於硬盤容量巨大,因此通常設置block爲4K大小。

4.2 I/O elevator

Linux2.6 內核使用了一種新的I/O elevator模型。Linux2.4提供的是一種通用目標的I/O elevator,2.6則提供了四個可用的elevator。由於Linux操做系統有各類普遍的用途,在不一樣場 景下,I/O和負載都有很大的差別。一臺Linux筆記本要知足的的I/O需求可能比一個10000用戶 的數據庫系統還多樣。爲了知足多樣性,有四種可選的I/O elevator。

  • 預期(Anticipatory) 預期 I/O elevator是基於假設一個塊設備只有一個物理尋道指針(例如一塊SATA盤)。預期 elevator使用期限(deadline)機制,而且加上了啓發式的期限。正如名字所代表的,預期I/O elevator嘗試往磁盤中寫入一個大的流,而不是不少很是小的隨機磁盤訪問。啓發式預期可能 會致使潛在的寫I/O。它通常適用於的高吞吐的通用操做系統,例如pc。在內核2.6.18中, elevator是標準的I/O調度算法,可是,大多數企業Linux發行版仍是默認使用CFQ elevator。

  • 徹底公平排隊(CFQ,Complete Fair Queuing) 經過爲每一個進程維護I/O隊列,CFQ爲進程實現QoS(服務質量,Quality of Service)策略。 CFQ elevator適用於擁有不少進程競爭的極多用戶的系統。它努力的避免進程餓死,具備低 延時的特色。從內核2.6.18開始,增強版的CFQ elevator是默認的I/O調度器。 基於系統設置和負載模式,CFQ調度器可能拖慢一個主進程的運行,例如,一個使用公平算 法的大型數據庫系統。根據默認配置,會徹底基於競爭處理進程組。一個單一的數據庫,所 有的經過頁緩存(全部的pdflush實例都在一個pgroup)的寫都被CFQ認爲是可以和其它不少 後臺進程競爭的一個進程。在這個場景下,嘗試I/O調度器子配置或deadline調度器可能更加 有用。

  • 期限(Deadline) 期限elevator是使用dealine算法的循環elevator(輪詢,round robin),提供接近實時行爲的 I/O子系統。在維護不錯吞吐量磁盤的時候,期限elevator具備優良的請求延遲。期限算法確保 不會發生進程飢餓的情況。

  • NOOP NOOP表示沒有操做(No Operation),顧名思義。NOOP elevator很精簡,它是簡單的FIFO 隊列,不作任何數據排序。NOOP把相鄰的數據請求作簡單的合併,對磁盤I/O來講,它增長 了很是小的處理器開銷。NOOP elevator假設塊設備擁有本身的elevator算法,例如SCSI的 TCQ,或者沒有尋道延遲,例如flash卡。

5、I/O設備驅動

Linux內核使用設備驅動控制設備。設備驅動一般是一個獨立的內核模塊,爲各個設備或者一 組設備提供Linux操做系統支持。一旦設備驅動被載入,就做爲Linux內核的一部分運行,而且徹底控制設備。這裏咱們會討論SCSI設備驅動。

5.1 SISC

小型計算機系統接口(Small Computer System Interface,SCSI)是最經常使用的I/O設備和技 術,尤爲在服務器環境。在Linux內核中,SCSI設備也受設備驅動模塊控制。它由以下幾個類 型的模塊組成。

  • 上層驅動程序(upper level drivers):sd_mod,sr_mode(SCSI-CDROM), st(SCSI Tape),sq(SCSI generic device)等等。它們提供了各類類型SCSI設備的 驅動功能,例如SCSI CD-ROM。

  • 中間層驅動:scsi_mod 。實現SCSI協議和通用的SCSI功能。

  • 低級別驅動程序,提供到各設備的低級別接入。底層驅動程序,基本上是特定於硬件設 備,而且提供給每一個設備。例如,ips是IBM ServerRAID控制器,ql2300專門爲Qlogic HBA,mptscsih是LSI Logic SCSI的驅動器,等等。

  • 僞驅動程序:ide-scsi。用做IDE-SCSI仿真。

下圖展現了SCSI驅動的架構:

6、RAID和存儲系統

存儲系統的選擇和配置,以及RAID類型都是影響系統性能的重要因素。

磁盤陣列(Redundant Arrays of Independent Drives,RAID),有「獨立磁盤構成的具備冗餘能力的陣列」之意。通俗點說,磁盤陣列是由不少價格較便宜的磁盤,組合成一個容量巨大的磁盤組,利用個別磁盤提供數據所產生加成效果提高整個磁盤系統效能。利用這項技術,將數據切割成許多區段,分別存放在各個硬盤上。

有關RAID的詳盡知識參考百度百科:磁盤陣列

在選擇硬盤上,SSD > 高轉速機械硬盤 > 低轉速機械硬盤

7、下一節是???

談完Linux的磁盤I/O子系統,下一節將會談一下Linux的網絡子系統

相關文章
相關標籤/搜索