答案1
通过进入services.msc
(通过Win+R)并禁用 Superfetch 可以完全解决这个问题。我不确定 Superfetch 是否已经损坏,还是“设计使然”。
此外,显然删除页面文件也会有同样的效果,但上述解决方案是更安全赌注。
答案2
ntoskrnl.exe!SmKmStoreHelperWorker
我查看了几个用户的 xperf 跟踪,这里内核的功能开始分配内存。
我发现系统内部。
我向微软询问过这个问题,答案是这是设计使然。它与系统内存压缩有关。
在Windows 10 Build 10525 发布后,微软对此做了一些解释:
在 Windows 10 中,我们在内存管理器中添加了一个新概念,称为压缩存储,它是内存中的压缩页面集合。这意味着当内存管理器感受到内存压力时,它将压缩未使用的页面而不是将其写入磁盘。这减少了每个进程使用的内存量,使 Windows 10 能够同时在物理内存中维护更多应用程序。这也有助于在 Windows 10 中提供更好的响应能力。压缩存储位于系统进程的工作集中。由于系统进程将存储保存在内存中,因此当内存可供其他进程使用时,其工作集会变大。这在任务管理器中可见,也是系统进程似乎比以前的版本消耗更多内存的原因。
因此,它不会将内存数据写入页面文件,而是对其进行压缩。压缩后的内存会显示在系统进程中。
微软还在内部中心发布了更多细节。Winbeta 创建了一篇文章其中包含更多细节。
显然,这种情况的原因与微软选择在 UWP 应用不在前台时暂停它们有关,这与某些智能手机操作系统管理非常相似。Windows 8 用户明白(也许不明白)如果应用不在屏幕上,它们将不会运行,直到用户切换回它们。“全有或全无”的方法正在更新Windows 10 在页面文件和正常页面活动之间引入了一个层。现在,当面临内存压力问题时,MM 将确定哪些页面应该在称为修剪的过程中移动到已修改列表。修改后的列表是页面文件的第二列表,用于备份备用页面文件列表。如果另一个进程从备用列表中回收内存,并且原始进程开始查找其页面,则会捕获备份列表。Windows 10 MM 不会采取全有或全无的做法,而是会压缩未使用的页面,而不是将其写入磁盘。写入越少,磁盘操作就越少– 得益于压缩 – 现在更多的数据可以在内存中存储。
据 Windows 团队称,“实际上,压缩内存约占未压缩大小的 40%,并且由于典型设备运行典型工作负载,Windows 10 将页面写入磁盘的频率仅为以前版本操作系统的 50%。“如果一切按计划进行,Windows 用户可能会体验到所有设备的等待时间减少,以及配备基于闪存的硬盘的系统使用寿命延长。
解压缩也是 Windows 10 的一大亮点。Windows 10 结合了并行性和顺序读取功能,一旦调用,就会将页面生成到内存中。新的解压缩功能应该会带来更快的体验,因为 Windows 10 会同时使用多个 CPU 解压缩数据并并行读取数据。旧版本的 Windows 可能会因为磁盘之间的传输速率而感觉迟缓。
微软还在 channel9 上发布了一个视频来解释该功能。
Windows 10 RTM 中的内存压缩
https://channel9.msdn.com/Blogs/Seth-Juarez/Memory-Compression-in-Windows-10-RTM
在这个视频中,Mehmet Iyigun 花了一些时间讨论为什么 Windows 10 中的系统进程占用了更多内存以及为什么这是一件好事。进程占用更多内存听起来像是一件坏事 - 直到我更多地了解了内存管理、分页和硬/软页面错误。事实证明,操作系统正在进行一些巧妙的优化,允许您的进程修剪部分内存,但不一定将其分页到磁盘。内存不仅保留在 RAM 中,而且还被压缩 - 使硬页面错误发生的可能性更小。结果应该会带来更流畅的体验。
在最新的 TH2 Builds 中,微软更新了任务管理器中的描述,现在还显示 SYSTEM 进程托管compressed memory
:
以避免对“高”使用率产生混淆。
在 2016 年 8 月发布的 Windows 10 周年更新中,微软将压缩提取到现在显示的一个名为的伪进程中,Memory Compression
以便不再让用户困惑为什么 SYSTEM 有如此大的内存使用量:
但看起来 Taskmgr 并没有显示这个进程,只有 ProcessExplorer/ProcessHacker 才能显示它。Taskmgr 只在概览中显示了压缩内存的数量:
如果将鼠标悬停在 Taskmgr 中的已用内存图上,您会看到一个工具提示,其中显示了压缩的数据量。
在这个演示中,388MB 被压缩到 122MB,因此压缩后节省了 267MB。
答案3
我发现了一个导致系统内存使用率过高的异常情况,并希望将其包括在内,以防这些信息对任何人有益。
如果你大量使用微软的卷快照(软件快照,而不是硬件快照),那么你保存的快照越多,大的数据发生变化,则系统将消耗更多的 RAM。
通常,用于卷快照的 RAM 量很小,不会被注意到,除非您拥有巨大的卷(即 64 TB),并且快照之间的增量为数 TB。默认情况下,如果写入 IO 过高,快照将简单地删除自身,但有方法可以防止这种情况,从而允许您达到巨大的增量。
下面是一个极端情况,显示服务器的系统进程使用了 13GB 的 RAM。该服务器只有两个卷快照,拍摄间隔为 15 天,每个快照之间写入了大约 10 TB 的数据。
上面的系统进程之前的使用量为 24GB,并且观察到以下三种行为:
- 重新启动并重新登录后,系统会在空白屏幕上挂起一段时间,直到出现桌面。
- 在此挂起期间,拉出任务管理器(CTRL-SHIFT-ESC)显示系统内存使用量不断增加。
- 在此挂起期间,带有卷快照的磁盘执行了大量读取操作,但这些操作并未显示在性能监视器中。不过,由于磁盘使用了 iSCSI,网卡显示稳定的读取流约为 200 Mbps。
我怀疑是卷快照,因此我尝试删除最旧的快照,这会立即将系统的内存使用量从 24 GB 下降到 13 GB。
在这种情况下,这可能是正常行为,尽管我还没有向微软确认这一点。与此同时,我将向该服务器添加额外的 32 GB RAM 来处理快照开销。
(注意:这是一台运行 Windows 2016 的高容量备份服务器,并连接了 64 TB SSD iSCSI 驱动器。它在任何给定时间平均维护三个卷快照,每 15 天创建一个新快照。每个快照之间写入大约 10 TB 的数据)。
答案4
在注册表项中禁用预取程序:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters
你可能有Enable Prefetcher
一个值,2
或者3
将其更改为0
Superfetch
接下来你需要在服务中禁用
搜索 services.msc
找到
superfetch
单击properties
然后将其设置为disabled
并停止该服务。
我按照这些步骤操作,当我玩游戏时,通常使用 PC,该system
过程仅使用 28k