By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
455,579 Members | 1,765 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 455,579 IT Pros & Developers. It's quick & easy.

Monitoring Server performance from .NET

P: n/a
Hi,

I have a test box which I would like to monitor CPU usage and run queue
during the day.

I don't want to buy any 3rd party tool, if I can do it easily, as I only
need to monitor the box's performance over a week.

I thought I could just create a .Net app or service with a timer that gets
back this data every so many minutes..

Can anyone help? Has anyone any example code..

Many thanks

JonesG
Nov 21 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
You can use the System.Diagnostics namespace and the PerformanceCounter
class.

From MSDN;

[Visual Basic]
Imports System
Imports System.Collections
Imports System.Collections.Specialized
Imports System.Diagnostics

_

Public Class App

Private Shared PC As PerformanceCounter
Private Shared BPC As PerformanceCounter
Public Shared Sub Main()

Dim samplesList As New ArrayList()

SetupCategory()
CreateCounters()
CollectSamples(samplesList)
CalculateResults(samplesList)
End Sub 'Main

Private Shared Function SetupCategory() As Boolean
If Not
PerformanceCounterCategory.Exists("AverageCounter6 4SampleCategory") Then

Dim CCDC As New CounterCreationDataCollection()

' Add the counter.
Dim averageCount64 As New CounterCreationData()
averageCount64.CounterType = PerformanceCounterType.AverageCount64
averageCount64.CounterName = "AverageCounter64Sample"
CCDC.Add(averageCount64)

' Add the base counter.
Dim averageCount64Base As New CounterCreationData()
averageCount64Base.CounterType = PerformanceCounterType.AverageBase
averageCount64Base.CounterName = "AverageCounter64SampleBase"
CCDC.Add(averageCount64Base)

' Create the category.
PerformanceCounterCategory.Create("AverageCounter6 4SampleCategory",
"Demonstrates usage of the AverageCounter64 performance counter type.",
CCDC)

Return True
Else
Console.WriteLine("Category exists -
AverageCounter64SampleCategory")
Return False
End If
End Function 'SetupCategory
Private Shared Sub CreateCounters()
' Create the counters.

PC = New PerformanceCounter("AverageCounter64SampleCategory ",
"AverageCounter64Sample", False)

BPC = New PerformanceCounter("AverageCounter64SampleCategory ",
"AverageCounter64SampleBase", False)
PC.RawValue = 0
BPC.RawValue = 0
End Sub 'CreateCounters
Private Shared Sub CollectSamples(samplesList As ArrayList)

Dim r As New Random(DateTime.Now.Millisecond)

' Loop for the samples.
Dim j As Integer
For j = 0 To 99

Dim value As Integer = r.Next(1, 10)
Console.Write((j + " = " + value))

PC.IncrementBy(value)

BPC.Increment()

If j Mod 10 = 9 Then
OutputSample(PC.NextSample())
samplesList.Add(PC.NextSample())
Else
Console.WriteLine()
End If
System.Threading.Thread.Sleep(50)
Next j
End Sub 'CollectSamples
Private Shared Sub CalculateResults(samplesList As ArrayList)
Dim i As Integer
For i = 0 To (samplesList.Count - 1) - 1
' Output the sample.
OutputSample(CType(samplesList(i), CounterSample))
OutputSample(CType(samplesList((i + 1)), CounterSample))

' Use .NET to calculate the counter value.
Console.WriteLine((".NET computed counter value = " +
CounterSampleCalculator.ComputeCounterValue(CType( samplesList(i),
CounterSample), CType(samplesList((i + 1)), CounterSample))))

' Calculate the counter value manually.
Console.WriteLine(("My computed counter value = " +
MyComputeCounterValue(CType(samplesList(i), CounterSample),
CType(samplesList((i + 1)), CounterSample))))
Next i
End Sub 'CalculateResults


'++++++++//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++
' Description - This counter type shows how many items are processed,
on average,
' during an operation. Counters of this type display a ratio of
the items
' processed (such as bytes sent) to the number of operations
completed. The
' ratio is calculated by comparing the number of items processed
during the
' last interval to the number of operations completed during the
last interval.
' Generic type - Average
' Formula - (N1 - N0) / (D1 - D0), where the numerator (N)
represents the number
' of items processed during the last sample interval and the
denominator (D)
' represents the number of operations completed during the last
two sample
' intervals.
' Average (Nx - N0) / (Dx - D0)
' Example PhysicalDisk\ Avg. Disk Bytes/Transfer
'++++++++//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++
Private Shared Function MyComputeCounterValue(s0 As CounterSample, s1 As
CounterSample) As [Single]
Dim numerator As [Single] = CType(s1.RawValue, [Single]) -
CType(s0.RawValue, [Single])
Dim denomenator As [Single] = CType(s1.BaseValue, [Single]) -
CType(s0.BaseValue, [Single])
Dim counterValue As [Single] = numerator / denomenator
Return counterValue
End Function 'MyComputeCounterValue
' Output information about the counter sample.
Private Shared Sub OutputSample(s As CounterSample)
Console.WriteLine(ControlChars.Lf + ControlChars.Cr + "+++++++++++")
Console.WriteLine("Sample values - " + ControlChars.Lf +
ControlChars.Cr)
Console.WriteLine((" BaseValue = " + s.BaseValue))
Console.WriteLine((" CounterFrequency = " + s.CounterFrequency))
Console.WriteLine((" CounterTimeStamp = " + s.CounterTimeStamp))
Console.WriteLine((" CounterType = " + s.CounterType))
Console.WriteLine((" RawValue = " + s.RawValue))
Console.WriteLine((" SystemFrequency = " + s.SystemFrequency))
Console.WriteLine((" TimeStamp = " + s.TimeStamp))
Console.WriteLine((" TimeStamp100nSec = " + s.TimeStamp100nSec))
Console.WriteLine("++++++++++++++++++++++")
End Sub 'OutputSample
End Class 'App
--
Gerry O'Brien [MVP]
Visual Basic .NET(VB.NET)


"Jonesgj" <g@btinternet.com> wrote in message
news:cj**********@hercules.btinternet.com...
Hi,

I have a test box which I would like to monitor CPU usage and run queue
during the day.

I don't want to buy any 3rd party tool, if I can do it easily, as I only
need to monitor the box's performance over a week.

I thought I could just create a .Net app or service with a timer that gets
back this data every so many minutes..

Can anyone help? Has anyone any example code..

Many thanks

JonesG

Nov 21 '05 #2

P: n/a
Jonesgj,
In addition to Gerry's suggestion, you can use WMI (Windows Management
Instrumentation) via the classes in the System.Management namespace.

Here is a recent MSDN article on WMI & .NET:

http://msdn.microsoft.com/vstudio/de...ml/vs04d6a.asp

Hope this helps
Jay

"Jonesgj" <g@btinternet.com> wrote in message
news:cj**********@hercules.btinternet.com...
Hi,

I have a test box which I would like to monitor CPU usage and run queue
during the day.

I don't want to buy any 3rd party tool, if I can do it easily, as I only
need to monitor the box's performance over a week.

I thought I could just create a .Net app or service with a timer that gets
back this data every so many minutes..

Can anyone help? Has anyone any example code..

Many thanks

JonesG

Nov 21 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.