文档主要是演示下poolmon的命令用法,仅此而已,文档里贴的360那个示例仅仅是示例而已,我是故意选了360的模块占用,来展示命令的作用,仅此而已。
在更多内存泄露场景中,poolmon并不大能定位到根因。最好用的反而是排除法和对比法,性能对比,从原理上来讲,我一直是奉行这句要诀: 环境一致性[底层硬件/操作系统/软件/工作负载(请求量/包量等)],测试要尽量消除无关变量,如果没有正常环境做参考,那就排除法,从这2个主要维度分细节去对比排除。
代码语言:javascript复制平台侧:硬件配置差异、虚拟化差异、安全组差异
系统内部:winver内核版本、驱动版本、补丁、软件版本和关键文件md5值、服务列表、平台组件
poolmon集成在wdk里,需要运行wdksetup.exe进行安装,而windbg也需要运行wdksetup.exe进行安装,但是请注意wdksetup.exe不含Windows Performance Toolkit,不要搞混了。
先介绍如何安装poolmon,然后介绍怎么用
打开https://docs.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk
1、下载安装wdk
注意直接点步骤3里的链接下载wdksetup.exe
https://go.microsoft.com/fwlink/?linkid=2166289
运行wdksetup.exe下载安装文件到一个目录
下载完成后关闭界面
然后去下载完成的目录(留存安装文件是为了在多台机器部署,压缩后复制到其他机器就可以用,而不用再下载一次),找到这个目录里的wdksetup.exe运行安装
2、cd /d "poolmon的绝对路径目录"
poolmon.exe的位置C:Program Files (x86)Windows Kits10Toolsx64poolmon.exe
cd /d "C:Program Files (x86)Windows Kits10Toolsx64"
3、执行poolmon命令
-n 是输出文件
-u或-b 是按Bytes倒序排列
-p -p 就是按2次p,即 First turns on nonpaged, second turns on paged
poolmon.exe -n c:1.txt -u -p -p(按2次p,paged)
poolmon.exe -n c:2.txt -u -p(按1次p,nonpaged)
poolmon -n c:3.txt -u (混合)
用notepad 打开上面获取到的.txt(软件作者反华,软件本身挺好用,会对齐列),看Bytes排在前边的Tag(多试几个Tag)
4、注意上图第1条的Bytes一列是倒序的,看前几条的第一列Tag名称
5、执行cd /d "C:WindowsSystem32drivers"
findstr /m /l /s $tagname *.sys
对应到上图即
findstr /m /l /s MmSt *.sys
findstr /m /l /s Se *.sys
findstr /m /l /s FMfn *.sys
根据查到的关键词可以判定占用内存最多的是什么软件,我自己这个case中,主要是操作系统占用的
6、假如Bytes一列最大值对应的Tag名称是DRPI,那执行findstr /mls DRPI *.sys
说明DRPI这个高主要是360占用
参数/m /l /s可以合并成/mls
关于安装包的其他微软官方资料:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/other-wdk-downloads