禁用交换(页面文件)以确保所有内容都在内存中

时间:2012-07-14 10:47:21

标签: .net windows memory pagefile

我有几个需要真正内存的应用程序,它们消耗了很多。一个解决方案是将每个内存都放在应用程序LOCKED(VirtualLock)中,但由于应用程序是在.NET中,因此需要花费很多时间才能完成。

所以,我的问题是,是否禁用交换文件(我在机器上有大量的RAM)有效的策略,以确保一切都真的在内存中?

更新

让我再说一遍 - 我知道这可能是非常糟糕的做事方式,可能会破坏整个操作系统的操作,但是,我将承担全部责任并应对后果,只想知道我的意思遇到问题。

以下是其他StackExchangers对此的看法:https://serverfault.com/questions/23621/any-benefit-or-detriment-from-removing-a-pagefile-on-an-8gb-ram-machine

3 个答案:

答案 0 :(得分:2)

有一件事你不能通过这样做强制进入内存:可执行图像和映射文件。这些是他们自己的每个“页面文件”。当内存压力发生时,Windows检测到它们在内存中的页面尚未被修改,只是丢弃这些页面,因为它们可以在以后重新加载。

没有文件支持的所有东西都无法被分页(没有地方可以放置它)。所以我猜你的技术会在实践中发挥作用。

你不会看到很多问题。我一直在运行没有分页文件(16GB RAM)。在蓝屏的情况下,您无法捕获完整的内存转储,但很可能您不需要它。

确保您从未达到物理内存限制,否则很多程序都会崩溃。没有人编写他们的程序来应对OOM情况(除了我从未见过的核心Windows组件崩溃。他们做得很好。)。

答案 1 :(得分:1)

  

我只需要确保我的数据始终在内存中

但是在内存中存储数据有什么用处,而不是访问它所需的代码?您可以确定您的数据在RAM中,但您无法确定代码是否存在。当需要重新编写代码时,您将产生完全相同的延迟。第一组候选者是.NET框架程序集,它们被预先设置(“ngen-ed”)并由其* .ni.dll支持文件。你可以做些什么,你可以从GAC目录中删除它们(c:\ windows \ assembly \ gac_64和gac_msil目录)。您支付的价格是一个明显放慢的热启动,并且当您运行多个.NET程序时不会共享。下一组候选者是Windows操作系统DLL。你无能为力。

另一件令人烦恼的事情是文件系统缓存。随着RAM使用量的增加,缓存会缩小。这将显着减慢磁盘访问速度。特别是如果它们无法缓存,从几微秒到几秒钟,写入速度会非常慢。

当您的RAM使用率高度可预测且远低于限制并且您只在计算机上运行一个程序时,这可能不是实际问题。您必须对其进行监控以确保是这种情况。不得不担心RAM显着地失去了购买大量内存的目的。特别是当您无法保证禁用分页文件时实际上会购买任何东西。

答案 2 :(得分:1)

我尝试禁用页面文件。它没有结束......

我只是说我做了一个疯狂的追逐。禁用页面文件给磁盘i / o带来了极大的压力,现在已经完成了所有的工作。

总结:就我而言,拥有Windows平衡文件缓存/应用程序内存使用率是明显的赢家。