Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
One of my holiday tasks was to learn some PowerShell. While reading/skimming through a book on the subject, I decided to create a quick script which would track memory utilization for a given application. In the past I've used a stand-alone application which would take a snapshot of all the processes and dump out the memory utilization, number of handles, etc. I would then call this application from a batch file periodically to generate a trend of the resource usage. This was an indispensible tool for tracking memory leaks etc., but required some post processing to filter out only the application I cared about. Using PowerShell I was able to whip up a quick script which gave me much the same information without having multiple processing stages.
memsnap.ps1
#
# MemSnapGetHeader - returns the header string.
#
function MemSnapGetHeader([string] $procName = "*")
{
$time = get-date
$header = "MemSnap Report`n"
$header += "`nStart Time: "
$header += $time.DateTime
$header += "`nProcess: "
$header += $procName
$header += "`n`nTime (s), Threads, Handles, Working Set, Total CPU (s)"
return $header
}
#
# MemSnapGetLine - returns the current comma delimited stats for the
# given application name.
#
function MemSnapGetLine([string] $procName)
{
$procInfo = get-process $procName
# if we get back more than one, just grab the first one
if($procInfo.length -ge 2)
{
$procInfo = $procInfo[0]
}
# build the stats string
$ret = "" + $procInfo.Threads.Count
$ret += ", " + $procInfo.Handles
$ret += ", " + $procInfo.WS
$ret += ", " + $procInfo.CPU
return $ret
}
#
# MemSnap - this function is the main processing loop which will gather
# the application stats.
#
# hit Ctrl-C to break out of the loop
#
function MemSnap([string] $procName = "*", [int] $delay = 10)
{
$time = 0
$header = MemSnapGetHeader $procName
$header
while($true)
{
$line = "" + $time + ", "
$line += MemSnapGetLine $procName
# echo out the current stats
$line
sleep $delay
$time += $delay
}
}
To run it, first we load the script file, and then we call the monitoring function with the application to track:
> . C:\memsnap.ps1
> MemSnap "explorer"
You may need to set script execution permissions if you haven't already:
> Set-ExecutionPolicy RemoteSigned
As this was my very first PowerShell script, comments about inefficiencies, best practices, etc. are more than welcome...
Comments
- Anonymous
January 07, 2008
PingBack from http://www.alvinashcraft.com/2008/01/07/daily-bits-january-7-2008/