2012-01-18 67 views
4

我正在爲C編寫Linux 2.6.X內核的自定義數據庫引擎,我需要知道用O_DIRECT標誌打開的文件的write()系統調用的最小寫入大小是多少?在文檔中說它自Linux 2.6內核版本起可以使用512字節塊。但是,如果我的硬盤使用8K塊呢?在這種情況下它會在寫入時返回EINVAL錯誤嗎?我聽說512字節扇區的磁盤已經過時,新磁盤使用8K扇區,所以我需要確保當用戶在這種磁盤上嘗試時,我的應用不會崩潰。 如果可以在8k扇區的磁盤上使用512字節的寫入,當我寫入時會發生什麼情況,比如2個512字節的數據塊,linux內核是否從磁盤讀取8k扇區,替換我告訴它的1k數據塊寫入8k扇區然後寫回磁盤?這會很慢!最小寫入大小與O_DIRECT

另外,我還有一個關於這個問題的問題,如果在打開文件時使用原始設備或ext3文件系統,最小寫入大小是否會有所不同?

+1

據我所知,沒有最小尺寸。如果您願意,您可以一次寫入一個字節,但在這種情況下性能會很差。最佳寫入可能是磁盤塊大小的多倍。 – 2012-01-18 14:25:07

+0

http://stackoverflow.com/a/8803741/841108是一個非常相關的問題的答案。我建議寫64k字節。也許可以進行配置,因爲最佳尺寸取決於系統和硬件。 – 2012-01-18 15:03:59

+0

「據我所知,沒有最小尺寸」< - 這是不正確的。我只編寫了一個寫例程,它返回EINVAL,因爲寫入大小不是512字節的倍數 – Nulik 2012-01-18 15:54:42

回答

-1

略OT改變,「我聽說有512字節扇區磁盤正在變得過時,新磁盤使用8K扇區,「 - 那裏有8K扇區磁盤。我相信較新的磁盤使用4K扇區大小,也稱爲高級格式化磁盤。 8K扇區磁盤正在考慮未來,但我懷疑是否有任何製造商已與他們出來

關於您的查詢,我認爲它的磁盤的扇區大小。所以,如果你有一個4K磁盤,你需要發出4K大小的讀/寫。在O_DIRECT的情況下,讀/寫直接傳遞到磁盤,並且磁盤可以按粒度讀取/寫入扇區大小(由磁盤報告的邏輯塊大小)