Filesystems

Linux 上文件記憶體的最佳塊大小是多少?

  • January 14, 2019

設備塊大小通常為 512 字節,而文件系統塊大小通常為 4096 字節。為什麼它們不同?為什麼 512B 和 4KB 是設備和文件系統塊大小的好選擇?什麼塊大小最適合在使用者空間庫中記憶體磁碟讀取?

設備塊大小是系統與 HDD 控制器通信的塊大小。如果你想讀/寫硬碟,它會發生這樣的事情:

  1. 讀:

  2. CPU -> 硬碟控制器:“請將塊 43623626 的數據發送給我”

  3. 硬碟控制器 -> CPU:“完成,這裡是:0xfce2c0deebed…”

  4. 寫:

  5. CPU -> 硬碟控制器:“請將此數據寫入塊 3452345:0xfce2c0deebed…”

  6. 硬碟控制器-> CPU:“完成”

這裡的塊號表示第 2354242 個 512 字節塊的名稱。

理論上,可以使用任何塊大小。大多數設備使用 512 字節塊,其中一些,特別是大型 HDD 使用 4096 字節塊。一些光學介質使用 2304 字節塊。

*重要的是:塊設備控制器不知道它上面的文件系統的任何內容。它只能在其塊大小中讀取和寫入塊到他的介質。這就是塊設備驅動程序用來為核心提供塊設備的東西:本質上是一個單一的大字節數組。*沒關係,它是如何分區的或哪個 fs 正在使用它。

文件系統塊大小是文件系統資料結構在文件系統中組織的塊大小。它是文件系統的內部特性,甚至不需要使用面向塊的資料結構,有些文件系統甚至不這樣做

Ext4 使用最典型的 4096 字節塊。

此外,磁碟 IO 數據通常不是由程序直接處理,而是由作業系統的虛擬記憶體處理。它廣泛使用分頁。VM 頁面大小通常為 4096 字節(在非 x86 CPU 上可能不同),由 CPU 架構決定。(例如,較新的 amd64 CPU 可以處理 2MB 頁面,或 dec alpha 使用 8192 字節頁面)。

優化數據IO,最好都是相乘,相等更好。這通常意味著:使用 4096 字節的 fs 塊。

這也很重要:如果您的塊設備已分區,則分區應該以精確的頁面大小開始/結束。如果您不這樣做,例如您的 sda1 從 sda 的 17. 塊開始,CPU 將不得不為所有頁面讀/寫操作發出兩個讀/寫命令,因為物理塊和文件系統塊將重疊.

在最常見的情況下,這意味著:所有分區都應從可被 8 整除的扇區開始或開始(4096 / 512 = 8)。

請注意,通常低級塊 IO 不會發生在單個塊讀/寫操作中,而是在單個命令中發送/接收多個塊。並且重新組織數據通常不是很大的成本,因為記憶體 IO 通常比塊設備 IO 快得多。因此,不遵循這些不會是一個很大的成本。

引用自:https://unix.stackexchange.com/questions/494360