-->

我可以告诉Windows不换出一个特定进程的内存吗?(Can I tell Windows not

2019-06-24 02:34发布

有没有一种方法来告诉Windows,它不应该换出一个特定进程的内存到磁盘?

它的一个.net窗口服务具有相当大的内存使用情况。 我得到了很多的物理内存,但是操作系统似乎反正这一进程的内存页面文件的一部分。

Answer 1:

您可以使用VirtualLock以防止内存被分页到磁盘,但我真的觉得你离让OS管理系统的内存更好。 这是很擅长,我不会第二猜测为什么该操作系统是交换的东西到磁盘,除非我真的知道我在做什么。



Answer 2:

VirtualLock默认会在匆忙用完配额的,即使你权限的用户(默认情况下的“锁定内存页”安全策略设置没有条目(甚至没有管理员))。

如果你配置此,你将需要设置“调整内存配额过程”也。

这个问题是有点暧昧,什么虚拟空间的一部分,你要被换出,以防止? 堆/堆栈/模块的?......?

总体来说,我已经在过去使用的一个解决方案是创建一个带有大段这是读+写,不可移动一个DLL,你也可以将其标记EXECUTE和共享如果需要的话,但我会HeapCreate到该模块的部分,让我把它作为一个堆。

你可以看一下确切位的设置在这里 , IMAGE_SCN_MEM_NOT_PAGED看起来像它会做的伎俩。

如果你通过标记所有的模块和部分与该位的过程中,在Windows加载器模块将不收取关节用户配额或需要策略设置的每个系统部署你的代码上进行修改。 你需要在一个特殊的垫片,以代码来提供访问您制作到这些NON_PAGEABLE DLL的HEAP的也是。

这是一个工作位,但它在过去的工作很适合我,我有添加的需求共享内存的多个进程,这是基于在同一个地址。

我想尝试将完全禁用页面文件最容易的事情。 而在此之前,如果您使用的是Vista / 2008 +操作系统的,对换,你看到的可能是由于SuperFetch能,这可能是主动“调整”与在不久的将来,你需要使用一个应用程序或其他假设您的系统。 其他一些简单的任务将停止未使用的服务,如搜索,这可以被索引文件的巨额资金,也有与默认的大多数系统几十你应该进入你的“任务计划程序”,它配置的系统任务,默认情况下行动的,将传输所有的Dr. Watson转储对MS,碎片整理您的驱动器和其他一些可能非常内存密集型操作类型。

你可以用更详细一点回复得到一些更好的答案......但另一个建议是简单地购买大量的固态驱动器,并使用专门用于交换,提防这些随着时间的推移在整体性能上的尺寸,因为坏块映射配备所有现有的SSD技术常见。

我最近碰到一个叫做CodePlex项目“非分页CLR主机” ,从他们的网页:

实现从实现的角度来看,非分页CLR主机使用SetProcessWorkingSetSize,SetProcessWorkingSetSizeExVirtualLock的API(在Windows Server 2003及以上),以确保它分配被锁定到物理内存的内存。 请注意,使用上述API 绝对肯定不会出现传呼保证 ; 相反,它最大限度地减少它的发生非常特殊的情况下胜算 。 在我们已经进行了一些负载测试,即使系统作为一个整体缺乏物理内存挤兑, 是在这个过程中使用非分页CLR主机没有 发现 页面 错误



Answer 3:

你肯定是有问题的网页正在从内存驱逐? 这有可能是VM子系统正在积极脏页写入磁盘,没有驱逐,使潜在的未来分配具有更低的延迟。

另外,如果系统正在做大量IO的,它可能是更好性能使用存储在问题为缓冲器,而不是应用程序数据,如由马丁普尔



文章来源: Can I tell Windows not to swap out a particular processes’ memory?
标签: .net memory swap