關於磁碟IO的總結

2022-06-24 01:27:04 字數 4377 閱讀 4575

1. 完全隨機寫還是跳躍,5倍的效能差距! 1

2. 多執行緒隨機讀、處理速度、響應時間 2

3. 是否使用direct io 2

4. 系統快取 3

4.1. 系統快取相關的幾個核心引數: 3

4.2. 系統一般在下面三種情況下回寫dirty頁: 3

4.3. pb專案中的感觸: 4

5. 磁碟預讀 4

6. 其他細節: 5

6.1. pread 和pwrite 5

6.2. 檔案描述符需要多套嗎? 6

全隨機寫無疑是最慢的寫入方式,在logic dump測試中很驚訝的發現,將200m的記憶體資料隨機的寫入到100g的磁碟資料裡面,竟然要2個小時之多。原因就是雖然只有200m的資料,但實際上卻是200萬次隨機寫,根據測試,在2850機器上,這樣完全的隨機寫,r/s 大約在150~350之間,在180機器上,r/s難以達到250,這樣計算,難怪需要2~3個小時之久。

如何改進這種單執行緒隨機寫慢的問題呢。一種方法就是盡量將完全隨機寫變成有序的跳躍隨機寫。實現方式,可以是簡單的在記憶體中快取一段時間,然後排序,使得在寫盤的時候,不是完全隨機的,而是使得磁碟磁頭的移動只向乙個方向。

根據測試,再一次讓我震驚,簡單的先在記憶體中排序,竟然直接使得寫盤時間縮短到1645秒,磁碟的r/s也因此提公升到1000以上。寫盤的速度,一下子提高了5倍。

乙個需要注意的地方,這種跳躍寫對效能的提公升,來至與磁頭的單方向移動,它非常容易受其他因素的影響。測試中,上面提到的測試是只寫block檔案,但如果在每個tid的處理中再增加乙個寫index的小檔案。雖然如果只寫index小檔案,所用時間幾乎可以忽略,但如果夾雜在寫block檔案中間的話,對整體的寫效能可能影響巨大,因為他可能使得磁碟的磁頭需要這兩個地方來回跑。

根據測試,如果只寫index檔案,只需要300s就可以寫完所有200萬個tid,單如果將寫索引和寫block放在一起,總時間就遠大於分別寫這兩部分的時間的和。針對這種情況,一種解決方案就是就不要將小資料量的資料實時的刷盤,使用應用層的cache來快取小資料量的index,這樣就可以消除對寫block檔案的影響。

從原理上解釋上面的表象,一般來說,硬碟讀取資料的過程是這樣的,首先是將磁頭移動到磁碟上資料所在的區域,然後才能進行讀取工作。磁頭移動的過程又可以分解為兩個步驟,其一是移動磁頭到指定的磁軌,也就是尋道,這是乙個在磁碟碟片徑向上移動的步驟,花費的時間被稱為「尋道時間」;其二就是旋轉碟片到相應扇區,花費的時間被稱為「潛伏時間」(也被稱為延遲)。那麼也就是說在硬碟上讀取資料之前,做準備工作上需要花的時間主要就是「尋道時間」和「潛伏時間」的總和。

真正的資料讀取時間,是由讀取資料大小和磁碟密度、磁碟轉速決定的固定值,在應用層沒有辦法改變,但應用層缺可以通過改變對磁碟的訪問模式來減少「尋道時間」和「潛伏時間」, 我們上面提到的在應用層使用cache然後排序的方式,無疑就是縮短了磁碟的定址時間。由於磁頭是物理裝置,也很容易理解,為什麼中間插入對其他小檔案的讀寫會導致速度變慢很多。

建議:盡量避免完全的隨機寫,在不能使用多線處理的時候,盡量使用應用層cache,確保寫盤時盡量有順序性。對於小資料量的其他檔案,可以一直儲存在應用層cache裡面,避免對其他大資料量的資料寫入產生影響。

多執行緒隨機讀的處理速度可以達到單執行緒隨機讀的10倍以上,但同上也帶來了響應時間的增大。測試結論如下:(每個執行緒盡量讀)

結論標明增加執行緒數,可以有效的提公升程式整體的io處理速度。但同時,也使得每個io請求的響應時間上公升很多。

從底層的實現上解釋這個現象:應用層的io請求在核心態會加入到io請求佇列裡面。核心在處理io請求的時候,並不是簡單的先到先處理,而是根據磁碟的特性,使用某種電梯演算法,在處理完乙個io請求後,會優先處理最臨近的io請求。

這樣可以有效的減少磁碟的尋道時間,從而提公升了系統整體的io處理速度。但對於每乙個io請求來看,由於可能需要在佇列裡面等待,所以響應時間會有所提公升。

響應時間上公升,應該主要是由於我們測試的時候採用每個執行緒都盡量讀的方式。在實際的應用中,我們的程式都沒有達到這種壓力。所以,在io成為瓶頸的程式裡面,應該盡量使用多執行緒並行處理不同的請求。

對於執行緒數的選擇,還需要通過效能測試來衡量。

首先看測試結論:

可見在小資料量下非dio方式更快,但隨著資料量增大,dio方式更快,分界線在50g左右。(注,測試基於: 執行緒數:

50,每次讀操作讀出:4k, 機器:del 180, 記憶體:

機器總記憶體8g,使用其他程式占用3g,剩餘5g左右, 其他情況可能有不同的分界線。)

1. /proc/sys/vm/dirty_background_ratio

該檔案表示髒資料到達系統整體記憶體的百分比,此時觸發pdflush程序把髒資料寫回磁碟。

預設設定:10

2. /proc/sys/vm/dirty_expire_centisecs

