偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Linux性能優(yōu)化之IO子系統(tǒng)介紹

系統(tǒng) Linux 系統(tǒng)運(yùn)維
文件系統(tǒng)是內(nèi)核的功能,是一種工作在內(nèi)核空間的軟件,訪問(wèn)一個(gè)文件必須需要文件系統(tǒng)的存在才可以。Linux可以支持多達(dá)數(shù)十種不同的文件系統(tǒng),它們的實(shí)現(xiàn)各不相同,因此Linux內(nèi)核向用戶空間提供了虛擬文件系統(tǒng)這個(gè)統(tǒng)一的接口用來(lái)對(duì)文件系統(tǒng)進(jìn)行操作。本文介紹了對(duì)Linux IO子系統(tǒng)性能進(jìn)行優(yōu)化時(shí)需要考慮的因素,以及一些IO性能檢測(cè)工具。

[[155493]]

本文的大部分內(nèi)容來(lái)自 IBM Redbook - Linux Performance and Tuning Guidelines 。

FileSystem

  VFS(Virtual FileSystem) 虛擬文件系統(tǒng)

  文件系統(tǒng)是內(nèi)核的功能,是一種工作在內(nèi)核空間的軟件,訪問(wèn)一個(gè)文件必須需要文件系統(tǒng)的存在才可以。Linux 可以支持多達(dá)數(shù)十種不同的文件系統(tǒng),它們的實(shí)現(xiàn)各不相同,因此 Linux 內(nèi)核向用戶空間提供了虛擬文件系統(tǒng)這個(gè)統(tǒng)一的接口用來(lái)對(duì)文件系統(tǒng)進(jìn)行操作。

 

  虛擬文件系統(tǒng)是位于用戶空間進(jìn)程和內(nèi)核空間中多種不同的底層文件系統(tǒng)的實(shí)現(xiàn)之間的一個(gè)抽象的接口層,它提供了常見的文件系統(tǒng)對(duì)象模型(如 i-node,file object,page cache,directory entry,etc.)和訪問(wèn)這些對(duì)象的方法(如 open, close, delete, write, read, create, fstat, etc.),并將它們統(tǒng)一輸出,類似于庫(kù)的作用。從而向用戶進(jìn)程隱藏了各種不同的文件系統(tǒng)的具體實(shí)現(xiàn),這樣上層軟件只需要和 VFS 進(jìn)行交互而不必關(guān)系底層的文件系統(tǒng),簡(jiǎn)化了軟件的開發(fā),也使得 linux 可以支持多種不同的文件系統(tǒng)。

  Journaling

  非日志型文件系統(tǒng)

  在非日志型文件系統(tǒng)中,對(duì)文件系統(tǒng)實(shí)施一個(gè)寫操作,內(nèi)核會(huì)首先修改對(duì)應(yīng)的元數(shù)據(jù),然后修改數(shù)據(jù)塊。如果在寫入元數(shù)據(jù)時(shí),文件系統(tǒng)發(fā)生崩潰或某種故障,那么數(shù)據(jù)的一致性將會(huì)遭到破壞。fsck 命令可以在下次重啟時(shí)檢查所有的元數(shù)據(jù)并修復(fù)數(shù)據(jù)一致性,但是如果文件系統(tǒng)非常大,或者系統(tǒng)運(yùn)行關(guān)鍵業(yè)務(wù)不允許停機(jī),使用非日志型文件系統(tǒng)的風(fēng)險(xiǎn)會(huì)非常高。

  日志型文件系統(tǒng)

  日志型文件系統(tǒng)的區(qū)別在于,在進(jìn)行對(duì)文件系統(tǒng)寫數(shù)據(jù)之前,寫將數(shù)據(jù)寫到“日志區(qū)”,然后再寫入文件系統(tǒng),在寫入文件系統(tǒng)之后刪除日志。日志區(qū)可以在文件系統(tǒng)內(nèi)部也可以在文件系統(tǒng)外部。日志區(qū)的數(shù)據(jù)稱作文件系統(tǒng)日志,這些數(shù)據(jù)包含了修改了的元數(shù)據(jù),也可能包含將要修改的數(shù)據(jù)。寫日志也會(huì)帶來(lái)一定的額外開銷。

  EXT2

 

  ext2 文件系統(tǒng)組成不再贅述,需要注意的是 ext2 文件系統(tǒng)沒(méi)有日志功能。

  EXT3

  ext3 是帶有日志功能文件系統(tǒng),它基于ext2文件系統(tǒng)實(shí)現(xiàn)。

  以一致性的方式寫入數(shù)據(jù),即使斷電或文件系統(tǒng)崩潰,恢復(fù)的時(shí)間會(huì)大大減少。

  ◆數(shù)據(jù)完整性:在掛載時(shí)指定選項(xiàng) data=journal 則可以使日志記錄下元數(shù)據(jù)和文件數(shù)據(jù)。

  ◆速度:指定掛載選項(xiàng) data=writeback 使用回寫的方式寫數(shù)據(jù)。

  ◆靈活性:可以從 ext2 系統(tǒng)升級(jí),而不需要重新格式化文件系統(tǒng),也可以以非日志模式掛載,就如同 ext2 一樣。

  ext3的日志模式

  ◆journal,提供***數(shù)據(jù)完整性,日志會(huì)記錄元數(shù)據(jù)和文件數(shù)據(jù)。

  ◆ordered,日志只記錄元數(shù)據(jù)。但是會(huì)保證文件數(shù)據(jù)先被寫入,這是默認(rèn)選項(xiàng)。

  ◆writeback,使用回寫的方式寫數(shù)據(jù),只保證記錄元數(shù)據(jù)至日志。

  其他文件系統(tǒng)

  ◆ReiserFS,ReiserFS是一個(gè)快速的日志型文件系統(tǒng),有著良好的磁盤空間使用和快速的崩潰恢復(fù)。屬于 Novell 公司,在 SUSE Linux 中使用。

  ◆JFS (Journal File System), JFS 是一個(gè)完全 64 位文件系統(tǒng),可以支持非常大的文件和分區(qū),早先由 IBM 公司為 AIX 操作系統(tǒng)開發(fā),現(xiàn)已使用 GPL 協(xié)議開源。JFS適用于非常大的分區(qū)和文件如 HPC 或者數(shù)據(jù)庫(kù)業(yè)務(wù)。

  ◆XFS (eXtended File System), 一個(gè)高性能的日志型文件系統(tǒng),和 JFS 比較相似。

