2013-10-18 58 views
5

我正在編寫一個在Linux和FreeBSD上運行的程序,並且我想確保當每個write()返回時,數據實際寫入物理設備上的文件,所以我的數據不會意外丟失(例如,電力丟失,過程意外中斷等)。O_DIRECT與Linux/FreeBSD上的O_SYNC

根據OPEN(2)手冊頁,在Linux(高於2.6)上,O_DIRECT是同步的,但可能存在性能問題;在FreeBSD上,O_DIRECT不能保證同步,也可能有問題。

因此,在Linux上,O_DIRECTO_SYNC保證同步寫入,但哪一個具有更好的性能?

在FreeBSD,以保證同步寫入,該選項具有最佳性能:(1)O_DIRECT + fsync()(2)O_DIRECT | O_SYNC或(3)單獨O_SYNC

+0

我認爲你根本無法比較這些,因爲它們是根本不同的東西(即使它們看起來像是做了類似的事情)。 – Damon

回答

5

對於當前的硬盤,有確保文件實際寫入磁盤,即使磁盤向操作系統報告寫入已完成!這是由於驅動器內置了緩存。

FreeBSD上,你可以通過kern.cam.ada.write_cache的sysctl設置爲0,這禁用此將降低寫入性能顯著。我最後一次測量它(ICH-7芯片組上的WDC WD5001ABYS-01YNA0硬盤,FreeBSD 8.1 AMD64),連續寫入性能(以dd if=/dev/zero of=/tmp/foo bs=10M count=1000測量)從75,000,000字節/秒降至12,900,000字節/秒。

如果您想確保您的文件已被寫入,

  • 使用sysctl kern.cam.ada.write_cache=0後跟camcontrol reset <bus>:<target>:<lun>禁用寫入緩存。
  • O_SYNC選項打開文件。

注:

  • 你寫性能比較(在HDD)現在絕對吸。
  • 不要使用sync選項安裝分區;這將導致所有 I/O(包括讀取)同步完成。
  • 請勿使用O_DIRECT。它會嘗試完全繞過緩存。這可能也會影響閱讀。
3

O_DIRECT基本上只存在於Oracle以繞過內核的緩衝區緩存層並執行其自己的緩存。它有不明確的語義,可以執行的讀取大小和對齊方式的任意限制,通常不應使用。 O_SYNC應該給你想要的效果,但是如果沒有底層文件系統對電源故障或崩潰有效,它仍然可能不足以滿足您的需求。

+0

謝謝。關於性能,哪一個性能更好,O_DIRECT還是O_SYNC? –

+0

除非你編寫你自己的緩存層(甚至可能),'O_DIRECT'具有糟糕的性能,因爲它每次都會從磁盤重新讀取數據。 –

相關問題