最近服务器上某些进程的内存使用会突然升高,于是写了一个脚本在内存占用高点时抓取dump以便分析.
期间走了不少弯路才找到vbscript控制进程时的属性名,随笔记录一下
objprocess的常用属性:
'MsgBox "Process: " & objProcess.Name & objProcess.UserModeTime
'MsgBox "Process ID: " & objProcess.ProcessID
'MsgBox "Thread Count: " & objProcess.ThreadCount
'MsgBox "Page File Size: " & objProcess.PageFileUsage
'MsgBox "Page Faults: " & objProcess.PageFaults
'MsgBox "Working Set Size: " & objProcess.WorkingSetSize
最近服务器上某些进程的内存使用会突然升高,于是写了一个脚本在内存占用高点时抓取dump以便分析.
期间走了不少弯路才找到vbscript控制进程时的属性名,随笔记录一下
服务器内存症状如下(运维部门设定了进程内存过高时的自动回收)
监控脚本如下:
Code
1'maxM 内存大小
2'maxVM 虚拟内存大小
3'debug版本功能:只生成最小dump文件
4'release:m改成ma maxM maxVM设置
5On Error Resume Next
6Dim o
7Dim maxVM,maxM, objWMIService, colProcessList, objProcess
8maxM =150 * 1000000
9maxVM=150 * 1000
10
11monitor "Win32_Process"
12monitor "Win64_Process"
13
14Sub monitor(process)
15 Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
16 Set colProcessList = objWMIService.ExecQuery("Select * from " + process )
17 'MsgBox colProcessList.count
18 If colProcessList.count > 0 Then
19 For Each objProcess In colProcessList
20 If ((objProcess.PageFileUsage - maxVM)>0 or (objProcess.WorkingSetSize - maxM)>0) and objProcess.Handle > 0 Then
21 'MsgBox "已发现目标!=" & objProcess.UserModeTime & objProcess.Name& objProcess.PageFileUsage & "m:" & objProcess.WorkingSetSize
22 Set o = wscript.createobject("wscript.shell")
23 o.run "ntsd -pv -p " & objProcess.Handle & " -c "".dump /ma d:\" & objProcess.Name & Replace(Replace(Replace(Replace(date,"-","_"),"/","_")," ",""),":","_") & Replace(Replace(Replace(Replace(Time,"-","_"),"/","_")," ",""),":","_") & ".dmp;q""",0,true
24 End If
25 Next
26 End If
27End Sub
objprocess的其他常用属性:
'MsgBox "Process: " & objProcess.Name & objProcess.UserModeTime
'MsgBox "Process ID: " & objProcess.ProcessID
'MsgBox "Thread Count: " & objProcess.ThreadCount
'MsgBox "Page File Size: " & objProcess.PageFileUsage
'MsgBox "Page Faults: " & objProcess.PageFaults
'MsgBox "Working Set Size: " & objProcess.WorkingSetSize
看到很多朋友在网上问"得到进程内存应该写成什么, 是objProcess.PageFileUsage还是objProcess.Member?"之类的问题,
wbemtest.exe是一个系统自带的工具,通过它可以更容易地确认win32_process的操作属性
与wmi的一些知识有关.
WMI 测试器。WMI 测试器 (wbemtest.exe) 是一个用于与 WMI 基础结构交互的通用、图形化工具。您可以使用 WMI 测试器来浏览 CIM 架构并检查托管资源类定义。WMI 测试器还可用于执行与基于 WMI 的脚本执行的相同的操作,例如检索托管资源的实例和运行查询。WMI 测试器是在所有启用了 WMI 的计算机上默认的 WMI 安装的一部分,因此 wbemtest.exe 是一个出色的 WMI 学习和疑难解答工具。有关使用 WMI 测试器的信息,参阅 Windows XP 帮助和支持中心内的 WMI 测试器概述。
运行wbemtest.exe,单击 “连接”按钮 连接到本地或远程计算机上的 WMI 服务。显示“连接”对话框,它提供一个标记为 名称空间 的文本输入区域,该区域默认值为 root\default。将 名称空间 区域的值更改为 root\cimv2,单击“连接”对话框的 连接 按钮返回到主 WMI 测试器窗口。
"枚举类别"-"递归":
双击win32_process,弹出的窗口上可以看到wind32_process的一些属性,
点击"实例"并选择需要查看的进程,即可以看到对应的值.
PS:部分网站是运行在64位机上的32位进程,在64位的系统中ntsd有两个版本,分别在system32和syswow64下,
使用时需要区分
更多wmi的信息可以参考http://msdn.microsoft.com/zh-cn/library/ms974579.aspx