我計劃編寫一個應用程序,嘗試盡可能多地寫入文件,以免丟失任何大量資料。它將把每個擊鍵(包括微秒甚至奈秒的計時)寫入磁碟。這聽起來好像很多,但要達到寫入 1 GB 的資料還需要相當多的時間。為了緩解問題,我計劃使用輸出流將此資料作為更新寫入檔案末尾,但之後我將立即刷新該流。
現在使用 SSD,每次寫入資料時,每次執行更新時,通常都會寫入不同的位置。我認為作業系統/FS 只是將“扇區”發送到驅動器,並且它無法區分它們只是對文件末尾的更新。因此,這意味著即使更新很小,也肯定會讓 SSD 磨損均衡永無止境。
上述描述是否正確?現代檔案系統在寫入 SSD 之前會自行快取多少?或者 SSD 本身內部的緩衝會起作用嗎?有人對這種用法進行過分析嗎?
答案1
在這種情況下,作業系統應該緩衝您的寫入並每隔幾秒鐘左右刷新它們。此外,大多數 SSD 都實現了某種有限形式的「安全性」寫入緩衝,以便在斷電時不會丟失資料。請注意,大多數儲存裝置和作業系統都以 4 KB 區塊運行,因此系統不會將單一位元組寫入磁碟。
也就是說,如果您的應用程式需要連續將少量資料寫入磁碟,最好透過實作您自己的緩衝區或使用適當的作業系統工具來明確使用寫入緩衝區。每次磁碟寫入都會在作業系統層級帶來相當大的開銷,因此您應該寫入以適當的時間間隔或當緩衝區達到一定大小(例如數十或數百 KB)時刷新的記憶體緩衝區。
如果您定期寫入相當大的資料區塊,並且不覆蓋磁碟上隨機位置的數據,並且看起來您只是寫入連續的日誌資料流,那麼您不應該遇到過度的寫入放大或效能下降表現。驅動器的磨損均衡在這裡效果很好。