![DisablePagingExecutive 注册表更改是否有任何实际效果?](https://linux22.com/image/483183/DisablePagingExecutive%20%E6%B3%A8%E5%86%8C%E8%A1%A8%E6%9B%B4%E6%94%B9%E6%98%AF%E5%90%A6%E6%9C%89%E4%BB%BB%E4%BD%95%E5%AE%9E%E9%99%85%E6%95%88%E6%9E%9C%EF%BC%9F.png)
过去,在不同版本的 Windows(2000、XP 和 Vista)上,我在许多机器上启用了 DisablePagingExecutive 来尝试提高性能。在每种情况下,我都有足够的内存,在当前情况下尤其如此。但是,在启用此注册表调整并重新启动后,过了一会儿我检查了任务管理器,仍然显示内核的很大一部分被分页到磁盘,尽管我有 2GB 的可用物理内存。
有没有人成功使用过这个调整?曾经有?也许我在检查任务管理器时看到的是错误的指示器(性能选项卡 -> “内核内存”部分),但我想阻止 Windows 将所有可以分页到磁盘,尤其是考虑到如今台式机提供的内存量。似乎应该有一个“除非内存压力极大,否则不要分页到磁盘”选项 - 有这个选项吗?
答案1
互联网上关于此功能存在大量混淆。该设置仅影响内核中称为执行的部分,并且仅影响可分页的部分。内核的其他部分完全不受此设置的影响。
内核分页的工作方式与任何其他分页相同。经常访问的代码和数据将保留在 RAM 中,而其余部分将保留在磁盘上 - 这是它应该在的地方。除非系统找到了更好的用途,否则系统不会从 RAM 中删除内核的任何部分。Microsoft 已对分页系统投入了大量的研究和测试。
在内核上下文中,“非分页”表示在任何情况下都无法分页的代码和数据。“分页”表示必要时可以分页的代码和数据。无法从任务管理器中得知实际分页了多少。分页的代码中的一部分从未从磁盘读取过,因为当时还不需要它。并非所有内核都经常被访问。您不应期望分页和非分页数字会受到相关设置的影响。
注意:当代码被分页时,它通常不会被复制到页面文件。这是没有必要的,因为它可以简单地从原始文件中重新加载。这适用于大多数代码,而不仅仅是 kerenl。
如果 RAM 数量合理,此设置实际上不会起任何作用。它只是阻止系统调出它不想调出的数据。
答案2
我不确定您是否意识到了这一点,但页面错误是 Windows 用于加载可执行代码的机制。因此,例如,将 DLL 映射到虚拟内存,然后使用页面错误根据需要从磁盘进行实际加载。页面文件不参与其中。
因此,您所认为的很多“分页到磁盘”的内容可能首先就是磁盘上的内容。
答案3
只需添加此设置的另一个用途:xperf
堆栈遍历需要它。
http://blogs.msdn.com/b/pigscanfly/archive/2009/08/06/stack-walking-in-xperf.aspx
禁用寻呼执行程序
为了使跟踪在 64 位 Windows 上工作,您需要设置 DisablePagingExecutive 注册表项。这会告诉操作系统不要将内核模式驱动程序和系统代码分页到磁盘,这是使用 xperf 获取 64 位调用堆栈的先决条件,因为 64 位堆栈遍历依赖于可执行映像中的元数据,并且在某些情况下,xperf 堆栈遍历代码不允许触及分页的页面。
关于设置的另一条信息。这句话可以在互联网上找到,但我不知道它的主要来源。
DisablePagingExecutive 仅适用于 ntoskrnl.exe。它不适用于 win32k.sys(比 ntoskrnl.exe 大得多!)、其他驱动程序的可分页部分、分页池以及文件系统缓存。所有这些都位于内核地址空间中并分页到磁盘。在低内存系统中,这可能会强制应用程序代码不必要地分页并降低性能。如果您的 RAM 足以满足您的工作负载,是的,这不会造成影响,但话又说回来,如果您的 RAM 足以满足您的工作负载,系统无论如何都不会分页太多这些东西。此设置在调试驱动程序时很有用,通常建议仅在运行有限的知名应用程序集的服务器上使用
因此,我们可以得出结论,除了用法之外,xperf
它的好处并不明显:本质上它限制了一些“几乎随机”的东西的分页,进一步思考 -因此就会导致其他内容更频繁地被调出页面。
答案4
系统级组件(例如内核、执行程序和设备驱动程序)可以从两个池中分配内存。这两个池分别是分页池(可由内存管理器自行决定是否将其分页),以及非分页池(必须始终保留在 RAM 中)。开发人员可以根据自己的需要决定使用哪个池。建议尽可能使用分页池,因为这可以为系统内存管理器提供最大的灵活性。这两个池的大小都是有限的,尤其是在 32 位系统中,这些限制可能会造成问题。分页池要大得多。如果过度使用非分页池,则可能会达到大小限制,这将导致一些严重的系统问题。
任务管理器中标记为“分页”和“非分页”内核内存的项目显示了这些池的分配情况。它与实际分页的内存量的动态状态完全无关。“DisablePagingExceutive”注册表项会影响部分分页池的动态分页状态,因此其影响永远不会被 Ask Manager 显示。