检测不干净的文件系统关闭
Detect unclean filesystem shutdown
我有一个项目,我们使用内存映射文件处理大量缓存数据。我们使用 Windows 10、NTFS 和 .NET。
当用户启动应用程序时,我们会检测上一个程序会话是否正确关闭,如果是,我们会重用缓存。
但是,这对开发者调试时是一个痛苦。只是停止正在调试的程序是很常见的。下次启动时需要重新计算缓存数据,耗时且烦人
所以,我们一直在想我们可以引入一个'transaction log',这样即使之前的关机是不干净的,我们也可以恢复。
现在解决实际问题。
似乎无法保证刷新内存映射文件的顺序。如果程序刚刚停止,则没有问题,因为整个内存映射文件将被操作系统刷新到磁盘。如果停电,问题就来了。在这种情况下,无法保证文件处于什么状态。我们的“事务日志”也无济于事,除非我们总是在修改缓存之前将事务日志刷新到磁盘。这将违背我们架构的目的,因为它会带来不可接受的性能损失。
如果我们能以某种方式知道磁盘上的内存映射文件之前处于 OS 未在操作系统关闭前刷新所有页面的状态,我们可以直接丢弃整个文件在下次启动时离开。会有延迟,但完全可以接受,因为它只会发生在停电或类似事件之后。
操作系统启动时,它知道文件可能已损坏,因为它知道文件系统没有完全卸载。
最后,我的问题:
有什么方法可以询问 Windows 挂载时文件系统是否干净?
NTFS 会定期提交自己的日志,因此 window 可能会发生电源故障,并且 NTFS 会(正确地)声明卷(如“NTFS DATA”而不是用户数据)是干净。
您可能必须执行数据库所做的操作,即将缓存锁定到物理内存中,以便您可以控制写入磁盘。
我有一个项目,我们使用内存映射文件处理大量缓存数据。我们使用 Windows 10、NTFS 和 .NET。
当用户启动应用程序时,我们会检测上一个程序会话是否正确关闭,如果是,我们会重用缓存。
但是,这对开发者调试时是一个痛苦。只是停止正在调试的程序是很常见的。下次启动时需要重新计算缓存数据,耗时且烦人
所以,我们一直在想我们可以引入一个'transaction log',这样即使之前的关机是不干净的,我们也可以恢复。
现在解决实际问题。
似乎无法保证刷新内存映射文件的顺序。如果程序刚刚停止,则没有问题,因为整个内存映射文件将被操作系统刷新到磁盘。如果停电,问题就来了。在这种情况下,无法保证文件处于什么状态。我们的“事务日志”也无济于事,除非我们总是在修改缓存之前将事务日志刷新到磁盘。这将违背我们架构的目的,因为它会带来不可接受的性能损失。
如果我们能以某种方式知道磁盘上的内存映射文件之前处于 OS 未在操作系统关闭前刷新所有页面的状态,我们可以直接丢弃整个文件在下次启动时离开。会有延迟,但完全可以接受,因为它只会发生在停电或类似事件之后。
操作系统启动时,它知道文件可能已损坏,因为它知道文件系统没有完全卸载。
最后,我的问题:
有什么方法可以询问 Windows 挂载时文件系统是否干净?
NTFS 会定期提交自己的日志,因此 window 可能会发生电源故障,并且 NTFS 会(正确地)声明卷(如“NTFS DATA”而不是用户数据)是干净。
您可能必须执行数据库所做的操作,即将缓存锁定到物理内存中,以便您可以控制写入磁盘。