該檔案表示如果髒資料在記憶體中駐留時間超過該值,pdflush程序在下一次將把這些資料寫回磁碟。

預設設定:3000(1/100秒)

3. /proc/sys/vm/dirty_ratio

該檔案表示如果程序產生的髒資料到達系統整體記憶體的百分比,此時程序自行把髒資料寫回磁碟。

預設設定:40

4. /proc/sys/vm/dirty_writeback_centisecs

該檔案表示pdflush程序週期性間隔多久把髒資料寫回磁碟。

預設設定:500(1/100秒)

1. 定時方式: 定時回寫是基於這樣的原則:

/proc/sys/vm/dirty_writeback_centisecs的值表示多長時間會啟動回寫執行緒,由這個定時器啟動的回寫執行緒只回寫在記憶體中為dirty時間超過(/proc/sys/vm/didirty_expire_centisecs / 100)秒的頁(這個值預設是3000,也就是30秒),一般情況下dirty_writeback_centisecs的值是500,也就是5秒,所以預設情況下系統會5秒鐘啟動一次回寫執行緒,把dirty時間超過30秒的頁回寫,要注意的是,這種方式啟動的回寫執行緒只回寫超時的dirty頁,不會回寫沒超時的dirty頁,可以通過修改/proc中的這兩個值,細節檢視核心函式wb_kupdate。

2. 記憶體不足的時候: 這時並不將所有的dirty頁寫到磁碟,而是每次寫大概1024個頁面,直到空閒頁面滿足需求為止

3. 寫操作時發現髒頁超過一定比例: 當髒頁佔系統記憶體的比例超過/proc/sys/vm/dirty_background_ratio 的時候,write系統呼叫會喚醒pdflush回寫dirty page,直到髒頁比例低於/proc/sys/vm/dirty_background_ratio,但write系統呼叫不會被阻塞,立即返回.

當髒頁佔系統記憶體的比例超/proc/sys/vm/dirty_ratio的時候, write系統呼叫會被被阻塞,主動回寫dirty page,直到髒頁比例低於/proc/sys/vm/dirty_ratio

1, 如果寫入量巨大,不能期待系統快取的自動回刷機制,最好採用應用層呼叫fsync或者sync。如果寫入量大,甚至超過了系統快取自動刷回的速度,就有可能導致系統的髒頁率超過/proc/sys/vm/dirty_ratio, 這個時候,系統就會阻塞後續的寫操作,這個阻塞有可能有5分鐘之久,是我們應用無法承受的。因此,一種建議的方式是在應用層,在合適的時機呼叫fsync。

2, 對於關鍵效能,最好不要依賴於系統cache的作用,如果對效能的要求比較高,最好在應用層自己實現cache,因為系統cache受外界影響太大,說不定什麼時候,系統cache就被沖走了。

3, 在logic設計中,發現一種需求使用系統cache實現非常合適,對於logic中的高樓貼,在應用層cache實現非常複雜,而其數量又非常少,這部分請求,可以依賴於系統cache發揮作用,但需要和應用層cache相配合,應用層cache可以cache住絕大部分的非高樓貼的請求,做到這一點後,整個程式對系統的io就主要在高樓貼這部分了。這種情況下,系統cache可以做到很好的效果。

關於預讀,從網上摘錄如下兩段:

預讀演算法概要

1.順序性檢測

為了保證預讀命中率,linux只對順序讀(sequential read)進行預讀。核心通過驗證如下兩個條件來判定乙個read()是否順序讀:

◆這是檔案被開啟後的第一次讀,並且讀的是檔案首部;

◆當前的讀請求與前一(記錄的)讀請求在檔案內的位置是連續的。

如果不滿足上述順序性條件,就判定為隨機讀。任何乙個隨機讀都將終止當前的順序序列,從而終止預讀行為(而不是縮減預讀大小)。注意這裡的空間順序性說的是檔案內的偏移量,而不是指物理磁碟扇區的連續性。

在這裡linux作了一種簡化,它行之有效的基本前提是檔案在磁碟上是基本連續儲存的,沒有嚴重的碎片化。

2.流水線預讀

其中的ahead視窗便是為流水線準備的:當應用程式工作在current視窗時,核心可能正在ahead視窗進行非同步預讀;一旦程式進入當前的ahead視窗,核心就會立即往前推進兩個視窗,並在新的ahead視窗中啟動預讀i/o。

磁碟IO的總結

全隨機寫無疑是最慢的寫入方式,在logic dump測試中很驚訝的發現,將200m的記憶體資料隨機的寫入到100g的磁碟資料裡面,竟然要2個小時之多。原因就是雖然只有200m的資料,但實際上卻是200萬次隨機寫,根據測試,在2850機器上,這樣完全的隨機寫,r s 大約在150 350之間,在180...

磁碟陣列的發展趨勢

儲存一直作為計算機體系結構馮.諾伊曼結構體系結構五個組成部分之一,隨著資訊產業的發展逐漸從計算機中獨立出來,成為it業中的一大類,計算與儲存在it界常常相提並論。回顧歷史,應用對儲存大容量的需求促使raid技術的誕生,形成磁碟陣列產品。起初磁碟陣列機在物理形態上一直保持與計算機相當的體積,inter...

實驗報告二 IO口的應用

華南理工大學廣州學院學生實驗報告 課程名稱 微控制器實驗 華南理工大學廣州學院自動化專業1班姓名 陳惠玲 實驗名稱 i o口的應用 實驗日期 2012年10月19日指導老師 文麗 1 實驗目的 了解微控制器並行i o口的結構和基本原理,掌握p0,p1,p2,p3作通用i o口的使用方法 二 實驗內容...