win内存使用率过高但是资源监视器查看不到进程,排查思路
问题现象:
服务器:某云服务器 内存使用率持续打高,但是通过任务管理器查不到占用内存很高的进程
排查步骤:
1、通过任务管理器分析
核查目标主机的内存使用趋势情况,近7天内存使用情况如下:
通过任务管理器排查内存使用情况:
进一步核查进程使用内存情况,发现并没有占用内存很高的进程。
提交:操作系统为进程保留的虚拟内存,是程序独占的内存(包含物理内存和在页面文件中的内存)(单位:KB)
工作集:进程当前正在使用的物理内存量(单位:KB)
可共享:进程所使用的可与其它进程共享的物理内存量(单位:KB)
专用:由该进程所使用而其它进程无法使用的物理内存量(单位:KB)
工作集=可共享+专用
从进程内存详细输出结果来看,所有进程内存使用率总和并不会达到那么高的水位线。所以从单纯使用该工具无法进行下一步分析。
2、通过RAMMap分析
RAMMap工具较任务管理器可以看到更详细的内存信息。首先下载该工具,工具下载地址:https://docs.microsoft.com/en-us/sysinternals/downloads/rammap
下载完成之后,直接启动执行文件,可以看到如下内存分析结果:
其中,Nonpaged Pool(未分页池)占用内存过多,约5G左右。具体这块内存是哪部分使用掉的呢?该工具是无法核查到的,所以需要其他工具进一步核查。
3、通过Poolmon分析
继续上面的排查,想要知道Nonpaged Pool(未分页池)具体是哪个程序占用的,需要借助Poolmon工具分析。
Poolmon 是 wdk(windows develop kits) 里的工具,所以需要先安装 wdk, 但是wdk又依赖于Visual Studio,所以安装顺序为:1)安装Visual Studio--> 2)安装WDK--> 3)安装启动Poolmon
所有资源下载地址:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk
版本兼容性说明,可参考如下信息:
本次目标服务器操作系统版本为:windows server 2012
1)安装Visual Studio
参考上面给的资源下载链接,下载社区版安装包(下载的时候, 建议准备 10G 磁盘)
具体安装过程截图,这里就不再一一展示。其中,安装的时候注意必须勾选: “通用 Windows 平台开发”以及左侧“win11 sdk”,安装路径支持自定义。
安装完成之后,默认启动该工具即可。
2)安装WDK
参考上面给的资源下载链接,下载安装包
改工具安装过程无需特别注意项,直接一步步安装完成即可。
3)安装启动PoolMon工具
WDK安装完成之后,可以在默认路径:下,找到PoolMon工具。
执行x64目录下的poolmon工具即可。双击执行,可以看到如下界面:
默认列出了nonpage以及page相关信息。按大写字母“P”,可以只列出nonpage相关信息,然后再按大写字母“B”,按照内存大小倒序排序。
从排序结果可以看到,主要是Tag为:Mloc 占用内存较大。
打开cmd窗口,进入c:/windows/system32/drivers,然后输入命令:
findstr /m /l Mloc *.sys
命令执行结果为:
eamonm.sys edevmon.sys ehdrv.sys epfw.sys epfwwfp.sys
定位到具体的驱动文件之后,进一步核查驱动信息,定位到具体是哪个程序
从以上五个截图可以详细看到,这几个驱动文件对应的程序为:ESET Security软件。
核查服务器上运行的程序,确认确实有启动该程序。
最终判断,是由于该程序导致nonpaged pool占用内存较大,从而导致服务器整体内存使用率较高。
建议解决方案:
1、建议尝试修改该安全软件配置,例如:关闭文件扫描。观察内存是否有回落。
2、如修改配置后内存使用率仍无明显改善,建议将ESET Security软件停止/卸载,观察内存是否有回落。