Linux 文件系統

索引節點和目錄項

文件系統,是對存儲設備上的文件,進行組織管理的機制。組織方式不一樣,就會造成不一樣的文件系統。node

Linux 文件系統爲每一個文件都分配兩個數據結構,索引節點(index node)和目錄項(directory entry)。它們主要用來記錄文件的元信息和目錄結構。緩存

  • 索引節點,簡稱爲 inode,用來記錄文件的元數據,好比 inode 編號、文件大小、訪問權限、修改日期、數據的位置等。索引節點和文件一一對應,它跟文件內容同樣,都會被持久化存儲到磁盤中。因此記住,索引節點一樣佔用磁盤空間。
  • 目錄項,簡稱爲 dentry,用來記錄文件的名字、索引節點指針以及與其餘目錄項的關聯關係。多個關聯的目錄項,就構成了文件系統的目錄結構。不過,不一樣於索引節點,目錄項是由內核維護的一個內存數據結構,因此一般也被叫作目錄項緩存

索引節點是每一個文件的惟一標誌,而目錄項維護的正是文件系統的樹狀結構。性能優化

磁盤讀寫的最小單位是扇區,然而扇區只有 512B 大小,若是每次都讀寫這麼小的單位,效率必定很低。因此,文件系統又把連續的扇區組成了邏輯塊,而後每次都以邏輯塊爲最小單元,來管理數據。常見的邏輯塊大小爲 4KB,也就是由連續的 8 個扇區組成。網絡

磁盤在執行文件系統格式化時,會被分紅三個存儲區域,超級塊、索引節點區和數據塊區。其中,數據結構

  • 超級塊,存儲整個文件系統的狀態。
  • 索引節點區,用來存儲索引節點。
  • 數據塊區,則用來存儲文件數據。

虛擬文件系統

目錄項、索引節點、邏輯塊以及超級塊,構成了 Linux 文件系統的四大基本要素。工具

爲了支持各類不一樣的文件系統,Linux 內核在用戶進程和文件系統的中間,又引入了一個抽象層,也就是虛擬文件系統 VFS(Virtual File System)。VFS 定義了一組全部文件系統都支持的數據結構和標準接口。性能

在 VFS 的下方,Linux 支持各類各樣的文件系統,如 Ext四、XFS、NFS 等等。按照存儲位置的不一樣,這些文件系統能夠分爲三類。學習

  • 第一類是基於磁盤的文件系統,也就是把數據直接存儲在計算機本地掛載的磁盤中。常見的 Ext四、XFS、OverlayFS 等,都是這類文件系統。
  • 第二類是基於內存的文件系統,也就是咱們常說的虛擬文件系統。這類文件系統,不須要任何磁盤分配存儲空間,但會佔用內存。咱們常常用到的 /proc 文件系統,其實就是一種最多見的虛擬文件系統。此外,/sys 文件系統也屬於這一類,主要向用戶空間導出層次化的內核對象。
  • 第三類是網絡文件系統,也就是用來訪問其餘計算機數據的文件系統,好比 NFS、SMB、iSCSI 等。

這些文件系統,要先掛載到 VFS 目錄樹中的某個子目錄(稱爲掛載點),而後才能訪問其中的文件。拿第一類,也就是基於磁盤的文件系統爲例,在安裝系統時,要先掛載一個根目錄(/),在根目錄下再把其餘文件系統(好比其餘的磁盤分區、/proc 文件系統、/sys 文件系統、NFS 等)掛載進來。優化

cat 命令來講,它首先調用 open() ,打開一個文件;而後調用 read() ,讀取文件的內容;最後再調用 write() ,把文件內容輸出到控制檯的標準輸出中:指針

「Linux 一切皆文件」的深入含義。不管是普通文件和塊設備、仍是網絡套接字和管道等,它們都經過統一的 VFS 接口來訪問。

性能觀測

容量

[root@k8s ~]# df -h /dev/vda1
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   14G   24G  37% /

有時候空間不足是由於索引節點空間不足。
索引節點的容量,(也就是 Inode 個數)是在格式化磁盤時設定好的,通常由格式化工具自動生成。當你發現索引節點空間不足,但磁盤空間充足時,極可能就是過多小文件致使的。

[root@k8s ~]# df -h /dev/vda1 -i
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/vda1        2.5M  255K  2.3M   10% /

總結

文件系統,是對存儲設備上的文件,進行組織管理的一種機制。爲了支持各種不一樣的文件系統,Linux 在各類文件系統實現上,抽象了一層虛擬文件系統(VFS)。

VFS 定義了一組全部文件系統都支持的數據結構和標準接口。這樣,用戶進程和內核中的其餘子系統,就只須要跟 VFS 提供的統一接口進行交互。

爲了下降慢速磁盤對性能的影響,文件系統又經過頁緩存、目錄項緩存以及索引節點緩存,緩和磁盤延遲對應用程序的影響。

find / -name 這個命令是全盤掃描(既包括內存文件系統又包含本地的xfs【個人環境沒有mount 網絡文件系統】),因此 inode cache & dentry & proc inode cache 會升高。
另外,執行過了一次後再次執行find 就機會沒有變化了,執行速度也快了不少,也就是下次的find大部分是依賴cache的結果。

學習筆記 整理自極客時間:《Linux性能優化實戰》

相關文章
相關標籤/搜索