#p#

  I/O子系統(tǒng)架構(gòu)

 

  上圖概括了一次磁盤 write 操作的過(guò)程,假設(shè)文件已經(jīng)被從磁盤中讀入了 page cache 中。

  1.一個(gè)用戶進(jìn)程通過(guò) write() 系統(tǒng)調(diào)用發(fā)起寫請(qǐng)求。

  2.內(nèi)核更新對(duì)應(yīng)的 page cache。

  3.pdflush 內(nèi)核線程將 page cache 寫入至磁盤中。

  4.文件系統(tǒng)層將每一個(gè) block buffer 存放為一個(gè) bio 結(jié)構(gòu)體,并向塊設(shè)備層提交一個(gè)寫請(qǐng)求。

  5.塊設(shè)備層從上層接受到請(qǐng)求,執(zhí)行 IO 調(diào)度操作,并將請(qǐng)求放入IO 請(qǐng)求隊(duì)列中。

  6.設(shè)備驅(qū)動(dòng)(如 SCSI 或其他設(shè)備驅(qū)動(dòng))完成寫操作。

  7.磁盤設(shè)備固件執(zhí)行對(duì)應(yīng)的硬件操作,如磁盤的旋轉(zhuǎn),尋道等,數(shù)據(jù)被寫入到磁盤扇區(qū)中。

  Block Layer

  Block layer 處理所有和塊設(shè)備相關(guān)的操作。block layer 最關(guān)鍵是數(shù)據(jù)結(jié)構(gòu)是 bio 結(jié)構(gòu)體。bio 結(jié)構(gòu)體是 file system layer 到 block layer 的接口。 當(dāng)執(zhí)行一個(gè)寫操作時(shí),文件系統(tǒng)層將數(shù)據(jù)寫入 page cache(由 block buffer 組成),將連續(xù)的塊放到一起,組成 bio 結(jié)構(gòu)體,然后將 bio 送至 block layer。

  block layer 處理 bio 請(qǐng)求,并將這些請(qǐng)求鏈接成一個(gè)隊(duì)列,稱作 IO 請(qǐng)求隊(duì)列,這個(gè)連接的操作就稱作 IO 調(diào)度(也叫 IO elevator 即電梯算法)。

  IO scheduler

  IO 調(diào)度器的總體目標(biāo)是減少磁盤的尋道時(shí)間(因此調(diào)度器都是針對(duì)機(jī)械硬盤進(jìn)行優(yōu)化的),IO 調(diào)度器通過(guò)兩種方式來(lái)減少磁盤尋道:合并排序。

  合并即當(dāng)兩個(gè)或多個(gè) IO 請(qǐng)求的是相鄰的磁盤扇區(qū),那么就將這些請(qǐng)求合并為一個(gè)請(qǐng)求。通過(guò)合并請(qǐng)求,多個(gè) IO 請(qǐng)求只需要向磁盤發(fā)送一個(gè)請(qǐng)求指令,減少了磁盤的開銷。

  排序就是將不能合并的 IO 請(qǐng)求,根據(jù)請(qǐng)求磁盤扇區(qū)的順序,在請(qǐng)求隊(duì)列中進(jìn)行排序,使得磁頭可以按照磁盤的旋轉(zhuǎn)順序的完成 IO 操作,可以減小磁盤的尋道次數(shù)。

  調(diào)度器的算法和電梯運(yùn)行的策略相似,因此 IO 調(diào)度器也被稱作 IO 電梯( IO Elevator )。由于對(duì)請(qǐng)求進(jìn)行了重排,一部分的請(qǐng)求可能會(huì)被延遲,以提升整體的性能。

  Linux 2.4 只使用了一種通用的 IO 算法。到 Linux 2.6 實(shí)現(xiàn)了 4 種 IO 調(diào)度模型,其中 anticipatory在 2.6.33 中被移除。

  Linus Elevator

  早先的 IO 調(diào)度器就叫做 Linus Elevator,當(dāng)一個(gè)請(qǐng)求被加入到請(qǐng)求隊(duì)列中,它首先檢查隊(duì)列中是否存在相鄰的請(qǐng)求以合并兩個(gè)請(qǐng)求,這可能包含前合并和后合并。如果不能合并,則尋找是否能夠?qū)⑿抡?qǐng)求按扇區(qū)順序插入到請(qǐng)求隊(duì)列,如果沒(méi)有找到適合插入的位置,那么就將這個(gè)請(qǐng)求插入到隊(duì)列的末尾。另外,如果請(qǐng)求隊(duì)列中的某個(gè)請(qǐng)求超過(guò)的預(yù)先定義的過(guò)期閾值,新請(qǐng)求即使可以進(jìn)行排序,也被插入到隊(duì)列的末尾。這樣可以防止磁盤上某個(gè)區(qū)域產(chǎn)生大量請(qǐng)求,而其他區(qū)域的請(qǐng)求被餓死。然而,這種過(guò)期策略并不十分高效。

  這種算法可能導(dǎo)致請(qǐng)求餓死的情況,它是 Linux 2.4 的唯一調(diào)度器。

  當(dāng)一個(gè)請(qǐng)求加入到請(qǐng)求隊(duì)列時(shí),IO 調(diào)度器所完成的操作如下:

  1.如果隊(duì)列中存在對(duì)相鄰扇區(qū)的請(qǐng)求,則合并兩個(gè)請(qǐng)求為一個(gè)。

  2.如果隊(duì)列中存在超過(guò)過(guò)期時(shí)間的請(qǐng)求,那么新請(qǐng)求被插入到隊(duì)列的末尾,以防止餓死老的請(qǐng)求。

  3.如果隊(duì)列中存在可以按扇區(qū)地址排序的合適位置,那么將請(qǐng)求插入到這個(gè)位置。

  4.如果隊(duì)列中沒(méi)有合適的可插入位置,請(qǐng)求被插入到隊(duì)列末尾。

  Deadline - latency-oriented

  Deadline 調(diào)度器是設(shè)計(jì)用來(lái)解決 Linus Elevator 導(dǎo)致的 I/O 餓死的問(wèn)題。對(duì)磁盤上某個(gè)區(qū)域的大量請(qǐng)求,會(huì)***期的餓死 (starvation) 對(duì)磁盤其他區(qū)域上的請(qǐng)求。

  請(qǐng)求餓死的一個(gè)特例是寫請(qǐng)求餓死讀請(qǐng)求 (writes starving reads),對(duì)于進(jìn)程來(lái)說(shuō),當(dāng)需要進(jìn)行寫操作時(shí),由于需要寫的數(shù)據(jù)在內(nèi)存的 page cache 中,進(jìn)程是需要修改對(duì)應(yīng)的內(nèi)存,向內(nèi)核發(fā)送寫請(qǐng)求即可,之后進(jìn)程可以去進(jìn)行其他操作,由內(nèi)核負(fù)責(zé)將數(shù)據(jù)同步至磁盤中即可。對(duì)于進(jìn)程來(lái)說(shuō),寫請(qǐng)求是異步操作。而讀操作是完全不同的,當(dāng)進(jìn)程需要讀取數(shù)據(jù)時(shí),需要向內(nèi)核發(fā)送讀請(qǐng)求,內(nèi)核將數(shù)據(jù)載入到內(nèi)存中,由于進(jìn)程往往需要處理讀取的數(shù)據(jù),因此進(jìn)程將處于阻塞狀態(tài),直到請(qǐng)求被處理完成。對(duì)于進(jìn)程來(lái)說(shuō),讀請(qǐng)求是同步的操作。寫請(qǐng)求延遲對(duì)系統(tǒng)的性能影響不大,而讀請(qǐng)求延遲對(duì)系統(tǒng)性能影響是非常大的,因此兩種 IO 請(qǐng)求需要區(qū)別對(duì)待。

  Dealine 調(diào)度器專門針對(duì)讀請(qǐng)求延遲進(jìn)行了優(yōu)化,在 deadline 算法中,每一個(gè)請(qǐng)求都有一個(gè)過(guò)期時(shí)間。默認(rèn)情況下,讀請(qǐng)求的過(guò)期時(shí)間是 500ms,寫請(qǐng)求的過(guò)期時(shí)間是 5s。Dealine 調(diào)度器也會(huì)對(duì)請(qǐng)求隊(duì)列進(jìn)行合并和排序操作,這個(gè)隊(duì)列稱作排序隊(duì)列(sorted queue)。當(dāng)新請(qǐng)求被提交,Deadline將其加入到排序隊(duì)列中進(jìn)行合并和排序。同時(shí) Deadline 將這個(gè)請(qǐng)求加入到第二種類型的隊(duì)列中,讀請(qǐng)求被加入至讀FIFO隊(duì)列 (Read FIFO queue),寫請(qǐng)求被加入到寫FIFO隊(duì)列 (Write FIFO queue),這兩個(gè)隊(duì)列中,請(qǐng)求完全按照 FIFO 順序排列,即新請(qǐng)求永遠(yuǎn)被放入到隊(duì)列的末尾。

  這樣一來(lái) Dealine 就維護(hù)三個(gè)隊(duì)列,正常情況下,Deadline 將排序隊(duì)列中的請(qǐng)求放入到調(diào)度隊(duì)列 (dispatch queue,即將寫入磁盤的隊(duì)列)中,調(diào)度隊(duì)列把請(qǐng)求發(fā)送至磁盤驅(qū)動(dòng)。如果寫 FIFO 隊(duì)列或讀 FIFO 隊(duì)列中的請(qǐng)求發(fā)生了超時(shí),Deadline 調(diào)度器就不再使用排序隊(duì)列,而是開始將發(fā)生超時(shí)的 FIFO 隊(duì)列的請(qǐng)求放入調(diào)度隊(duì)列,直至隊(duì)列中沒(méi)有超時(shí)的請(qǐng)求,Deadline 通過(guò)這樣的方式保證所有的請(qǐng)求都不會(huì)長(zhǎng)時(shí)間超時(shí)。

 

  Deadling 防止了請(qǐng)求餓死的出現(xiàn),由于讀請(qǐng)求的超時(shí)時(shí)間遠(yuǎn)小于寫請(qǐng)求,它同時(shí)也避免了出現(xiàn)寫請(qǐng)求餓死讀請(qǐng)求。

  Deadline 比較適合于MySQL數(shù)據(jù)庫(kù)。

  Anticipatory(AS)

  AS 調(diào)度器是基于 Deadline 調(diào)度器,加上了一個(gè)啟發(fā)式的“預(yù)測(cè)”,假設(shè)系統(tǒng)中有大量的寫請(qǐng)求,這時(shí)如果夾雜幾個(gè)讀請(qǐng)求,由于讀請(qǐng)求的過(guò)期時(shí)間短,讀請(qǐng)求立即在多個(gè)寫請(qǐng)求的中間產(chǎn)生,這樣會(huì)導(dǎo)致磁盤的來(lái)回尋道,AS 試圖減少大量寫請(qǐng)求夾雜少量讀請(qǐng)求產(chǎn)生的尋道風(fēng)暴(seek storm)。當(dāng)一個(gè)讀請(qǐng)求完成后,AS不會(huì)立即返回處理隊(duì)列中的剩余請(qǐng)求,而是等待一個(gè)預(yù)測(cè)時(shí)間(默認(rèn)為 6ms),如果等待的時(shí)間內(nèi)發(fā)生了相鄰位置的讀請(qǐng)求,那么立即處理這個(gè)相鄰位置的讀請(qǐng)求,再返回處理隊(duì)列中的請(qǐng)求,這樣可以優(yōu)化多余的尋道時(shí)間。

  它可以為連續(xù) IO 請(qǐng)求(如順序讀)進(jìn)行了一定的優(yōu)化,但是對(duì)于隨機(jī)讀的場(chǎng)景 AS 會(huì)產(chǎn)生較大的延遲,對(duì)于數(shù)據(jù)庫(kù)應(yīng)用很糟糕,而對(duì)于 Web Server 可能會(huì)表現(xiàn)的不錯(cuò)。這個(gè)算法也可以簡(jiǎn)單理解為面向低速磁盤的,對(duì)于使用了 TCG(Tagged Command Queueing)高性能的磁盤和 RAID,使用 AS 會(huì)降低性能。

  在 Linux 2.6 - 2.6.18 AS 是內(nèi)核默認(rèn)調(diào)度器,然而大多數(shù)的企業(yè)發(fā)行版選擇的是 CFQ 調(diào)度器。

  到Linux 2.6.33 版本,AS 被從內(nèi)核中移除,因?yàn)榭梢酝ㄟ^(guò)調(diào)整其他調(diào)度器(如 CFQ)來(lái)實(shí)現(xiàn)與其相似的功能。

