/\/\o\/\/ PowerShelled

This blog has moved to http://ThePowerShellGuy.com Greetings /\/\o\/\/
$AtomFeed = ("Atom.xml")
$PreviousItems = (" Monad -and More bytes with -band = shorter script "," Tip from Monad "," MSH AD querying with .NET 2.0 framework "," get AD user allowed Logonhours from MSH "," MSH Show-Byte Function "," Let monad "drop" some chars "," getting an Inputbox in MOnad "," Get AD info into a nested HashTable from MSH "," Logging your MSH session "," MSH get-dateFormat function "," ")

Friday, December 09, 2005


Getting performanceMonitor info from Monad

This post will give 2 examples of using Performance monitor in MSH.

the first example with WMI and the Second example with the PerformanceCounter Object (.NET)

let's start with the WMI way:

get the % processortime of MSH :
(get-wmiobject Win32_PerfFormattedData_PerfProc_Process -filter "name = 'msh'").PercentProcessorTime

b.t.w. take care with this as the name is not the Key (the ID is), so if you get nothing back on this command, its not because there is not MSH process (as we are SURE there is, as we are in it ;-) ), but that there are more, and we need to use the ID.
MSH>gps msh

Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
372 13 44764 38516 182 5,84 3616 msh
563 13 34760 30672 173 4,41 5208 msh

MSH>(get-wmiobject Win32_PerfFormattedData_PerfProc_Process -filter "IDProcess = 5208").PercentProcessorTime
, leave out the property you will see all instances, so if you not use the key always take care that you can get an array back.

(get-wmiobject Win32_PerfFormattedData_PerfProc_Process -filter "name = 'msh'")  foreach {$_.PercentProcessorTime}
but how I got to the name of this class ?
maybe you use : " Wmi-Help Part 1 ", but you did not see those classes, this is because most of the time you don't need them most of the time.
but don't worry, It was prepared for this allready ;-)

# Booleans to filter non win32_ classes and perfmon Classes 
$bWin32 = $true
$bPerf = $true

You can find this switches in the script, if you set both to $false it will not filter those classes out, so you can look up the available performance classes, you can get the properies by just not specifying one, or using GM as you have seen allready.

Note that there are 2 kinds of classes :


normaly try to use the PerfFormattedData classes as they are allready "Cooked",
the RawData You have to compute yourself.
for more info :
(also I will show a little example of the difference in the .NET version)

The .NET way :

# Get Perfcounter
$pc = new-object system.diagnostics.PerformanceCounter
$pc.CategoryName = "Process"
$pc.CounterName = "% Processor Time"
$pc.InstanceName = "msh"

but How did I get the Inputparameters here ?
looked up in Performance monitor ?... No much better I just asked ;-)

First lets look at that Object

MSH>$pc = new-object system.diagnostics.PerformanceCounter

CategoryName :
CounterHelp :
CounterName :
CounterType :
InstanceLifetime : Global
InstanceName :
ReadOnly : True
MachineName : .
RawValue :
Site :
Container :

First it needs a Category, as said we don't want to look this up, so how do we get them, there is a other class in .NET for that :


CategoryName CategoryHelp CategoryType MachineName
------------ ------------ ------------ -----------
Terminal Services Session Terminal Services per-session r... MultiInstance .
IP The IP performance object consi... SingleInstance .
ASP.NET State Service ASP.NET State Service SingleInstance .
RSVP Interfaces RSVP Interfaces performance cou... MultiInstance .
Server The Server performance object c... SingleInstance .

this gives you a list of all available categories:
so we pick one :

MSH>$cat = new-object System.Diagnostics.PerformanceCounterCategory("Process")

CategoryName CategoryHelp CategoryType MachineName
------------ ------------ ------------ -----------
Process The Process performance object ... MultiInstance .performance object c... SingleInstance .

Ok, lets get the Counternames of that Object:

Exception calling "GetCounters" with "0" argument(s): "Counter is not single instance, an instance name needs to be specified.".
At line:1 char:17
+ $cat.GetCounters( <<<< )

Oops, we have to have an InstanceName for that So first lets ask that :


(Notice the Numbering so we don't have the Name problems as with WMI, as this keeps the instances unique)
so now we can get the counters.


CategoryName : Process
CounterHelp : % Processor Time is the percentage of elapsed time that all of process threads used the processor to execution instructi
ons. An instruction is the basic unit of execution in a computer, a thread is the object that executes instructions, and
a process is the object created when a program is run. Code executed to handle some hardware interrupts and trap condit
ions are included in this count.
CounterName : % Processor Time
CounterType : Timer100Ns
InstanceLifetime : Global
InstanceName : notepad#13
ReadOnly : True
MachineName : .
RawValue : 91562500
Site :
Container :


notice that already a sample is taken, but it's RAW (see WMI part).
in .net there are no different classes for "cooked" and "raw" data,
there are just 2 methods you can call GetSample for Raw data, nextValue for the "cooked" value, if you choose the raw data, you get the calculation info back also.


RawValue : 44062500
BaseValue : 0
SystemFrequency : 3000160000
CounterFrequency : 10000000
CounterTimeStamp : 127786339665937500
TimeStamp : 3882482312876355
TimeStamp100nSec : 127786339664843750
CounterType : Timer100Ns

mostly you can use the "cooked" data but if you can not (NT4 ?), you can calculate your own values, but as this is not common I point you to the MSDN article for that.
or this scripting guy's article
or for a more torough explanation look here : (Realy Recomended!!)

also I reccomend you to take a look at Lee's script as this gives an good example of an implemented solution, I hope this info helps you with that, take also notice about the Multi-CPU issue, you still need to calculate that ("medium cooked")

You see that you can do a lot with performance counters in MSH, and that especialy the .NET classes are very powerfull,.

Enjoy monitoring ;-)

gr /\/\o\/\/

PS. as was writing Lee Holmes wrote a example script also (inspired by the same NG post), :


Comments: Post a Comment

Links to this post:

Create a Link

<< Home


October 2005   November 2005   December 2005   January 2006   February 2006   March 2006   April 2006   May 2006   June 2006   July 2006   August 2006   September 2006   October 2006   November 2006   December 2006  

$Links = ("PowerShell RC1 Docs"," PowerShell RC1 X86"," PowerShell RC1 X64"," Monad GettingStarted guide"," Monad Progamming Guide"," Monad SDK"," Monad videos on Channel 9"," MSH Community Workspace"," scripts.readify.net "," MonadSource"," www.reskit.net"," PowerShell Blog"," Under The Stairs"," computerperformance powershell Home"," proudlyserving"," MSH on wikipedia"," MSHWiki Channel 9"," Keith Hill's Blog"," Precision Computing"," PowerShell for fun"," MSH Memo (Japanese)"," monadblog")

find-blog -about "PowerShell","Monad" | out-Technorati.
find-blog -contains "","" | out-Technorati.
Web mow001.blogspot.com

This page is powered by Blogger. Isn't yours?