我遇到的问题非常简单:虽然应用程序使用的内存非常小(~2GB),但同时任务管理器报告说服务器基本上使用了所有内存(16GB)。在此期间,它开始交换,性能达到最低,延迟达到最高。
我将此诊断回一个使用映射内存访问打开许多文件的应用程序(可能以某种不太标准的方式,因为它是用 Delphi 编写的)。Sysinternals 的 RamMap 报告说,这 14GB 用于“映射文件”,处于活动状态。事情是,这个内存没有被主动使用,那些应用程序处于待机模式,没有连接客户端。尽可能地闲着。
为了使内存使用恢复到正常水平,我只需要使用 RamMap 中的“Empty→Empty System Working Set”选项。这解决了只要没有新活动(从数据文件读取等)就没有可用内存的问题。然后内存使用率上升,性能再次下降。
解决方案是编写一个脚本来每隔几分钟做一次 RamMap 做的同样的事情。那就是我被困的地方。我找到了EmptyWorkingSet
WinAPI 函数并找到了在系统中的所有进程上运行它的 PowerShell 脚本,但它确实减少了最多 200-300MB 的使用内存,不少 GB RamMap 能够做到。
如何定期运行 RamMap Empty System Working Set 选项?
问题是由使用FILE_FLAG_RANDOM_ACCESS的应用程序引起的。我修复了应用程序。
如果有人发布了通用解决方法,我会将正确答案重新分配给他的答案。