2010-09-20 18 views
14

我正在研究順序編寫大文件(並且根本不讀)的應用程序,並且我想使用posix_fadvise()來優化文件系統行爲。什麼posix_fadvise()參數指向順序文件寫入?

手冊頁中的函數描述表明最合適的策略是POSIX_FADV_SEQUENTIAL。但是,Linux實現描述懷疑:

在Linux下,POSIX_FADV_NORMAL將readahead窗口設置爲支持設備的默認大小; POSIX_FADV_SEQUENTIAL將此大小加倍,POSIX_FADV_RANDOM完全禁用文件預讀。

由於我只寫數據(可能覆蓋文件),我不期望任何readahead。我應該堅持使用我的POSIX_FADV_SEQUENTIAL還是使用POSIX_FADV_RANDOM來禁用它?

其他選項如POSIX_FADV_NOREUSE?或者也許根本不用posix_fadvise()來寫作?

回答

5

這一切都取決於您的數據的時間局部性。如果您的應用程序在寫入數據後不再需要數據,那麼可以使用POSIX_FADV_NOREUSE以避免寫入緩衝區緩存(與open()中的O_DIRECT標誌類似)。

+8

請注意,POSIX_FADV_NOREUSE沒有在Linux內核中實現。 – smoors 2012-06-20 12:02:56

0

至於寫入去,我認爲你可以只依靠操作系統磁盤IO調度程序來做正確的事情。

您應該記住,儘管posix_fadvise特別提供了有關未來文件使用模式的內核提示,但內核還提供其他數據來幫助解決。

如果您沒有打開文件進行讀取,那麼只需要在部分寫入時讀取塊。如果你將文件截斷爲0,那麼它甚至不需要那樣做(你說你正在覆蓋)。

32

大部分posix_fadvise()標誌(例如POSIX_FADV_SEQUENTIALPOSIX_FADV_RANDOM)都是關於預讀而不是書寫的提示。

Linus herehere關於獲得良好的順序寫入性能有一些建議。這個想法是把文件分成大(8MB)窗口,然後循環執行:

  • 寫出窗口N與write();
  • 請求異步寫入出的窗口n,其中sync_file_range(..., SYNC_FILE_RANGE_WRITE)
  • 等待寫出窗口的N-1與sync_file_range(..., SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE | SYNC_FILE_RANGE_WAIT_AFTER)
  • 掉落窗口N-1從頁緩存完成與posix_fadvise(..., POSIX_FADV_DONTNEED)

通過這種方式,頁面緩存中的數據永遠不會超過兩個窗口,但在填充下一部分時,仍然會讓內核將部分頁面緩存寫入磁盤。

+1

奇妙的是,這是我需要做utee(https:// github。com/aktau/utee)不會顛覆緩存但保持快速。謝謝! – Aktau 2014-08-08 19:51:51

相關問題