說說IO(四)- 文件系統

 

 

文件系統各有不同,其最主要的目標就是解決磁盤空間的管理問題,同時提供高效性、安全性。如果在分佈式環境下,則有相應的分佈式文件系統。Linux上有ext系列,Windows上有FatNTFS。如圖爲一個linux下文件系統的結構。

 

其中VFSVirtual File System)是Linux Kernel文件系統的一個模塊,簡單看就是一個Adapter,對下屏蔽了下層不同文件系統之間的差異,對上爲操作系統提供了統一的接口.

中間部分爲各個不同文件系統的實現。

再往下是Buffer CacheDriver

 

 

文件系統的結構

各種文件系統實現方式不同,因此性能、管理性、可靠性等也有所不同。下面爲Linux Ext2Ext3)的一個大致文件系統的結構。

 

Boot Block存放了引導程序。

Super Block存放了整個文件系統的一些全局參數,如:卷名、狀態、塊大小、塊總數。他在文件系統被mount時讀入內存,在umount時被釋放。

上圖描述了Ext2文件系統中很重要的三個數據結構和他們之間的關係。

InodeInode是文件系統中最重要的一個結構。如圖,他裏面記錄了文件相關的所有信息,也就是我們常說的meta信息。包括:文件類型、權限、所有者、大小、atime等。Inode裏面也保存了指向實際文件內容信息的索引。其中這種索引分幾類:

 

  • 直接索引:直接指向實際內容信息,公有12個。因此如果,一個文件系統block size1k,那麼直接索引到的內容最大爲12k
  • 間接索引
  • 兩級間接索引
  • 三級間接索引

 

 

如圖:

 

Directory代表了文件系統中的目錄,包括了當前目錄中的所有Inode信息。其中每行只有兩個信息,一個是文件名,一個是其對應的Inode。需要注意,Directory不是文件系統中的一個特殊結構,他實際上也是一個文件,有自己的Inode,而它的文件內容信息裏面,包括了上面看到的那些文件名和Inode的對應關係。如下圖:

 

Data Block即存放文件的時間內容塊。Data Block大小必須爲磁盤的數據塊大小的整數倍,磁盤一般爲512字節,因此Data Block一般爲1K2K4K

 

Buffer Cache

Buffer & Cache

雖然BufferCache放在一起了,但是在實際過程中BufferCache是完全不同了。Buffer一般對於寫而言,也叫“緩衝區”,緩衝使得多個小的數據塊能夠合併成一個大數據塊,一次性寫入;Cache一般對於讀而且,也叫“緩存”,避免頻繁的磁盤讀取。如圖爲Linuxfree命令,其中也是把BufferCache進行區分,這兩部分都算在了free的內存。

 

Buffer Cache

Buffer Cache中的緩存,本質與所有的緩存都是一樣,數據結構也是類似,下圖爲VxSF的一個Buffer Cache結構。

 

這個數據結構與memcachedOracle SGAbuffer何等相似。左側的hash chain完成數據塊的尋址,上方的的鏈表記錄了數據塊的狀態。

 

Buffer vs Direct I/O

文件系統的BufferCache在某些情況下確實提高了速度,但是反之也會帶來一些負面影響。一方面文件系統增加了一箇中間層,另外一方面,當Cache使用不當、配置不好或者有些業務無法獲取cache帶來的好處時,cache則成爲了一種負擔。

       適合Cache的業務:串行的大數據量業務,如:NFSFTP

       不適合Cache的業務:隨機IO的業務。如:Oracle,小文件讀取。

 

塊設備、字符設備、裸設備

這幾個東西看得很暈,找了一些資料也沒有找到很準確的說明。

從硬件設備的角度來看,

 

  • 塊設備就是以塊(比如磁盤扇區)爲單位收發數據的設備,它們支持緩衝和隨機訪問(不必順序讀取塊,而是可以在任何時候訪問任何塊)等特性。塊設備包括硬盤、CD-ROM  RAM 盤。
  • 字符設備則沒有可以進行物理尋址的媒體。字符設備包括串行端口和磁帶設備,只能逐字符地讀取這些設備中的數據。

 

 

從操作系統的角度看(對應操作系統的設備文件類型的bc),

# ls -l /dev/*lv

brw-------   1 root     system       22,  2 May 15 2007  lv

crw-------   2 root     system       22,  2 May 15 2007  rlv

 

  •  塊設備能支持緩衝和隨機讀寫。即讀取和寫入時,可以是任意長度的數據。最小爲1byte。對塊設備,你可以成功執行下列命令:dd if=/dev/zero of=/dev/vg01/lv bs=1 count=1。即:在設備中寫入一個字節。硬件設備是不支持這樣的操作的(最小是512),這個時候,操作系統首先完成一個讀取(如1K,操作系統最小的讀寫單位,爲硬件設備支持的數據塊的整數倍),再更改這1k上的數據,然後寫入設備。
  • 字符設備只能支持固定長度數據的讀取和寫入,這裏的長度就是操作系統能支持的最小讀寫單位,如1K,所以塊設備的緩衝功能,這裏就沒有了,需要使用者自己來完成。由於讀寫時不經過任何緩衝區,此時執行dd if=/dev/zero of=/dev/vg01/lv bs=1 count=1,這個命令將會出錯,因爲這裏的bsblock size)太小,系統無法支持。如果執行dd if=/dev/zero of=/dev/vg01/lv bs=1024 count=1,則可以成功。這裏的block sizeOS內核參數決定。

 

如上,相比之下,字符設備在使用更爲直接,而塊設備更爲靈活。文件系統一般建立在塊設備上,而爲了追求高性能,使用字符設備則是更好的選擇,如Oracle的裸設備使用。

 

裸設備

裸設備也叫裸分區,就是沒有經過格式化、沒有文件系統的一塊存儲空間。可以寫入二進制內容,但是內容的格式、其中信息的組織等問題,需要使用它的人來完成。文件系統就是建立在裸設備之上,並完成裸設備空間的管理。

 

CIO

CIO即並行IOConcurrent IO)。在文件系統中,當某個文件被多個進程同時訪問時,就出現了Inode競爭的問題。一般地,讀操作使用的共享鎖,即:多個讀操作可以併發進行,而寫操作使用排他鎖。當鎖被寫進程佔用時,其他所有操作均阻塞。因此,當這樣的情況出現時,整個應用的性能將會大大降低。如圖:

 

CIO就是爲了解決這個問題。而且CIO帶來的性能提高直逼裸設備。當文件系統支持CIO並開啓CIO時,CIO默認會開啓文件系統的Direct IO,即:讓IO操作不經過Buffer直接進行底層數據操作。由於不經過數據Buffer,在文件系統層面就無需考慮數據一致性的問題,因此,讀寫操作可以並行執行。

在最終進行數據存儲的時候,所有操作都會串行執行,CIO把這個事情交個了底層的driver


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