2019年7月1日 星期一

Block Size 與 Direct IO

在使用 direct IO 的時候,讀取/寫入的大小、buffer 的起始位置與檔案操作的 offset 需要是某個數值的整數倍,在 linux 2.4 之前,這個數值是 filesystem 的 logical block size,通常是 4K,在 linux 2.6 之後,這個數值是 device physical block size (device sector size),通常是 512 bytes。

block 在不同的語境可能會有不同的意思,容易造成混淆,在這邊解釋一下這兩個名詞的意思。

physical block

表示 device 本身一次能夠操作的最小單位,也有可能叫 device sector 或是 physical sector。

logical block

這個概念存在 linux filesystem 中,是 linux 一次 device 操作的最小單元,有時候叫 filesystem block、data block 或是直接就叫 block,logical block size 必須是 physical block size 的整數倍。

Advanced Format

原本 physical block size 幾乎都是 512 bytes,然而為了日漸增加的大檔需求,有些製造商推出了 4K physical block size 的儲存裝置。但不是所有 OS 與軟體都支援 4K physical block size,所以儲存裝置內的 firmware 支援一種功能,就是可以 export 出 512 bytes 的 "logical sector size" 給 linux (稱為 512e 格式),然後 firmware 內部將非 4K 對齊的 IO 操作轉換為 4K IO 操作。

若是 firmware 不使用模擬 512 bytes 模式而使用原生 4K,則稱為 4K native device,不過這要作業系統跟系統上軟體也支援才行,否則可能會遇到奇奇怪怪的問題。而 512e 與 4K native 這些新的格式與概念就是 Advanced Format

在 512e 格式下出現的 logical sector size 與先前提到的 logical block 很容易造成混淆,在這裡我認為這兩個講的不是同一件事,一個是存在 linux filesystem 的概念,一個是存在儲存裝置內的概念,對於 512e 格式的儲存裝置,從 linux 系統的角度來看,裝置的 physical block size 是 512 bytes 的,雖然它實際上是 4K。

那對新式 4K physical block size 的儲存裝置,direct IO 要怎麼對齊?在 512e 格式的系統上,需對齊 512 bytes,但在 native 4K 的系統上,則需對齊 4K。要對齊哪個數字,可以經由查詢系統上的 logical sector size (不是 filesystem 的 logical block size) 得到,例如用 ioctl 傳參數 BLKSSZGET。

當然查詢 physical block size 然後對齊它我覺得也是可以的,不過網路上的範例似乎都是查詢 logical block size 來作對齊,可能是因為這樣在 512e 裝置上可以對齊 512 bytes,對於對齊來說數字越小是越容易做到的。


Reference:

沒有留言:

張貼留言