当我有足够的可用内存时,为什么 Windows 10 会压缩内存?

当我有足够的可用内存时,为什么 Windows 10 会压缩内存?

(编辑:我被要求解释为什么我的问题不是这个问题。我以为从阅读这两个问题中原因就很明显了,但总结一下:我没有内存泄漏。我确切地知道是什么在使用我的内存。我想知道为什么当我的系统似乎有足够的内存将整个应用程序占用空间存储在未压缩的内存中时,Windows 会选择压缩我的内存(从而使用 CPU 周期并使我的系统变得缓慢且无响应)。)

我使用定制且占用大量内存的应用程序进行了大量科学/工程计算模拟。可能不是 8TB 超级计算机意义上的占用大量内存,而是“比 word/email/youtube 甚至 chrome 还要多”意义上的占用大量内存。从历史上看,我的工作集占用了 4-30 GB 的 RAM。

自周年更新以来,我的机器出现了严重的性能问题,在调查过程中,我注意到 Windows 似乎正在相当积极地压缩内存。例如,当打开特定模型时,我会遇到以下情况:

在此处输入图片描述

仅总结一下该屏幕截图中的相关要点:

  • 已使用 15388 MB 内存
  • 压缩了 6855 MB 的内存
  • 如果不压缩,将使用 16657 MB
  • 16.6 GB 可用内存
  • 总共 32 GB 内存

简而言之:如果我不压缩,据我所知,我的内存需求将是 15388-6855+16657 = 25190 MB。这比我的可用内存要少。

我经常注意到,在响应速度降低的时候,我的 CPU 会消耗大量内存进行压缩,就像这样: 在此处输入图片描述

我知道内存使用的概念非常模糊,因为有共享页面、保留内存、写时复制等功能,但对我来说,这种情况看起来只是在浪费 CPU 周期和系统响应能力。我希望不执行任何内存压缩,而是使用可用的 RAM。

我的问题是:

  • 我是否误解了某些东西,无法解释 Windows 10 所做的事情(因为当前的行为似乎不合理)?
  • 自周年更新以来,内存压缩的行为/策略是否有所改变?我之所以问这个问题,是因为我从更新后才开始遇到这些性能问题。
  • 有没有办法禁用内存压缩?我试过了这里描述的技术没有任何运气。

全面披露:这个问题的一个版本已发布到微软论坛但只收到了预设回复,因此我在此重新发布。

答案1

如果我想要讽刺的话,你问题的答案将是“因为 One Microsoft Way”,这似乎是他们的理念,而不仅仅是他们在雷德蒙德的公司总部地址。

简而言之,微软的开发人员认为他们最了解我们的计算机应该如何配置和使用,并且他们会不遗余力地将他们的“一刀切”选择强加给我们所有人。

内存压缩就是一个很好的例子。

我有一台配备 64 GB RAM 和 1 TB NVMe SSD 的工作站,我正在使用一款 3D 应用程序,该应用程序占用大量 RAM 来存储资源。启用内存压缩后,上述 3D 应用程序在加载这些资源时会明显变慢,其 UI 响应速度会降低,并且开始渲染需要更长时间,因为操作系统必须先解压缩刚刚压缩的数据,然后才能将其发送到视频 RAM。

然而,即使在具有大量 RAM 和快速 SSD 驱动器的系统(例如我的系统)上,内存压缩不仅默认启用,而且如果你敢于禁用它,它将在每次 Windows 10 功能升级后重新启用(我已禁用它,升级到 Windows 10 20H2 后再次启用它)。

所以我认为启用内存压缩的真正原因是微软员工的傲慢和无知。

答案2

我是否误解了某些东西,无法解释 Windows 10 所做的事情(因为当前的行为似乎不合理)?

2020 年 11 月内存压缩基准测试(重点是我自己加的):

重要提示 [...]启用内存压缩时,页面合并也会自动启用

这解释了“非理性”行为:我相信你可能被咬通过这种意外的选择,同时启用两个截然不同的功能(内存压缩和内存合并)。我猜你的测量结果与页面合并相匹配——这也发生在空闲期间,需要相关的 CPU 消耗。

自周年更新以来,内存压缩的行为/策略是否有所改变?我之所以问这个问题,是因为我从更新后才开始遇到这些性能问题。

我相信是的:使用 Windows 10 20H2 进行快速检查表明,仅启用内存压缩就可以起作用(通过Enable-MMAgentPowerShell 小程序),没有激活记忆合并。

有没有办法禁用内存压缩?我试过这里描述的技术,但没有成功。

所描述的技术使用简写命令(-mc而不是-MemoryCompression),虽然我已经检查过没有抛出错误,但它们是没有记录因此可能并不明智。

请在具有管理员权限的 PowerShell

  1. 显示内存压缩、页面合并等的当前状态
Get-MMAgent
  1. 禁用页面合并(如果已启用,这是我的建议True
Disable-MMAgent -PageCombining
  1. 禁用内存压缩(如果确实需要)
Disable-MMAgent -MemoryCompression
  1. 显示当前状态(再次确认/比较)
Get-MMAgent

相关内容