我打算编写一个应用程序,尝试尽可能多地写入文件,以免丢失任何大量数据。它将每一个击键写入磁盘,包括微秒甚至纳秒计时。现在这听起来很多,但仍需要相当长的时间才能达到写入 GB 的数据。为了缓解问题,我计划使用输出流将此数据作为更新写入文件末尾,但之后我将立即刷新流。
现在使用 SSD,每次我写入数据时,它通常会在每次执行更新时写入不同的位置。我假设 OS/FS 只是将“扇区”发送到驱动器,并且它无法区分它们只是对文件末尾的更新。因此,这意味着即使更新很小,它肯定会将 SSD 磨损均衡固定在没有尽头的地方。
上述描述是否正确,我是否应该在应用程序中考虑合理的缓冲量?现代文件系统在写入 SSD 之前会缓存多少?或者 SSD 内部的缓冲会起到拯救作用吗?有没有人对这种用法进行过分析?
在这种情况下,操作系统应该缓冲您的写入并每隔几秒左右刷新一次。此外,大多数 SSD 都实施了某种有限形式的“安全”写入缓冲,以便在电源故障时不会丢失数据。请注意,大多数存储设备和操作系统以 4 KB 块运行,因此系统不会将单个字节写入磁盘。
也就是说,如果您的应用程序需要连续将少量数据写入磁盘,最好显式使用写入缓冲区,方法是实现您自己的缓冲区或使用适当的操作系统工具。每次磁盘写入都会在操作系统级别带来不小的开销,因此您应该写入内存缓冲区,该缓冲区以适当的时间间隔或当缓冲区达到一定大小(例如几十或几百 KB)时刷新。
如果您定期写入相当大的数据块,而不是覆盖磁盘上随机位置的数据(看起来您只是在写入连续的日志数据流),您不应该遇到过度的写入放大或降级表现。驱动器的磨损均衡在这里就可以了。