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

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 中,只有当您在存储中Removal policy设置为时,写回缓存才能工作。我们假设它已打开。Better performancePolicies

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


在 Linux 中commit,除了必须由挂载的文件系统类型支持才能生效的选项外,还有一些重要的 VM 设置,这些设置会对写回缓存行为创建额外的约束,可以通过将新值回显到/proc/sys/vm/目录中的特定文件来更改,如/proc/sys/vm/* 的文档作为:

  • dirty_background_bytes

    包含脏内存量,此时pdflush后台写回守护进程将启动写回。

    注意:dirty_background_bytes是 的对应项dirty_background_ratio。一次只能指定其中一个。写入一个 sysctl 时,会立即将其考虑用于评估脏内存限制,而读取时另一个将显示为 0。

  • dirty_background_ratio

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

  • dirty_bytes

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

    注意:dirty_bytes是 的对应项dirty_ratio。一次只能指定其中一个。写入一个 sysctl 时,会立即将其考虑用于评估脏内存限制,而读取时另一个将显示为 0。

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

  • dirty_expire_centisecs

    此可调参数用于定义脏数据何时足够旧,可供pdflush守护进程。以百分之一秒为单位表示。内存中脏数据超过此间隔的时间将在下次写入时写出pdflush守护进程醒来。

  • dirty_ratio

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

  • dirty_writeback_centisecs

    pdflush写回守护进程将定期唤醒并将“旧”数据写入磁盘。此可调参数表示这些唤醒之间的间隔,以百分之一秒为单位。

    将其设置为零将完全禁用定期写回。

(实际上pdflushLinux 中不再提供线程,因为几年前它们已被每个备份设备信息刷新线程取代,但这很微妙。您可以在 LWN.net 文章中阅读更多内容清除 pdflush如果你有兴趣的话。

为了完整起见,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 是否为其 VM 子系统或可能基于每个驱动器/分区公开任何类似的设置?

答案1

我可以立即告诉你,你将无法使用以下方式配置标准 Microsoft 存储驱动程序粒度。

这是一个很难回答的问题,因为 Windows 中的内存管理器、缓存管理器和磁盘系统都在不断发展。您为 Windows 2000 获得的建议可能与 Windows 2003 无关,而后者又可能与 Windows 2008 无关,等等。除此之外,您还拥有 SQL Server 等应用程序,它们本身具有全面的缓存管理器,可能完全不受您对操作系统文件系统缓存所做的任何更改的影响,或者对它们做出不可预测的反应。最重要的是,如果您使用第三方存储驱动程序,这种功能将被它接管。您可以假设 Microsoft 提供的驱动程序比您可能从 Intel 或 HP 获得的专用于其硬件的驱动程序更通用,因此可配置性更差。许多供应商驱动程序要求禁用 Windows 写入缓存,以便启用它们自己的写入缓存等。

尽管如此,我可能能够帮助您。由于您没有指定 Windows 的版本,而且正如我所说,注册表路径、值和功能等内容在 Windows 的不同版本之间可能会完全改变,因此我假设是 2008R2/Win7。

由此MS 文章

默认情况下,Windows 会缓存从磁盘读取并写入磁盘的文件数据。这意味着读取操作从系统内存中称为系统文件缓存的区域读取文件数据,而不是从物理磁盘读取。相应地,写入操作将文件数据写入系统文件缓存而不是磁盘,这种类型的缓存称为写回缓存。缓存按文件对象进行管理。

缓存在缓存管理器的指导下进行,缓存管理器在 Windows 运行时持续运行。

当我在 Windows 设备管理器中更改“在设备上启用写缓存”和“关闭 Windows 写缓存缓冲区刷新”复选框时,这些更改会反映在注册表值HKLM\SYSTEM\CurrentControlSet\Enum\<IDE>\<DiskName>\<Serial Number>\Device Parameters\Disk\CacheIsPowerProtected = 1等中。我放在括号中的值是变量。

但我离题了。您想改变文件缓存的行为。例如使其刷新频率更高或更低。

你说你对 API 调用感兴趣,这很好,因为我认为你会对Microsoft Windows 动态缓存服务。我认为它是由这家伙. 包含示例源代码。

Win7/2008R2 的警告:

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

本质上,你将使用设置系统文件缓存大小()Win32 API 函数。请查看:

MinimumFileCacheSize [输入]

文件缓存的最小大小(以字节为单位)。虚拟内存管理器尝试在系统文件缓存中保留至少这么多的内存。

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

这意味着您可以按照您喜欢的任何时间表随意刷新缓存。

祝你好运!

相关内容