2012-04-21 59 views
2
  1. 我在linux 2.6內核上使用ext4。我有字節數組的記錄,其範圍可能從幾百到16MB不等。對於每個記錄,在使用write()的應用程序中是否有任何好處,而不是說緩存X MB,然後在X MB上使用write()?任何使用緩衝在linux ext4文件系統上寫入數據?

  2. 如果在緩衝中有好處,那麼ext4會有什麼好的價值。這個問題適用於在ext4中描述多塊分配器行爲的人。

  3. 我的理解是文件系統會緩衝大小爲pagesize的倍數並嘗試在磁盤上刷新它們。如果提供給write()的緩衝區比文件系統緩衝區大,會發生什麼?這是一種粗暴的方式來強制文件系統刷新到磁盤()

+3

即使緩衝內核調用的次數也可以有所作爲。這裏不太可能是個問題,但是1k x 1字節的寫入通常會比1 x 1k字節更差......當然,我選擇了極端值。 – 2012-04-21 23:44:09

回答

0

「正確」的答案取決於你真正想要做的數據。

write(2)被設計爲單行進入內核空間,並提供良好的I/O控制。但是,除非使用O_SYNC打開文件,否則數據僅進入內核的緩存,而不進入磁盤。 O_SYNC更改以確保文件被同步到磁盤。實際的寫入磁盤是由內核緩存發出的,ext4會嘗試分配一個大緩衝區來寫入,以最大限度地減少碎片,iirc。通常,使用緩衝或O_SYNC文件編寫(2)是控制數據是否進入內核或其是否仍在應用程序緩存中的好方法。

但是,對於寫入大量記錄,您可能會對寫入緩衝區列表中的數據的writev(2)感興趣。類似於write(2),它是一個原子調用(儘管當然只有在操作系統語義中,實際上不在磁盤上,除非再次使用直接I/O)。

相關問題