2013-08-20 38 views

回答

2

直接I/O將是一個糟糕的選擇,原因如下:

  • 對於AOF,我們需要從FSYNC操作去相關的寫操作,因爲他們可能不會在同一個線程發生。使用直接IO時不能這樣做。

  • 對於AOF重寫和RDB,使用stdio(緩衝IO),因爲會寫入很多小對象。我不認爲你可以和stdio一起使用O_DIRECT(有附加到O_DIRECT的約束...)。要使用直接IO,我們必須在低級API的基礎上編寫自己的緩衝系統。

  • O_DIRECT不適用於所有文件系統,並且不可移植。

  • 有時緩衝區緩存實際上是有用的。例如,當一個從機連接到主機時,它將請求一個RDB轉儲,然後讀取該轉儲。如果沒有緩衝區緩存,此操作將生成I/O的兩倍。

  • 通常,轉儲文件比內存中的數據小得多。在很多情況下,你不會像你想象的那樣獲得更多收益。

雖然O_DIRECT可能是不適合的Redis一個很好的解決方案,使用帶有POSIX_FADV_DONTNEED選項posix_fadvise可能是在某些情況下是有用的。過去,我對RDB轉儲進行了簡單的實現。

相關問題