Windows中文件系统的数据同步行为

在Linux中,挂载支持commit选项,在mount(8)手册页中描述为:

 commit=nrsec Sync all data and metadata every nrsec seconds. The default value is 5 seconds. Zero means default. 

在Windows中,回写式caching只有在存储Policies Removal policy设置为Better performance才能起作用。 我们假设它已打开。

有没有什么办法可以像在Linux中一样调整Windows中的写入caching行为?


commit选项旁边的Linux中,挂载的文件系统types必须支持才能生效,还有一些重要的虚拟机设置可以创build与写回caching行为相关的附加约束条件,并且可以通过将新值附加到/proc/sys/vm/目录下的/ proc / sys / vm / *文件中描述:

  • dirty_background_bytes

    包含pdflush后台写回守护程序将开始写回的脏内存量。

    注意: dirty_background_bytesdirty_background_bytes的对应物。 一次只能指定其中一个。 当一个sysctl被写入时,它立即被考虑到评估脏的内存限制,另一个在读取时显示为0。

  • dirty_background_ratio

    包含占总系统内存的百分比, pdflush后台写回守护进程将开始写出脏数据的页数。

  • dirty_bytes

    包含生成磁盘写入的进程本身将开始写回的脏内存量。

    注意: dirty_bytesdirty_bytes的副本。 一次只能指定其中一个。 当一个sysctl被写入时,它立即被考虑到评估脏的内存限制,另一个在读取时显示为0。

    注意:dirty_bytes允许的最小值是两页(以字节为单位)。 任何低于此限制的值都将被忽略,旧的configuration将被保留。

  • dirty_expire_centisecs

    这个可调参数用于定义脏数据的大小,以便有资格由pdflush守护进程写出 。 它以百分之一秒表示。 在内存中已经被脏了的时间比这个时间间隔更长的数据将在下一次pdflush守护进程唤醒时被写出。

  • dirty_ratio

    包含占总系统内存的百分比,生成磁盘写入的进程本身将开始写出脏数据的页数。

  • dirty_writeback_centisecs

    pdflush回写守护进程将周期性地唤醒并将“旧”数据写入磁盘。 这个可调参数表示这些唤醒之间的间隔,在百分之一秒内。

    将其设置为零将禁止周期性回写。

(事实上​​, pdflush线程在Linux中不再可用,因为几年前它们被每个支持设备信息的冲洗线程取代,但是它很微妙。您可以在LWN.net文章中阅读更多关于它的文章。感兴趣。)

为了完整起见,Linux内核v3.2中的当前默认值是(在debian wheezy上检查):

 /proc/sys/vm/dirty_background_bytes:0 /proc/sys/vm/dirty_background_ratio:10 /proc/sys/vm/dirty_bytes:0 /proc/sys/vm/dirty_expire_centisecs:3000 /proc/sys/vm/dirty_ratio:20 /proc/sys/vm/dirty_writeback_centisecs:500 

Windows是否为其虚拟机子系统或每个驱动器/分区提供类似的设置?

我可以告诉你,你将无法configuration标准的微软存储驱动程序的粒度。

这是一个难题,因为内存pipe理器和cachingpipe理器以及Windows中的磁盘系统都在不断地发展。 对于Windows 2000的build议可能与Windows 2003无关,可能与Windows 2008等无关。此外,您还可以使用SQL Server等应用程序,其中包含完全不受影响的全面的cachingpipe理器,或对操作系统文件系统caching所做的任何更改都会发生不可预知的反应。 最重要的是,如果您使用的是第三方存储驱动程序,那么这是一种function。 您可以假定,Microsoft提供的驱动程序比通过Intel或HP获得专用于其硬件的驱动程序更通用,因此可configuration性更低。 许多供应商驱动程序要求禁用Windows写caching以启用自己的写caching等。

所有这一切说,我可以帮助你。 既然你没有指定Windows的版本,就像我说过的那样,registrypath和值和function之类的东西可以完全改变Windows版本,我只是假设2008R2 / Win7。

从这篇MS文章 :

默认情况下,Windows将caching从磁盘读取并写入磁盘的文件数据。 这意味着读取操作将从系统内存中的一个区域(称为系统文件caching)读取文件数据,而不是从物理磁盘读取文件数据。 相应地,写操作将文件数据写入系统文件caching而不是写入磁盘,这种types的caching被称为写回caching。 caching是按文件对象pipe理的。

高速caching是在高速cachingpipe理器的指导下进行的,高速cachingpipe理器在Windows运行时不断运行。

当我改变Windows设备pipe理器中的“在设备上启用写caching”和“closuresWindows写caching缓冲区刷新”这些checkbox时,这些更改反映在HKLM\SYSTEM\CurrentControlSet\Enum\<IDE>\<DiskName>\<Serial Number>\Device Parameters\Disk\CacheIsPowerProtected = 1中的registry值中HKLM\SYSTEM\CurrentControlSet\Enum\<IDE>\<DiskName>\<Serial Number>\Device Parameters\Disk\CacheIsPowerProtected = 1等我放在括号中的值是variables。

但是我离题了。 你想改变文件caching的行为。 如或多或less冲洗。

你说你对API调用感兴趣,这很好,因为我认为你会对Microsoft Windowsdynamiccaching服务感兴趣。 我认为这是由这家伙写的。 包含示例源代码。

Win7 / 2008R2的一个警告:

Windows 7和Windows Server 2008 R2操作系统中的内存pipe理algorithm已更新,以解决在以前版本的Windows中发现的许多文件caching问题。 当您需要在运行Windows 7或Windows Server 2008 R2的计算机上实施此服务时,只有某些特殊情况。

本质上,您将使用SetSystemFileCacheSize() Win32 API函数。 看一下这个:

MinimumFileCacheSize [in]

文件高速caching的最小大小(以字节为单位)。 虚拟内存pipe理器试图保持驻留在系统文件caching中的这么多内存。

要刷新caching,请指定(SIZE_T)-1。

这意味着你可以随意刷新caching,无论任何时间表请取悦你。

祝你好运!