#p#

  Complete Fair Queuing(CFQ)- fairness-oriented

  CFQ 為每個(gè)進(jìn)程分配一個(gè) I/O 請(qǐng)求隊(duì)列,在每個(gè)隊(duì)列的內(nèi)部,進(jìn)行合并和排序的優(yōu)化。CFQ 以輪詢的方式處理這些隊(duì)列,每次從一個(gè)隊(duì)列中處理特定數(shù)量的請(qǐng)求(默認(rèn)為 4 個(gè))。它試圖將 I/O 帶寬均勻的分配至每個(gè)進(jìn)程。CFQ 原本針對(duì)的是多媒體或桌面應(yīng)用場(chǎng)景,然而,CFQ 其實(shí)在許多場(chǎng)景中內(nèi)表現(xiàn)的很好。CFQ 對(duì)每一個(gè) IO 請(qǐng)求都是公平的。這使得 CFQ 很適合離散讀的應(yīng)用 (eg: OLTP DB)

  多數(shù)企業(yè)發(fā)型版選擇 CFQ 作為默認(rèn)的 I/O 調(diào)度器。

  NOOP(No Operation)

  該算法實(shí)現(xiàn)了最簡(jiǎn)單的 FIFO 隊(duì)列,所有 IO 請(qǐng)求按照大致的先后順序進(jìn)行操作。之所以說(shuō)“大致”,原因是 NOOP 在 FIFO 的基礎(chǔ)上還做了相鄰 IO 請(qǐng)求的合并,但其不會(huì)進(jìn)行排序操作。

  NOOP 適用于底層硬件自身就具有很強(qiáng)調(diào)度控制器的塊設(shè)備(如某些SAN設(shè)備),或者完全隨機(jī)訪問(wèn)的塊設(shè)備(如SSD)。

  各個(gè)調(diào)度器在數(shù)據(jù)庫(kù)應(yīng)用下的性能,可以看出CFQ的性能是比較均衡的。

 

       IO 參數(shù)調(diào)整

  隊(duì)列長(zhǎng)度

  查看隊(duì)列長(zhǎng)度:

  1. /sys/block/<dev>/queue/nr_requests 

  下圖展示了各種隊(duì)列長(zhǎng)度時(shí),Deadline 和 CFQ 調(diào)度器的性能。

 

  由 ext3 的表現(xiàn)可以看出,對(duì)于大量的小文件寫操作,隊(duì)列長(zhǎng)度更長(zhǎng),性能會(huì)有所提升,在 16KB 左右,性能提升最為明顯,在 64KB 時(shí),64 至 8192 的隊(duì)列長(zhǎng)度有著差不多的性能。隨著文件大小的增大,小隊(duì)列長(zhǎng)度反而有著更好的性能。 RHEL 操作系統(tǒng)中,每個(gè)設(shè)備有一個(gè)隊(duì)列長(zhǎng)度。對(duì)于類似數(shù)據(jù)庫(kù)日志的存放分區(qū),大部分寫操作屬于小文件 IO,可以將隊(duì)列長(zhǎng)度調(diào)小。

  對(duì)于大量的連續(xù)讀取,可以考慮增加讀取首部的窗口大小。

  1. /sys/block/<dev>/queue/read_ahead_kb 

  IO調(diào)度器

  選擇設(shè)備的IO調(diào)度器。

  或者在 grub.conf 中加入內(nèi)核參數(shù) elevator=SCHEDULER。

  Deadline參數(shù)

  1. /sys/block/<device>/queue/iosched/writes_starved  

  進(jìn)行一個(gè)寫操作之前,允許進(jìn)行多少次讀操作。

  1. /sys/block/<device>/queue/iosched/read_expire  

  讀請(qǐng)求的過(guò)期時(shí)間

  1. /sys/block/<device>/queue/iosched/read_expire  

  寫請(qǐng)求的過(guò)期時(shí)間,默認(rèn)為 500ms。

  1. /sys/block/sda/queue/iosched/front_merges 

  是否進(jìn)行前合并。

  Anticipatory參數(shù)

  1. /sys/block/<device>/queue/iosched/antic_expire 

  預(yù)測(cè)等待時(shí)長(zhǎng),默認(rèn)為 6ms

  1. /sys/block/<device>/queue/iosched/{write_expire,read_expire}  

  讀寫請(qǐng)求的超時(shí)時(shí)長(zhǎng)

  1. /sys/block/<device>/queue/iosched/{write_batch_expire,read_batch_expire}  

  讀寫的批量處理時(shí)長(zhǎng)

