Linux

linux系統是不是一塊一塊地把臟頁刷到磁碟上?

  • August 19, 2019

據我所知,在linux系統中,當修改文件內容時,頁面記憶體中包含文件內容的頁面會被標記為臟,最終會被刷新到磁碟。

我想知道的是,當這些頁面刷新到磁碟時,它們是否以塊的形式刷新?

例如,如果塊大小為 4kB,我需要刷新一些 1024kB 的內容,那麼磁碟是否寫入 1024 / 4 = 256 次?

這是一個相當複雜的話題,並且取決於磁碟、磁碟控制器和核心設置。

一般來說,核心會盡量提高效率。例如,如果您在一個可調整的時間視窗(通常是 30 秒左右)內多次更新同一個塊,並且沒有每次都明確強制同步到磁碟,那麼您的大部分寫入操作只會更新數據在記憶體中,只有最終結果才會真正進入磁碟。

如果您編寫一長串連續的塊,核心肯定會嘗試在儲存控制器和磁碟本身允許的盡可能少和盡可能大的塊中執行它。

核心的 I/O 調度程序還可以優化磁碟操作的順序以實現最有效的磁碟訪問。這種優化在虛擬機和 SSD 上幾乎是不相關的,因此可以關閉。(即使您以霰彈槍方式訪問隨機塊,SSD 也非常快;在虛擬機上,管理程序通常會根據整組虛擬機及其所有磁碟操作重做優化,因此嘗試在級別上進行微優化單個 VM 是浪費精力。)

某些磁碟可能對 I/O 操作大小有限製或建議:

# fdisk -l /dev/sdb
Disk /dev/sdb: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

例如,此 HDD 內部使用 4k 扇區大小,儘管它模擬傳統的 512 字節磁碟扇區。因此,指定了 4k 的最小 I/O 大小。

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