我可以告诉Windows不要换掉特定进程的内存吗?

时间:2009-06-24 15:15:38

标签: .net memory swap

有没有办法告诉Windows它不应该将特定进程的内存换成磁盘?

它是一个内存使用量相当大的.Net Windows服务。我有很多物理内存,但操作系统似乎将部分进程内存移动到页面文件中。

3 个答案:

答案 0 :(得分:17)

您可以使用VirtualLock来阻止将内存分页到磁盘,但我认为您最好让操作系统管理系统的内存。它非常擅长,我不会想到为什么操作系统将内容交换到磁盘,除非我真的知道我在做什么。

答案 1 :(得分:12)

默认情况下,即使您允许用户,默认情况下VirtualLock也会用完配额(默认情况下,“内存中锁定页面”的安全策略设置没有条目(甚至不是管理员))。

如果您对此进行了配置,则还需要设置“调整进程的内存配额”。

这个问题有点含糊不清,你想阻止VM空间的哪一部分被换掉?堆/堆栈/模块的?......?

总的来说,我过去使用过的一个解决方案是创建一个带有大部分的DLL,这个DLL是READ + WRITE,不可移动,如果需要的话,你也可以将它标记为EXECUTE和SHARED,但是我会将HeapCreate变成该模块的部分,允许我将其用作堆。

你可以查找确切的位来设置hereIMAGE_SCN_MEM_NOT_PAGED看起来就可以了。

如果您使用此位标记所有模块和部分的过程,Windows模块加载程序将不会对关联用户配额收费,或者要求在部署代码的每个系统上修改策略设置。您需要使用特殊垫片进行编码,以便访问您在这些NON_PAGEABLE dll中创建的HEAP。

这是一项工作,但过去它对我来说效果很好,我有额外的要求,要将内存共享到多个进程,这些进程基于同一地址。

我认为最简单的尝试是完全禁用您的页面文件。但在此之前,如果你使用Vista / 2008 + OS,你看到的交换可能是由于superfetch,它可以主动“调整”你的系统,假设在不久的将来你需要使用一个或另一个应用程序。其他一些简单的任务就是停止未使用的服务,如搜索,这可能会索引大量的文件,你也应该进入配置系统任务的“任务调度程序”,默认情况下大多数系统都有几十个默认动作将把所有Dr. Watson转储传输到MS,对驱动器进行碎片整理以及其他一些可能非常耗费内存的操作。

您可以回复更多细节以获得更好的答案...但另一个建议是简单地购买大型固态硬盘并专门用于交换,请注意这些在整体性能方面随着时间的推移而降低由于所有现有SSD技术常见的坏块映射而导致的大小。

我最近在他们的页面中遇到了一个名为"non-paged clr host"的codeplex项目:

  

实施从实施角度来看,   非分页CLR主机使用    SetProcessWorkingSetSize ,    SetProcessWorkingSetSizeEx (在Windows上   Server 2003及更高版本)和 VirtualLock   API确保分配内存   它被锁定在物理内存中。   请注意,使用上述API 可以    保证绝对肯定   不会发生分页;相反,它   最小化它发生的几率   非常特殊的场景。在一些   甚至,我们进行的负载测试   当整个系统陷入困境时   由于缺乏物理记忆,没有页面   在此过程中观察到缺陷   使用非分页CLR主机。

答案 2 :(得分:0)

您确定有问题的网页是否已从内存中逐出? VM子系统可能主动将脏页写入磁盘,而不会被驱逐,因此潜在的未来分配具有较低的延迟。

此外,如果系统正在执行大量IO,那么使用有问题的内存来缓冲而不是应用程序数据可能会更好,如Martin Pool所述