#p#

  CFQ參數(shù)

  1. /sys/block/<device>/queue/iosched/slice_idle 

  當(dāng)一個(gè)進(jìn)程的隊(duì)列被分配到時(shí)間片卻沒(méi)有 IO 請(qǐng)求時(shí),調(diào)度器在輪詢至下一個(gè)隊(duì)列之前的等待時(shí)間,以提升 IO 的局部性,對(duì)于 SSD 設(shè)備,可以將這個(gè)值設(shè)為 0。

  1. /sys/block/<device>/queue/iosched/quantum 

  一個(gè)進(jìn)程的隊(duì)列每次被處理 IO 請(qǐng)求的***數(shù)量,默認(rèn)為 4,RHEL6 為 8,增大這個(gè)值可以提升并行處理 IO 的性能,但可能會(huì)造成某些 IO 延遲問(wèn)題。

  1. /sys/block/<device>/queue/iosched/slice_async_rq  

  一次處理寫請(qǐng)求的***數(shù):

  1. /sys/block/<device>/queue/iosched/low_latency  

  如果IO延遲的問(wèn)題很嚴(yán)重,將這個(gè)值設(shè)為 1。

調(diào)整CFQ調(diào)度器的進(jìn)程IO優(yōu)先級(jí)

  1. $ ionice [[-c class] [-n classdata] [-t]] -p PID [PID]...  
  2. $ ionice [-c class] [-n classdata] [-t] COMMAND [ARG]... 

  CFQ 的進(jìn)程 IO 優(yōu)先級(jí)和進(jìn)程 CPU 優(yōu)先級(jí)是獨(dú)立的。使用 ionice 調(diào)整進(jìn)程優(yōu)先級(jí),有三種調(diào)度類型可以選擇。

  ◆idle

  只有在沒(méi)有更高優(yōu)先級(jí)的進(jìn)程產(chǎn)生 IO 時(shí),idle 才可以使用磁盤 IO,適用于哪些不重要的程序(如 updatedb),讓它們?cè)诖疟P空閑時(shí)再產(chǎn)生 IO。

  ◆Best-effort

  這個(gè)類型共有 8 個(gè)優(yōu)先級(jí),分別為 0-7,數(shù)字越低,優(yōu)先級(jí)越高,相同級(jí)別的優(yōu)先級(jí)使用輪詢的方式處理。適用于普通的進(jìn)程。

  在2.6.26之前,沒(méi)有指定調(diào)度類型的進(jìn)程使用"none" 調(diào)度類型,IO調(diào)度器將其視作Best-effort進(jìn)行處理,這個(gè)類別中進(jìn)程優(yōu)先級(jí)由CPU優(yōu)先級(jí)計(jì)算得來(lái):io_priority = (cpu_nice + 20) / 5

  2.6.26之后,沒(méi)有指定調(diào)度類型的進(jìn)程將從CPU調(diào)度類型繼承而來(lái),這個(gè)類別的優(yōu)先級(jí)仍按照CPU優(yōu)先級(jí)計(jì)算而來(lái): io_priority = (cpu_nice + 20) / 5

  ◆Real time

  這個(gè)調(diào)度級(jí)別的進(jìn)程產(chǎn)生的IO被優(yōu)先處理,這個(gè)調(diào)度類型應(yīng)小心使用,防止餓死其他進(jìn)程IO, 它也有8個(gè)優(yōu)先級(jí),數(shù)字越大分的的IO時(shí)間片越長(zhǎng)。

  文件系統(tǒng)

  一般來(lái)說(shuō) ReiserFS 更適合于小文件 IO,而 XFS 和 JFS 適合大文件 IO,ext4 則處于兩種之間。

  JFS 和 XFS 適用于大型的數(shù)據(jù)倉(cāng)庫(kù),科學(xué)計(jì)算,大型 SMP 服務(wù)器,多媒體流服務(wù)等。ReiserFS 和 Ext4 適合于文件服務(wù)器,Web 服務(wù)器或郵件服務(wù)器。

  noatime

  atime 用于記錄文件***一次被讀取的時(shí)間。默認(rèn)情況下,文件每次被讀取或修改(也需要先讀取),系統(tǒng)將更新 atime 并寫入至文件元數(shù)據(jù)中。由于寫操作是很昂貴的,減少不必要的寫操作可以提升磁盤性能。然后,大多數(shù)時(shí)候,關(guān)閉文件的 atime 也只能獲得非常小的性能提升(這個(gè)說(shuō)法來(lái)自于IBM Redbook,表示懷疑)。 

  使用 noatime 掛載文件系統(tǒng),將不對(duì)文件的 atime 進(jìn)行更新,此時(shí) atime就相當(dāng)于 mtime。磁盤性能可以得到0-10%的提升。

  使用 noatime掛載方法:

  1. /dev/sdb1 /mountlocation ext3 defaults,noatime 1 2 

  nobarrier

  barrier 是保證日志文件系統(tǒng)的 WAL (write ahead logging) 一種手段,數(shù)據(jù)寫入磁盤時(shí),理應(yīng)先寫入 journal 區(qū),再寫入數(shù)據(jù)在磁盤的實(shí)際對(duì)應(yīng)位置,磁盤廠商為了加快磁盤寫入速度,磁盤都內(nèi)置 cache,數(shù)據(jù)一般都先寫入磁盤的 cache。

  cache 能加快寫入速度,但磁盤一般會(huì)對(duì) cache 內(nèi)緩存數(shù)據(jù)排序使之***刷新到磁盤,這樣就可能導(dǎo)致要刷新的實(shí)際數(shù)據(jù)和 journal 順序錯(cuò)亂。一旦系統(tǒng)崩潰,下次開機(jī)時(shí)磁盤要參考 journal 區(qū)來(lái)恢復(fù),但此時(shí) journal 記錄順序與數(shù)據(jù)實(shí)際刷新順序不同就會(huì)導(dǎo)致數(shù)據(jù)反而“恢復(fù)”到不一致了。而barrier 如其名——“柵欄”,先加一個(gè)“柵欄”,保證 journal 總是先寫入記錄,然后對(duì)應(yīng)數(shù)據(jù)才刷新到磁盤,這種方式保證了系統(tǒng)崩潰后磁盤恢復(fù)的正確性,但對(duì)寫入性能有影響。

  數(shù)據(jù)庫(kù)服務(wù)器底層存儲(chǔ)設(shè)備要么采用 RAID 卡,RAID 卡本身的電池可以掉電保護(hù);要么采用 Flash 卡,它也有自我保護(hù)機(jī)制,保證數(shù)據(jù)不會(huì)丟失。所以我們可以安全的使用 nobarrier 掛載文件系統(tǒng)。設(shè)置方法如下: 對(duì)于 ext3,ext4 和 reiserfs 文件系統(tǒng)可以在 mount 時(shí)指定 barrier=0;對(duì)于 xfs 可以指定 nobarrier 選項(xiàng)。

  read-ahead 預(yù)讀

  Linux 把讀模式分為隨機(jī)讀和順序讀兩大類,并只對(duì)順序讀進(jìn)行預(yù)讀。這一原則相對(duì)保守,但是可以保證很高的預(yù)讀***率。

  為了保證預(yù)讀***率,Linux只對(duì)順序讀 (sequential read) 進(jìn)行預(yù)讀。內(nèi)核通過(guò)驗(yàn)證如下兩個(gè)條件來(lái)判定一個(gè) read() 是否順序讀:

  1.這是文件被打開后的***次讀,并且讀的是文件首部;當(dāng)前的讀請(qǐng)求與前一(記錄的)讀請(qǐng)求在文件內(nèi)的位置是連續(xù)的。

  2.如果不滿足上述順序性條件,就判定為隨機(jī)讀。任何一個(gè)隨機(jī)讀都將終止當(dāng)前的順序序列,從而終止預(yù)讀行為(而不是縮減預(yù)讀大小)。

  預(yù)讀窗口

  Linux采用了一個(gè)快速的窗口擴(kuò)張過(guò)程

  ◆***預(yù)讀: readahead_size = read_size * 2 // or *4

  預(yù)讀窗口的初始值是讀大小的二到四倍。這意味著在您的程序中使用較大的讀粒度(比如32KB)可以稍稍提升I/O效率。

  ◆后續(xù)預(yù)讀:readahead_size *= 2

  后續(xù)的預(yù)讀窗口將逐次倍增,直到達(dá)到系統(tǒng)設(shè)定的***預(yù)讀大小,其缺省值是 256KB。 

  查看和修改預(yù)讀窗口:

  1. $ blockdev -getra device  
  2. $ blockdev -setra N device 

  日志模式

  大多數(shù)文件系統(tǒng)可以設(shè)置三種日志模式,對(duì)于 ext4 文件系統(tǒng),日志模式對(duì)磁盤的性能有較大的影響。

  ◆data=journal

  數(shù)據(jù)和元數(shù)據(jù)都寫入日志,提供了***的數(shù)據(jù)一致性。

  ◆data=ordered (默認(rèn))

  只記錄元數(shù)據(jù),然后它會(huì)保證先將數(shù)據(jù)寫入磁盤。

  ◆data=writeback

  采用回寫的方式,犧牲數(shù)據(jù)一致性,獲得更好的性能。仍然會(huì)將元數(shù)據(jù)記錄到日志中,此模式對(duì)小文件 IO 性能提升最為明顯,但可能造成數(shù)據(jù)丟失。

  將日志放在單獨(dú)的設(shè)備中

  1.卸載文件系統(tǒng)

  2.查看文件系統(tǒng)塊大小和日志參數(shù)$ dumpe2fs /dev/sdb1

  3.移除文件系統(tǒng)內(nèi)部的日志區(qū)$ tune2fs -O ^has_journal /dev/sdb1

  4.創(chuàng)建外部的日志設(shè)備$ mke2fs –O journal_dev -b block-size /dev/sdc1

  5.更新原文件系統(tǒng)的超級(jí)塊$ tune2fs -j -J device=/dev/sdc1 /dev/sdb1

  commit

  設(shè)置多少秒從日志中進(jìn)行一個(gè)同步,默認(rèn)是5。

  優(yōu)化Ext4

  1.格式大文件系統(tǒng)化時(shí)延遲 inode 的寫入。

  對(duì)于超大文件系統(tǒng),mkfs.ext4 進(jìn)程要花很長(zhǎng)時(shí)間初始化文件系統(tǒng)中到所有內(nèi)節(jié)點(diǎn)表。

  可使用 -E lazy_itable_init=1 選項(xiàng)延遲這個(gè)進(jìn)程。如果使用這個(gè)選項(xiàng),內(nèi)核進(jìn)程將在掛載文件系統(tǒng)后繼續(xù)初始化該文件它。  

  1. $ mkfs.ext4 -E lazy_itable_init=1 /dev/sda5 

  2.關(guān)閉Ext4的自動(dòng) fsync() 調(diào)用 -o noauto_da_alloc 或 mount -o noauto_da_alloc。

  3.降低日志IO的優(yōu)先級(jí)至與數(shù)據(jù)IO相同 -o journal_ioprio=n n的用效取值范圍為0-7,默認(rèn)為3。

