索引節點和目錄項
檔案系統,本身是對儲存裝置上的檔案,進行組織管理的機制。組織方式不同,就會形成不同的檔案系統。
你要記住最重要的一點,在 Linux 中一切皆檔案。不僅普通的檔案和目錄,就連塊裝置、套接字、管道等,也都要通過統一的檔案系統來管理。
為了方便管理,Linux 檔案系統為每個檔案都分配兩個資料結構,索引節點(index node)和目錄項(directory entry)。它們主要用來記錄檔案的元資訊和目錄結構。
- 索引節點,簡稱為 inode,用來記錄檔案的後設資料,比如 inode 編號、檔案大小、訪問許可權、修改日期、資料的位置等。索引節點和檔案一一對應,它跟檔案內容一樣,都會被持久化儲存到磁碟中。所以記住,索引節點同樣佔用磁碟空間。
- 目錄項,簡稱為 dentry,用來記錄檔案的名字、索引節點指標以及與其他目錄項的關聯關係。多個關聯的目錄項,就構成了檔案系統的目錄結構。不過,不同於索引節點,目錄項是由核心維護的一個記憶體資料結構,所以通常也被叫做目錄項快取。
虛擬檔案系統
目錄項、索引節點、邏輯塊以及超級塊,構成了 Linux 檔案系統的四大基本要素。不過,為了支援各種不同的檔案系統,Linux 核心在使用者程式和檔案系統的中間,又引入了一個抽象層,也就是虛擬檔案系統 VFS(Virtual File System)。
檔案系統可以分為三類
- 第一類是基於磁碟的檔案系統,也就是把資料直接儲存在計算機本地掛載的磁碟中。常見的 Ext4、XFS、OverlayFS 等,都是這類檔案系統.
- 第二類是基於記憶體的檔案系統,也就是我們常說的虛擬檔案系統。這類檔案系統,不需要任何磁碟分配儲存空間,但會佔用記憶體。我們經常用到的 /proc 檔案系統,其實就是一種最常見的虛擬檔案系統。此外,/sys 檔案系統也屬於這一類,主要向使用者空間匯出層次化的核心物件。
- 第三類是網路檔案系統,也就是用來訪問其他計算機資料的檔案系統,比如 NFS、SMB、iSCSI 等。
磁碟
- 機械磁碟: 也稱為硬碟驅動器(Hard Disk Driver),通常縮寫為 HDD。機械磁碟主要由碟片和讀寫磁頭組成,資料就儲存在碟片的環狀磁軌中。在讀寫資料前,需要移動讀寫磁頭,定位到資料所在的磁軌,然後才能訪問資料。
顯然,如果 I/O 請求剛好連續,那就不需要磁軌定址,自然可以獲得最佳效能。這其實就是我們熟悉的,連續 I/O 的工作原理。與之相對應的,當然就是隨機 I/O,它需要不停地移動磁頭,來定位資料位置,所以讀寫速度就會比較慢。 - 固態磁碟(Solid State Disk): 通常縮寫為 SSD,由固態電子元器件組成。固態磁碟不需要磁軌定址,所以,不管是連續 I/O,還是隨機 I/O 的效能,都比機械磁碟要好得多。
磁碟效能指標
- 使用率,是指磁碟處理 I/O 的時間百分比。過高的使用率(比如超過 80%),通常意味著磁碟 I/O 存在效能瓶頸
- 飽和度,是指磁碟處理 I/O 的繁忙程度。過高的飽和度,意味著磁碟存在嚴重的效能瓶頸。當飽和度為 100% 時,磁碟無法接受新的 I/O 請求。
- IOPS(Input/Output Per Second),是指每秒的 I/O 請求數。
- 吞吐量,是指每秒的 I/O 請求大小。
- 響應時間,是指 I/O 請求從發出到收到響應的間隔時間。
答疑
- 檔案資料到底是怎麼儲存的呢?是不是直接寫到磁碟中就好了呢?
實際上,磁碟讀寫的最小單位是扇區,然而扇區只有 512B 大小,如果每次都讀寫這麼小的單位,效率一定很低。所以,檔案系統又把連續的扇區組成了邏輯塊,然後每次都以邏輯塊為最小單元,來管理資料。常見的邏輯塊大小為 4KB,也就是由連續的 8 個扇區組成。
- 目錄項本身就是一個記憶體快取,而索引節點則是儲存在磁碟中的資料。在前面的 Buffer 和 Cache 原理中,我曾經提到過,為了協調慢速磁碟與快速 CPU 的效能差異,檔案內容會快取到頁快取 Cache 中。這些索引節點自然也會快取到記憶體中,加速檔案的訪問。
- 第二,磁碟在執行檔案系統格式化時,會被分成三個儲存區域,超級塊、索引節點區和資料塊區。其中,
- 超級塊,儲存整個檔案系統的狀態。
- 索引節點區,用來儲存索引節點。
- 資料塊區,則用來儲存檔案資料。
- 阻塞、非阻塞 I/O 與同步、非同步 I/O 的區別和聯絡?
- 所謂阻塞 I/O,是指應用程式在執行 I/O 操作後,如果沒有獲得響應,就會阻塞當前執行緒,不能執行其他任務。
- 所謂非阻塞 I/O,是指應用程式在執行 I/O 操作後,不會阻塞當前的執行緒,可以繼續執行其他的任務。
- 所謂同步 I/O,是指收到 I/O 請求後,系統不會立刻響應應用程式;等到處理完成,系統才會通過系統呼叫的方式,告訴應用程式 I/O 結果。
- 所謂非同步 I/O,是指收到 I/O 請求後,系統會先告訴應用程式 I/O 請求已經收到,隨後再去非同步處理;等處理完成後,系統再通過事件通知的方式,告訴應用程式結果。
- 為什麼相同磁碟的隨機 I/O 都要比連續 I/O 慢很多?
- 對機械磁碟來說,我們剛剛提到過的,由於隨機 I/O 需要更多的磁頭尋道和碟片旋轉,它的效能自然要比連續 I/O 慢。
- 而對固態磁碟來說,雖然它的隨機效能比機械硬碟好很多,但同樣存在“先擦除再寫入”的限制。隨機讀寫會導致大量的垃圾回收,所以相對應的,隨機 I/O 的效能比起連續 I/O 來,也還是差了很多。
- 此外,連續 I/O 還可以通過預讀的方式,來減少 I/O 請求的次數,這也是其效能優異的一個原因。很多效能優化的方案,也都會從這個角度出發,來優化 I/O 效能。
效能工具
# -d -x表示顯示所有磁碟I/O的指標 $ iostat -d -x 1 Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 loop1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Linux 系統的 I/O 棧圖
I/O 效能分析的“指標篩選”清單使用
根據指標找工具
根據工具查指標
綜合應用
本作品採用《CC 協議》,轉載必須註明作者和本文連結