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