【发布时间】:2020-09-24 17:59:54
【问题描述】:
背景是开发DBMS内核,特别是数据库检查点处理。游戏规则是,我们需要等待文件上未完成的异步 IO 完成,然后再发出 fsync()。
我们部署的当前解决方案是手动计算运行中的异步 IO,等待此计数变为 0,然后再进行 fsyncing 或 FlushFileBuffer-ing。问题是我们是否真的必须这样做,也许内核/文件系统自己会这样做?
有问题的操作系统主要是 Windows 和 Linux,尽管我也很好奇基于 BSD 的操作系统如何处理这些问题。
在 Linux 上,我们使用 libaio 进行异步 IO。
【问题讨论】:
-
你几次异步调用写文件然后
FlushFileBuffers?但是你怎么能确定你打电话给FlushFileBuffers呢?拨打FlushFileBuffers时如何选择时间?所以我认为你无论如何都需要维护活动文件 I/O 的计数并在每次 I/O 完成后减少它,当计数变为 0 时 - 调用FlushFileBuffers(但不要在专用线程中等待)。问题甚至不在FlushFileBuffers的内部实现中,但无论如何你都需要在写完之后以某种方式调用它 -
嗯,这就是检查点的工作原理。这是一个或多或少简单的解释xaprb.com/blog/2011/01/29/how-innodb-performs-a-checkpoint 我知道我启动了脏缓冲池页面的所有写入,直到“LSN”,例如通过 IOCP、libaio、Windows 线程池 IO。在我将这个 LSN 写入检查点记录之前,我希望这些写入是持久的,而不是正在进行的。是的,问题是关于 FlushFileBuffers 的内部实现。处理 IO 的是操作系统,所以我很好奇。
-
你从单线程启动了所有脏页的写入,然后在它之后调用
FlushFileBuffers?我最初假设可以从任意工作线程写入更复杂的情况,然后FlushFileBuffers。如果全部来自单线程顺序 - 真正的问题只在FlushFileBuffers(CcFlushCache)实现 -
你在文件上使用缓存 I/O 吗?
-
无缓冲 IO。可能是多个线程。所有写入都是异步的,所以也许我是从一个线程还是多个线程启动它们并不重要。
标签: linux-kernel iocp windows-kernel aio fsync