#p#

  查看文件系統(tǒng)鎖

  1. $ cat /proc/locks 

  Benchmark 基準(zhǔn)測(cè)試

  iozone

  使用iozone對(duì)文件系統(tǒng)進(jìn)行基準(zhǔn)測(cè)試。

  1.$ iozone -a iozone將在所有模式下進(jìn)行測(cè)試,使用記錄塊從4k到16M,測(cè)試文件大小從64k到512M。

  2.$ iozone -Ra 或 iozone -Rab output.xls iozone將測(cè)試結(jié)果放在Excel中。 

  3.$ iozone -Ra -g 2g 如果內(nèi)存大于512MB,則測(cè)試文件需要更大;***測(cè)試文件是內(nèi)存的兩倍。例如內(nèi)存為1G,將測(cè)試文件設(shè)置***為2G

  1. $ iozone -Ra -g 2g -i 0 -i 1 

  如果只關(guān)心文件磁盤的read/write性能,而不必花費(fèi)時(shí)間在其他模式上測(cè)試,則我們需要指定測(cè)試模式。

  1. $ iozone -Rac 

  如果測(cè)試NFS,將使用-c,這通知iozone在測(cè)試過(guò)程中執(zhí)行close()函數(shù)。使用close()將減少NFS客戶端緩存的影響。但是如果測(cè)試文件比內(nèi)存大,就沒(méi)有必要使用參數(shù)-c。  

