題 使用ext4緩存文件系統寫入多長時間?


不久之前,有一些關於ext4可能在不干淨的卸載後留下空文件的討論,總結得很好 在這篇文章中。基本上,由於分配延遲,寫入可以在寫入緩存中保留比ext日誌的默認提交間隔(5秒)長得多的時間。

這些問題似乎已在某個補丁中修復,該補丁在某些情況下會強制執行塊分配,從而在默認情況下最多5秒後將數據強制轉移到磁盤。

我想知道當應用程序覆蓋文件的現有部分時會發生什麼,而不會截斷或附加文件本身。是否會在5秒內強制進入磁盤?

這似乎與附加到文件的情況不同:在追加時,文件大小會發生變化,這是元數據的變化;因此,在5秒內需要提交日誌,並且由於data = ordered,由於安全問題,必須在此之前寫入數據(否則其他用戶的已刪除文件的部分可能會顯示給附加的所有者)文件)。

當只是覆蓋文件數據時,沒有理由為什麼數據寫入必須在元數據日誌提交之前發生,因為舊數據屬於與新數據相同的用戶。那麼寫入是在提交之前發生的,還是可以延遲比日誌提交間隔更長?如果是這樣,多久?

更新: 我知道在做正確的事情時,這一切都是無關緊要的,即使用fsync()。 (這是關於ext4和數據丟失的所有討論的主要原因 - 這個問題只關注應用程序而不是fsync(),或者不是在正確的時刻。)我不是在編寫我自己的應用程序,我問因為我不知道我的所有應用程序是否做了正確的事情,我想知道這種“危險”寫入的大致時間表。問的原因是我的圖形驅動程序經常導致內核恐慌,我想知道我是否要擔心超過最後5秒的數據寫入。


10
2017-09-25 13:46


起源




答案:


您可以將提交間隔設置為自定義值,我相信,該值可以高達32位無符號整數秒數;所以大約40億秒,或136年。這可以通過 commit mount選項,你可以按如下方式生效(這只是一個例子;你也可以設置它 fstab):

mount /dev/sda1 -t ext4 -o rw,data=writeback,nobh,commit=12345678

提交間隔不基於任何類型的條件,例如是附加數據還是覆蓋現有數據等。該 commit mount選項(如果你根本不提供mount選項,則默認為5秒)相當於在bash shell中執行類似的操作:

#!/bin/bash
while :
do
    echo "Syncing all uncommitted data and journal to disk"
    sync
    sleep 5
done

不要混淆 data=ordered 這個全局文件系統同步間隔(“提交間隔”對於我們這些了解命令行程序功能的人來說可能是一個不太有意義的術語 sync在這種情況下,它可能更好地命名為“同步間隔”)。 data=ordered是關於 訂購 其中數據和元數據更新(其中 data=writeback 是“不太安全/更快”和 data=journal 是“更安全/更慢”)。 commit=12345678 是關於文件系統驅動程序本身強制所有臟數據/日誌/元數據/完全同步到物理介質的頻率。如果你願意,你肯定可以把它設置為136年,然後安裝 data=writeback,nobh 和不打電話的程序 fsync() 要么 sync() 將有幾個生命週期內的髒頁面放在RAM中。

更新:根據你的問題編輯中的上下文,我會說你應該運行帶有掛載選項的文件系統 data=journal,commit=1 甚至與 sync mount選項,直到您能夠解決圖形驅動程序內核恐慌。這將保持最大的數據完整性,但代價是性能。如果您經常將數據寫入磁盤而不能丟失,那麼您尤其希望這樣做,如果您不“信任”您正在使用的應用程序,那麼這一點非常重要 fsync() 適當。

資源:  這裡 和個人經歷


13
2017-09-25 14:02



謝謝,“所有臟數據”部分正是我所擔心的!我擔心除了延遲分配之外還有更多的異常(即使在提交間隔之後也可能導致新數據保留在寫緩存中)。 - lxgr
我很確定延遲分配在調用時完全無關緊要 sync (或者,等效地,當觸發提交間隔計時器時)。在時間點的時候 sync 完成後,絕對沒有臟數據,元數據或日誌頁面。在同步數據傳輸期間對文件系統的任何更改都將被阻止,直到完成為止。 - Horn OK Please
真?在 bugs.launchpad.net/ubuntu/+source/linux/+bug/317781/comments/45 特別提到未提交的頁面不會在提交時寫入磁盤(當然在fsync()上)。該補丁通過強制分配修復了一些常見的情況,即該行為存在問題;然而,沒有任何關於覆蓋數據的說法。 - lxgr
啊,好吧 commit=... 和 sync 不等同?或者,即使有了一個,也確實意味著tytso sync 它沒有提交未分配的頁面?我無法想像是這樣的,因為它會違反POSIX規範。也許您可以使用我提供的bash腳本來提高數據安全性:P - Horn OK Please
我很確定他的意思是前者,後者會使Linux上的ext4成為一個非常危險的文件系統;)該腳本看起來像一個很好的解決方法;我會試一試,也許用strace評估一些我最重要的應用程序 - 也許他們都使用fsync(),而且我太擔心了...... - lxgr


無論你的問題的答案是什麼,都沒關係。

保證暴露 ext4文件系統的行為是“成功後數據將在光盤上 sync/fsync 因此,如果你有一個讓你提出這個問題的應用程序,你應該在需要確保數據完整性的關鍵點插入同步調用。如果你是一個擔心同樣問題的用戶,你可以調用 sync 在執行任何危險行為之前,命令行實用程序可能會導致不正常的關閉。


1
2017-09-25 13:52



我知道fsync();我要求作為可能使用或不使用它的應用程序的用戶。我已經更新了我的問題。 - lxgr