如何防止 Windows Server 2003 修剪进程的工作集?

如何防止 Windows Server 2003 修剪进程的工作集?

关于 Windows Server 2003 如何处理进程的工作集,我遇到了两个不同但相关的问题。

首先,在控制台会话上运行着 GUI 应用程序,其当其顶层窗口最小化时,工作集被修剪。我知道使用 GUI 运行服务器进程的情况相当不寻常,但这些是遗留应用程序,它们正在执行一些我无能为力的重要事情。

其次,有一个长期运行的数据库服务器,当客户端连接时,它会分配大量内存,但直到另一个客户端连接时才会动用这些内存。与此同时,几天后操作系统似乎认为这是修剪该进程工作集的充分理由。

在这两种情况下,都有足够的物理 RAM(比应用程序所需的多几 GB),所以我希望 Windows 不要修剪它们的工作集。是否有配置它的设置?这些都是第三方应用程序,因此更改内存分配或锁定内存中的页面都不是可行的选择。

答案1

您发布的文章包含您想要的所有信息,但我知道这不是您想听到的。

首先,我不知道您的应用程序是什么,它们做什么,为什么它们的工作集不被修剪如此重要,或者任何其他可能帮助您解决进程工作集行为所导致的问题的无关信息。在我看来,您有一个设计糟糕的应用程序,您必须支持它,而您正试图改变 Windows 的行为来弥补这个设计糟糕的应用程序。这是一种糟糕的情况,我很抱歉。

话虽如此,我会尽力回答你的问题:

你描述的是 Windows 设计中的一个基本、根本的机制。默认GUI 窗口上最小化按钮的行为将调用 ShowWindow(hWnd, SW_MINIMIZE),它会修剪进程的工作集 - 故事结束。

您正在使用的这个设计糟糕的应用程序的作者可以已选择拦截用户单击“最小化窗口”按钮时发生的 WM_SYSCOMMAND 消息,并调用 ShowWindow(hWnd, SW_SHOWMINIMIZED)(不修剪 WS)而不是 ShowWindow(hWnd, SW_MINIMIZE),但他们没有这样做。如果您无法联系此应用程序的开发人员并告诉他们再试一次,这次使用实际服务器应用程序,那么您就会陷入这种行为。

答案2

回复 Harry Johnston:不,没有页面文件并不能解决问题……

基本上,没有办法阻止 Windows 使用分页文件...当我说没有办法时..我的意思是没有办法..无论你多么不想这样做,它都会分页到磁盘。

如果您告诉从 Windows NT 到 8.1 的任何版本的 Windows 和/或它们的对应版本不要使用页面文件,猜猜当您开始接近内存耗尽时会发生什么?(我已经在每个桌面版和服务器版的 Windows 上都看到过这种情况)

Windows 似乎会锁定大约 5-10 秒。然后恢复,文件似乎可以正常工作。它做了什么?它只是在 Windows 所在的系统卷上创建了临时的紧急页面文件,并将继续使用它们,直到您重新启动系统。

它通常会在您弹出错误框的同时正确地执行此操作,提示您资源或内存不足(它应该只说内存,因为 64 位 Windows 上的系统资源现在几乎是无限的)....

事实上,禁用页面文件系统会给你带来更多问题,因为许多桌面和服务器应用程序都希望看到页面文件,并希望将内存调出。为什么?很简单,两个词:提交充电

当程序加载时,它可以随时请求内存,并希望内存可用。或者它可以在 32 位操作系统上分配最多 2GB 的用户模式内存,在 64 位操作系统上为 32 位应用程序分配 4GB,在 64 位操作系统上为 64 位应用程序分配最多 128TB 的用户模式内存

因此,如果您的服务器有 16GB 内存,并且您加载了一个数据库(并且它们中的大多数倾向于在内部使用自己的内存管理和缓存),它们通常会分配 1、2、4 甚至 8GB 内存.... 当然它可能在很长一段时间内都不需要 8GB... 但是您认为所有使用的内存将去哪里呢?Windows 不希望它停留在物理 RAM 中,应用程序也不希望。如果应用程序经过特殊编码以换出未使用的内存,它就会崩溃。如果没有编码... 那么就由 Windows 根据需要换出该内存... 但没有页面文件... 您就是在浪费 RAM... 在这种情况下... 没有交换文件将大大降低性能。

您不需要一个巨大的交换文件...但如果您的服务器有 16GB 内存...4GB 的交换文件是一个不错的数字...它不会太大而破坏驱动器...并且 Windows 可以根据需要交换页面,而对性能几乎没有影响。

Adobe Photoshop 是另一个占用大量内存的软件... 64 位版本无论你是否拥有它,都会占用 4GB 内存...当然,它一开始只会使用大约 512MB...但如果你开始处理大型图片,你很容易就会超过 4GB 的内存使用量...

最后,最好也更安全的做法是使用某种形式的分页文件……即使只有 512MB……再加上 512MB 可以保证在系统崩溃时至少可以获得最小的内核转储和错误转储。要进行完整转储,您需要 C: 上的页面文件(或 Windows 启动的位置)等于物理 RAM 才能进行完整内存转储(通常不需要,而且需要花费大量时间)

相关内容