-a 在所有模式下進(jìn)行測(cè)試,使用記錄塊從4k到16M,測(cè)試文件大小從64k到512M
-b 生成excel文件
-R 生成excel輸入
-f 指定臨時(shí)文件名
-g 自動(dòng)模式的***文件大小
-n 自動(dòng)模式的最小文件大小
-s 指定文件大小,默認(rèn)單位是KB, 也可以使用m 和 g
-y 自動(dòng)模式的最小記錄大小,默認(rèn)單位是KB
-q 自動(dòng)模式的***記錄大小,默認(rèn)單位是KB
-r 指定記錄大小,單位是KB
-i 選擇測(cè)試模式

0=write/rewrite
1=read/re-read
2=random-read/write
3=Read-backwards
4=Re-write-record
5=stride-read
6=fwrite/re-fwrite
7=fread/Re-fread,
8=random mix
9=pwrite/Re-pwrite
10=pread/Re-pread
11=pwritev/Re-pwritev
12=preadv/Repreadv

  一個(gè)例子

  1. $ iozone -a -s 128M -y 512 -q 16384 -i 0 -i 1 -i 2 -f /test/a.out -Rb /root/ext3_writeback.out 

  dd

  1. $ dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync  

  使用這個(gè)參數(shù),dd命令執(zhí)行到***會(huì)真正執(zhí)行一次同步(sync)操作?! ?/p>

  1. $ dd bs=1M count=128 if=/dev/zero of=test oflag=direct 使用直接IO(繞過(guò)緩存) 

  bonnie++

