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

Luc*_*tti 15 .net memory swap

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

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

Eri*_*lje 17

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

  • 如果它擅长它,我们会看到这么多应用程序花费几秒钟打开一个上下文菜单只是因为一些复制操作打开并阻止分页io? (2认同)

Ran*_*e42 12

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

如果您配置了此项,则还需要设置"调整进程的内存配额".

这个问题有点模棱两可,你想阻止哪些部分VM空间被换出?堆/堆栈/模块的?......?

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

你可以在这里IMAGE_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主机的过程中也没有 观察到页面错误.