|
|
1
4
请注意,默认情况下,Linux和Mac OS的fsync和fdatasync不正确。默认情况下,Windows是正确的,但可以为了基准测试而模拟Linux。 此外,如果附加到文件结尾,fdatasync会发出多个磁盘写入,因为它需要用新的长度更新文件inode。如果您希望每次提交一次写入,最好的办法是预先分配日志空间,在提交标记中存储一个日志条目的CRC,并在提交时发出一个FDataSync()。这样,无论操作系统/硬件在背后重新排序多少,您都可以找到实际命中磁盘的日志的前缀。 如果您想使用日志进行持久提交或提前写入,事情会变得更加困难,因为您需要确保fsync实际工作。在Linux下,您将希望使用hdparm禁用磁盘写缓存,或者使用barrier设置为true安装分区。[编辑:我坚持更正,屏障似乎没有给出正确的语义。SATA和SCSI引入了许多原语,例如写屏障和本机命令队列,使操作系统能够导出启用提前写入日志记录的原语。从我从manpages和在线上可以看出,Linux只向文件系统开发人员公开这些内容,而不向用户空间公开。] 自相矛盾的是,禁用磁盘写缓存有时会导致更好的性能,因为您可以在用户空间中获得对写调度的更多控制;如果磁盘对一系列同步写请求进行排队,则最终会向应用程序暴露奇怪的延迟峰值。禁用写缓存可以防止这种情况发生。 最后,实际系统使用group commit,并在并发工作负载下对每个commit执行<1同步写入。 |
|
|
2
1
无法保证块刷新到磁盘的顺序。如今,即使是驱动器本身也可以在去盘片的路上重新订购块。
如果要强制执行排序,至少需要
|