帶着dd去探索Linux磁盤IO

前言:Linux磁盤I/O是Linux內核的重要組成部分,是Linux開發工程師,特別是Linux存儲開發工程師必須瞭解的一課。掌握了這一課,在遇到磁盤I/O相關問題時便會得心應手,缺席了這一課,遇到它時便會覺得雲裏霧裏。dd是Linux的一款簡單易用又功能強大的文件拷貝工具,大家再熟悉不過了,今天就帶着它一起去探索Linux的磁盤I/O知識吧。

 

dd測試

首先看一下一份dd的測試數據,先感受下不同參數下dd的測試結果,然後帶着疑問再去探索其中的原由。

 

從上面的測試結果可以看到,沒有oflag的時候,文件複製速度是oflag=direct的十幾倍,oflag=direct的速度又比oflag=sync快了將近30%。dd使用oflag設置輸出文件的標誌位,oflag的標誌位可以是direct、sync、dsync等等,造成它們處理速度如此巨大是什麼原因呢,這就是我們今天要探究的知識,讓我們開始吧。

 

Linux磁盤I/0體系

先看一張Linux的存儲棧圖:

 

上面的存儲棧圖比較大而全,可以簡略爲以下的圖片:

 

Linux磁盤I/O可以分爲以下層次:

虛擬文件系統層

文件系統層

緩存層

通用塊層

I/O調度層

驅動層

物理設備層

 

虛擬文件系統層

一般來說,應用程序不會直接跟物理設備直接打交道,基本上都是經過文件系統去操作設備。文件系統種類比較多,比如基於塊設備的ext系列、xfs,網絡文件系統nfs等等,各類文件系統的接口和實現各不相同,這就產生了一個問題,難道應用程序要爲各種文件系統做特殊化處理嗎?答案是不用的,因爲有虛擬文件系統。虛擬文件系統層位於文件系統層之上,屏蔽了各種文件系統的差異,爲應用層提供了一個統一的、虛擬的文件系統接口,也就是說應用程序使用一套統一的接口便可以操作所有的文件系統。

 

文件系統層

基於虛擬文件系統定義的統一接口,實現具體文件系統的功能,文件系統有三類:

1.基於塊設備的文件系統,如ext2、3、4,xfs;

2.網絡文件系統,如nfs、cifs;

3.特殊文件系統,如/proc、裸設備文件。

 

緩存層

相比於CPU和內存,磁盤I/O屬於慢速I/O,爲了提高磁盤I/O的速度,Linux添加了緩存層。默認情況下,I/O數據先放到緩存中便返回上層,由內核再把數據寫到設備,或者是上層把緩存數據讀走。對於寫操作,由於數據是放到緩存便返回了,上層認爲I/O結束了,實際上數據還沒落盤,如果這時候電腦異常掉電了,數據將會丟失。如果應用層要確保數據寫到物理設備了,可以調用flush接口,緩存中的數據將會刷到物理設備中。Linux也提供了繞過緩存層的設置,打開文件的時候指定direct標識,數據將繞過緩存層繼續執行。

可通過free看到目前緩存的數據量,下圖的buff/cache便是:

 

通用塊層

由於設備種類繁多,接口也各不相同,爲了屏蔽這些設備的差異,添加了通用塊層。文件系統只需要跟統一的通用層打交道便可以跟設備通信,無需關心實際設備驅動的實現,簡化了文件系統的實現。

 

I/O調度層

磁盤I/O請求是隨機的,請求操作的磁盤位置也是隨機的,爲了減少磁盤I/O的磁盤,增大磁盤整體的吞吐量,Linux添加了I/O調度層。I/O調度層使用調度算法,更加合理的對I/O請求進行排序和合並,經典的是電梯算法。

把磁盤I/O請求比作爲乘坐電梯,分別有請求到3樓、到2樓、到6樓、到4樓,如果沒有調度算法的處理,將會出現電梯從1樓到3樓,從3樓到2樓,從2樓到6樓,再從6樓到4樓,造成電梯資源的浪費;如果有了調度算法,對調度進行了合理的排序,將出現電梯先到2樓、3樓、4樓、6樓,一次從1樓到6樓便可以完成所有的請求。

 

驅動層

各類物理設備的驅動層,用於內核與物理設備通訊。內核會提供驅動的通用接口,設備商根據接口實現驅動程序並註冊到內核便可實現內核與設備的通訊。

 

物理設備層

各種物理磁盤設備,提供實際的存儲功能,慢速設備有傳統的機械硬盤HDD、快速的有固態硬盤SSD和NVME。物理磁盤也會帶有緩存,用於提供I/O速度,磁盤中帶有電容,可保證哪怕掉電也能把緩存數據刷寫到磁盤中。

 

再看dd測試

沒oflag

沒有oflag時,dd按照默認的方式打開輸出文件,默認是buffered I/O,數據寫到緩存層便返回,所以速度最快。

oflag=direct

以該方式打開輸出文件,數據寫到磁盤緩存便返回,所以速度比上面的buffered I/O方式要慢。

oflag=sync

以該方式打開輸出文件,數據全部落盤才返回,所以速度比上面的僅寫到磁盤緩存要慢。

 

結束語

今天只是簡淺的描述了Linux的磁盤I/O,能讓我們對Linux的磁盤I/O有一個總體的認識,然後帶着這個認識繼續去探索更深更詳細的知識,做到能在面對磁盤I/O相關問題時遊刃有餘

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章