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