(3)Linux效能調優之Linux檔案系統

小蟲說發表於2018-12-24

一、前言

前面我們談了Linux的程式管理和記憶體體系:

(1)Linux效能調優之Linux程式管理

(2)Linux效能調優之Linux記憶體體系

這一節我們將談下Linux的檔案系統

二、概覽

Linux作為開源作業系統,最大的優勢是它可以支援各類檔案系統。現代的Linux核心能夠支援幾乎每種檔案系統,從基礎的FAT到高效能的日誌檔案系統(JFS)都能可以。

因為目前Linux的發行版本中,Readhat系(開源版本是Centos)和debian系(大家熟知的Ubuntu)比較流行,所以後面會重點介紹下Readhat系用的xfs檔案系統和ext4檔案系統。

三、虛擬檔案系統

虛擬檔案系統(VFS)是一個處於使用者程式和各類檔案系統之間的抽象介面層,VFS提供訪問檔案系統物件的通用物件模型(例如,i-node、檔案物件、頁快取、)和方法,它對使用者程式隱藏了各種檔案系統的差別。正是因為有VFS,所以使用者程式不用關心使用的是那種檔案系統,也更不需要知道各個檔案系統應該使用哪個系統呼叫。下圖顯示了VFS的概況:

(3)Linux效能調優之Linux檔案系統

在開始介紹各個檔案系統前,先介紹一個概念:日誌

在非日誌檔案系統上,當執行寫操作時,核心先修改檔案系統的後設資料,然後寫入實際的使用者資料。這個操作可能會丟失資料的完整性。如果在寫入檔案系統後設資料的時候系統突然崩潰,檔案系統的一致性就可能被破壞。fsck會在下次啟動時檢查所有的後設資料,並修復檔案系統上的不一致,但是如果卷特別大的時候,這個修復過程就會變得很漫長,只能乾等著fsck工作完之後才能使用這系統。

日誌檔案系統解決了這個問題,在寫入實際的檔案系統之前,他先把要修改的資料寫入一個叫做日誌區域(journal area)的地方。日誌區域可以在檔案系統上,也可以不在檔案系統上。寫入日誌區域的資料叫做日誌記錄(joutnal log)。如果系統支援的話,它內容包括檔案系統後設資料和真正的檔案資料。

因為在寫入真正使用者資料之前要寫記錄日誌,和非日誌檔案系統相比會產生效能開銷。維護資料高度一致性所犧牲的效能開銷大小,取決於在寫入使用者資料之前要寫入多少資訊到磁碟上。

(3)Linux效能調優之Linux檔案系統

四、常見的檔案系統

  • 4.1 Ext2

Ext2是一個簡單和快速的檔案系統,沒有日誌功能。下圖展示了Ext2的檔案系統資料結構:

(3)Linux效能調優之Linux檔案系統

檔案系統由一個引導扇區(boot sector)開始,後面跟著塊組(block groups)。整個檔案系統被分成許多小塊組來獲得高效能,因為i-node表和儲存使用者資料的資料塊駐留在較前的磁碟,所以節約定址時間。一個塊組包含如下專案:

+ 超級塊(Super block) 磁碟上資訊存放在這裡,超級塊的副本儲存在每個塊組的頂部。
+ 塊組描述符(Block group descriptor) 塊組的資訊存在這裡
+ 資料塊點陣圖(Data block bitmaps) 空閒塊管理
+ i-node點陣圖(i-node bitmaps) 空閒i-node管理
+ i-node表(i-node tables) 存放i-node表。每個檔案都有相應的i-node表,存放檔案的後設資料,譬如檔案
模式、uid、gid、atime、ctime、mtime、dtime和資料塊的指標。
+ 資料塊(Data blocks) 存放真正的使用者資料。
複製程式碼

如何訪問資料?

為了找到組成檔案的資料塊,核心首先搜尋檔案的i-node。在接到程式開啟/var/log/messages 檔案的請求時,核心分析檔案路徑,然後搜尋/(根目錄)的條目,其中包含了它自己目錄下 的檔案和目錄資訊。這時候,核心會找到/var目錄的i-node,然後再來看看/var目錄,它也有 它自己目錄下的檔案和目錄的資訊。核心會一直執行上面的過程,直到找到/var/log/messages檔案的i-node。Linux核心使用物件快取,比如目錄條目快取或者i-node快取來加速尋找i-node的過程。

一旦核心找到了檔案的i-node,然後就試著訪問真正的使用者資料塊。如前面解釋的那樣,inode有資料塊的指標。參照它,核心就能獲得資料塊了。對於大檔案來說,Ext2提供到資料塊的直接/非直接參照。下圖展示了它是如何工作的:

(3)Linux效能調優之Linux檔案系統

  • 4.2 Ext3

Ext3和Ext2的基本結構是相似的,主要區別是Ext3支援日誌。Ext3有如下亮點:

1.可用性: Ext3採用一致性的方式把資料寫入磁碟,所以,當系統出現意外當機(斷電或者系統崩潰),
伺服器再次啟動時不用檢查資料的一致性。可以把系統恢復時間從幾小時縮短到幾秒鐘!
2.資料完整性: 在mount命令中使用data=journal開啟日誌記錄模式,所有的資料,包括檔案和後設資料都會記錄日誌!
3.速度: 通過指定日誌模式data=writeback,你可以在你的業務場景下,在速度和完整性之間做權衡。
在有大量同步寫的時候,這個效果會十分顯著。
4.靈活性: 把現有的Ext2很簡單就能升級到Ext3,而且不用重新格式化。通過執行tune2fs命令和修改/etc/fstab檔案,
你能夠很簡單的把Ext2升級到Ext3檔案系統!同樣,在關掉Ext3日誌的情況下,Ext3能夠作為Ext2檔案系統進行掛載。
複製程式碼

Ext3支援3種日誌模式:

1. 日誌(journal) 通過記錄檔案資料和後設資料,這個模式提供了最高的資料一致性。它的
效能消耗也是最大的。
2. 有序(ordered) 該模式下只記錄後設資料。然而,優先保證寫入檔案資料!
3. 回寫(writeback) 這個日誌選項提供最快的資料訪問能力,但是犧牲了資料的一致性!
保證資料一致性的後設資料也會被記錄,但是沒有處理確定的檔案資料,在系統崩潰的時
候,這可能導致舊的資料出現在檔案中。
複製程式碼
  • 4.3 Ext4

EXT4是第四代擴充套件檔案系統(英語:Fourth extended filesystem,縮寫為ext4)是Linux系統下的日誌檔案系統,是ext3檔案系統的後繼版本。

目前的很多Linux發現版本用的都是ext4檔案系統,關於ext4檔案系統的介紹和特性參考百度百科:

Ext4檔案系統

  • 4.4 xfS

擴充套件檔案系統(eXtended File System,XFS)是一個高效能日誌檔案系統,支援超大檔案和分割槽。Redhat已經其開源版本Centos7用的正是xfs檔案系統。關於xfs檔案系統的介紹和特性參考百度百科:

xfs檔案系統

五、如何檢視當前分割槽使用的檔案系統?

  1. df -T

    (3)Linux效能調優之Linux檔案系統

  2. parted -l

(3)Linux效能調優之Linux檔案系統

  1. dumpe2fs:查詢Ext 家族superblock 資訊的指令

(3)Linux效能調優之Linux檔案系統

六、下一節是???

談完Linux的檔案系統,下一節將會談一下Linux的磁碟I/O子系統

相關文章