假设你正在构建一个日志/预写日志记录存储系统。你能简单地通过(每个事务)附加的数据(与写入(2)),附加的提交标记,然后FSYNC-ING实现此?

要考虑的情况是,如果你做一个大组写入到该日志然后FSYNC它,并有一个失败的的FSYNC 的过程中。是这个inode直接/间接块的指针清空所有数据块被刷新后,才,还是有不保证块为了被刷新?如果是后者,那么在恢复期间,如果你看到在文件的最后一个提交标记,你不能相信它和以前的数据提交标记是有意义的。因此,你必须依靠另一种机制(涉及至少另一个FSYNC),以确定该日志文件的什么程度是一致的(例如,写入/ fsyncing中的数据,然后写/ fsyncing的提交标记)。

如果它有差别,主要是想了解EXT3 / EXT4作为上下文

有帮助吗?

解决方案

请注意linux的和Mac OS的FSYNC和fdatasync默认情况下不正确。窗口在默认情况下是正确的,但可以模拟Linux的基准目的。

此外,fdatasync问题多盘,如果你附加到文件的末尾写道,因为它需要更新与新长的文件的inode。如果你想拥有每犯一个写,你最好的办法是预先分配的日志空间,在提交标记存储日志条目的CRC,并发出在提交的单一fdatasync()。这样一来,无论多少你背后的OS /硬件重新排序,你可以找到的日志竟然打盘的前缀。

如果您想使用日志耐用提交或提前写,事情变得更难,因为你需要确保FSYNC实际工作。在Linux下,你会想用hdparm禁用磁盘写入缓存,或者安装有屏障设置为true的分区。 [编辑:我站在纠正,障碍似乎并没有给出正确的语义。 SATA和SCSI引进一批原语,比如写障碍和本机命令排队,这有可能使操作系统导出元,使预写日志的。从我可以从手册页告诉我们,在网上,仅适用于Linux公开这些与文件系统的开发,而不是用户空间。

奇怪的是,禁用磁盘写入缓存有时会导致更好的性能,因为你得到了用户空间写调度更多的控制;如果磁盘队列了一堆同步写入请求的,你最终会露出奇怪的延迟高峰到应用程序。禁用写高速缓存防止这种情况的发生。

最后,实际系统使用组提交,并做<1个同步写入与每并发工作负载提交。

其他提示

有一个在其中块被刷新到磁盘的顺序没有保证。这些天甚至驱动器本身可以重新排序的道路上的盘片块。

如果您想强制排序,你需要你想订购的写操作之间至少fdatasync()。所有同步的承诺是的当它返回的,一切都在同步之前编写已达到存储。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top