usage: bonnie++ [-d scratch-dir] [-s size(Mb)[:chunk-size(b)]]
[-n number-to-stat[:max-size[:min-size][:num-directories]]]
[-m machine-name]
[-r ram-size-in-Mb]
[-x number-of-tests] [-u uid-to-use:gid-to-use] [-g gid-to-use]
[-q] [-f] [-b] [-p processes | -y]

-d 生成測(cè)試文件的路徑
-s 生成測(cè)試文件的大小,以M為單位(如果不使用-r參數(shù),則要求文件大小至少是系統(tǒng)物理內(nèi)存的2倍)
-m 機(jī)器名,實(shí)際上我們可以認(rèn)為是本次測(cè)試的方案名,可以隨便定義。默認(rèn)是本機(jī)的hostname。
-r 內(nèi)存大小,指定內(nèi)存大小,這樣可以通過(guò)-s參數(shù)創(chuàng)建r*2大小的文件,通常用于縮短測(cè)試時(shí)間,但是需要注意這樣由于內(nèi)存的cache可能導(dǎo)致測(cè)試結(jié)果的不準(zhǔn)確
-x 測(cè)試的次數(shù)
-u 測(cè)試文件的屬主和組,默認(rèn)是執(zhí)行bonnie++的當(dāng)前用戶和當(dāng)前組
-g 測(cè)試文件的組,默認(rèn)是執(zhí)行bonnie++的當(dāng)前用組
-b 在每次寫文件時(shí)調(diào)用fsync()函數(shù),對(duì)于測(cè)試郵件服務(wù)器或者數(shù)據(jù)庫(kù)服務(wù)器這種通常需要同步操作的情況比較適合,而不使用該參數(shù)則比較適合測(cè)試copy文件或者編譯等操作的效率。

  可以簡(jiǎn)單地運(yùn)行如下命令進(jìn)行磁盤性能測(cè)試:

  1. $ bonnie++ -d /global/oradata –m sun3510  

  這樣將會(huì)在指定的目錄下(通常我們會(huì)指定一個(gè)盤陣上卷的掛載點(diǎn)),生成相當(dāng)于主機(jī)物理內(nèi)存兩倍的文件,如果總量大于1G,則生成多個(gè)大小為1G的文件。假設(shè)主機(jī)內(nèi)存為4G,那么在測(cè)試中就會(huì)生成8個(gè)1G的文件,到測(cè)試結(jié)束,這些文件會(huì)被自動(dòng)刪除。 

  如果我們的主機(jī)內(nèi)存是4G,但是我們想縮短測(cè)試的時(shí)間,比如說(shuō)只寫2G的文件,就應(yīng)該執(zhí)行下面的命令:

  1. $ bonnie++ -d /global/oradata –m sun3510 –s 2048 –r 1024 

  blktrace & blkparse

  blktrace 是一個(gè)針對(duì) Linux 內(nèi)核中塊設(shè)備 IO 層的跟蹤工具,用來(lái)收集磁盤IO 信息中當(dāng) IO 進(jìn)行到塊設(shè)備層(block層,所以叫blk trace)時(shí)的詳細(xì)信息(如 IO 請(qǐng)求提交,入隊(duì),合并,完成等等一些列的信息),blktrace 需要借助內(nèi)核經(jīng)由 debugfs 文件系統(tǒng)(debugf s文件系統(tǒng)在內(nèi)存中)來(lái)輸出信息,所以用 blktrace 工具之前需要先掛載 debugfs 文件系統(tǒng),blktrace需要結(jié)合 blkparse 來(lái)使用,由 blkparse 來(lái)解析 blktrace 產(chǎn)生的特定格式的二進(jìn)制數(shù)據(jù)。

  blktrace語(yǔ)法:

