Windows已修改内存泄露问题排查
最近解决了一个疑难问题,在此记录一下。
问题现象
项目上的Windows服务器内存会缓慢地增长,直至服务器内存占满而宕机(时间在一周或几周左右)。
排查服务器后发现是“已修改”内存无法释放导致的。(此部分内存和虚拟内存有关,这部分内存需要写入分页文件后物理内存才会释放。)
解决思路
既然和虚拟内存有关,首先排查了虚拟内存设置的大小,发现初始的设置只有4G,而服务器的物理内存有32G,怀疑是虚拟内存设置太小,导致物理内存无法及时写入虚拟内存中。但是在调大虚拟内存后,虽然延长了问题发生的时间,但内存还是会缓慢增长,无法释放。
然后,又检查了磁盘IO,因为物理内存写入虚拟磁盘是需要消耗IO资源的,如果IO较差,也会导致无法及时写入虚拟内存。但是排查后没有发现磁盘IO存在瓶颈。
之后,其实已经没有其他思路了,零零星星的怀疑过CPU问题(国产化海光CPU,怀疑存在兼容问题)、虚拟化平台问题(没有安装对应tools导致问题)、Windows补丁问题(网上查到部分Windows补丁会出现内存泄露问题),还使用过RAMMap、Mem Reduct等工具尝试清理内存,但最终都无法解决问题。
最后,偶然翻到了网上的帖子。
https://www.sevenforums.com/performance-maintenance/345483-ridiculous-modified-memory-usage.html
帖子的最后,建议通过在任务管理器中添加“句柄”列,查看是否有句柄特别多的进程存在。
尝试后发现,确实存在一个进程的句柄数异常多,达到了47万多,而第二名的只有5千多。
既然找到了怀疑的对象,就尝试重启服务,观察内存是否被释放。结果确实是这个进程问题。
最终,找到了产生问题的进程,但具体的问题原因还需要这个程序的提供方提供解决方案。不过,我的工作到此就完成了。
其他一些找到的帖子:
https://www.reddit.com/r/sysadmin/comments/1bk5o2p/kb5035849_is_causing_memory_leaks_on_2019_domain/