blktrace -d dev [ -r debugfs_path ] [ -o output ] [-k ] [ -w time ] [ -a action ] [ -A action_mask ] [ -v ]

blktrace選項(xiàng):
-A hex-mask #設(shè)置過(guò)濾信息mask成十六進(jìn)制mask
-a mask #添加mask到當(dāng)前的過(guò)濾器
-b size #指定緩存大小for提取的結(jié)果,默認(rèn)為512KB
-d dev #添加一個(gè)設(shè)備追蹤
-I file #Adds the devices found in file as devices to trace
-k #殺掉正在運(yùn)行的追蹤
-n num-sub #指定緩沖池大小,默認(rèn)為4個(gè)子緩沖區(qū)
-o file #指定輸出文件的名字
-r rel-path #指定的debugfs掛載點(diǎn)
-V #版本號(hào)
-w seconds #設(shè)置運(yùn)行的時(shí)間

  文件輸出

  1. $ blktrace –d /dev/sda –o trace 

  解析結(jié)果 $ blkparse -i trace -o /root/trace.txt

  FIO

  FIO 是測(cè)試 IOPS 的非常好的工具,用來(lái)對(duì)硬件進(jìn)行壓力測(cè)試和驗(yàn)證,支持 13 種不同的 IO 引擎,包括:sync, mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。

  隨機(jī)讀

  1. $ fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=200G -numjobs=10 -runtime=1000 -group_reporting -name=mytest 

  說(shuō)明

filename=/dev/sdb1 測(cè)試文件名稱,通常選擇需要測(cè)試的盤的data目錄。
direct=1 測(cè)試過(guò)程繞過(guò)機(jī)器自帶的buffer。使測(cè)試結(jié)果更真實(shí)。
rw=randwrite 測(cè)試隨機(jī)寫的I/O
rw=randrw 測(cè)試隨機(jī)寫和讀的I/O
bs=16k 單次io的塊文件大小為16k
bsrange=512-2048 同上,提定數(shù)據(jù)塊的大小范圍
size=5g 本次的測(cè)試文件大小為5g,以每次4k的io進(jìn)行測(cè)試。
numjobs=30 本次的測(cè)試線程為30.
runtime=1000 測(cè)試時(shí)間為1000秒,如果不寫則一直將5g文件分4k每次寫完為止。
ioengine=psync io引擎使用pync方式
rwmixwrite=30 在混合讀寫的模式下,寫占30%
group_reporting 關(guān)于顯示結(jié)果的,匯總每個(gè)進(jìn)程的信息。
此外
lockmem=1g 只使用1g內(nèi)存進(jìn)行測(cè)試。
zero_buffers 用0初始化系統(tǒng)buffer。
nrfiles=8 每個(gè)進(jìn)程生成文件的數(shù)量。

  順序讀

  1. $ fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest 

  隨機(jī)寫

  1. $ fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest 

  順序?qū)?/p>

  1. $ fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest 

  混合隨機(jī)讀寫

  1. $ fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=100 -group_reporting -name=mytest -ioscheduler=noop 

  stress

  它可以給我們的系統(tǒng)施加 CPU,內(nèi)存,IO 和磁盤的壓力,在模擬極端場(chǎng)景給應(yīng)用系統(tǒng)造成的壓力方面很有幫助。

  示例

  1. $ stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10d 

   【責(zé)任編輯:武曉燕 TEL:(010)68476606】

責(zé)任編輯:武曉燕 來(lái)源: 運(yùn)維幫
相關(guān)推薦

2014-09-22 13:31:46

Linux

2009-10-12 12:46:55

Linux內(nèi)核SCSI IO

2016-10-17 08:49:15

WindowsLinuxArch Linux

2021-06-07 08:13:11

LinuxIDLE 子系統(tǒng)

2010-05-26 18:31:51

Linux性能監(jiān)控

2011-11-08 21:47:37

Linux 監(jiān)控 IO

2017-12-14 21:30:05

MySQLInnoDBIO子系統(tǒng)

2011-06-14 14:17:23

性能優(yōu)化系統(tǒng)層次

2011-05-16 10:13:51

Linux優(yōu)化

2022-05-15 22:34:32

SPI 控制器SPI 子系統(tǒng)

2022-05-12 12:47:07

SPI主設(shè)備通信

2014-12-15 10:06:13

linux診斷工具系統(tǒng)監(jiān)控

2021-07-29 14:20:34

網(wǎng)絡(luò)優(yōu)化移動(dòng)互聯(lián)網(wǎng)數(shù)據(jù)存儲(chǔ)

2011-03-11 15:52:57

LAMP優(yōu)化

2010-03-05 09:44:20

Linux系統(tǒng)安全提高

2011-03-24 10:18:44

2022-02-16 14:10:51

服務(wù)器性能優(yōu)化Linux

2011-03-24 10:11:59

Linux虛擬內(nèi)存優(yōu)化

2021-11-29 11:13:45

服務(wù)器網(wǎng)絡(luò)性能

2013-03-20 17:18:07

Linux系統(tǒng)性能調(diào)優(yōu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)