====== Microsoft SQL Server Performance Counter Pack ======
^ Author | [[ neil_franken@yahoo.com | Neil Franken]] |
^ Compatibility | Xymon 4.2+ |
^ Requirements | MSSQL Windows VBS|
^ Download | None |
^ Last Update | 2010-06-18 |
===== Description =====
This VBS Script uses the WMI Interface to read SQL related Performance Counters. These counters can be used by DBA's to establish a baseline for performance as well as provide a early indication of possible hardware upgrades such as the need for more memory etc.
These are the performance counters that are monitored:
* Buffer Cache Hit Ratio
* Page Life Expectancy
* Checkpoint Pages/Sec
* Lazy Writes/Sec
* Locks Timeouts/sec
* Number of Deadlocks/sec
* Page Splits/sec
* Active Transactions
* Transactions/sec
* Logins/sec
* Logout/sec
* Active Temp Tables
* Number of User Connections
* Cursor Request/sec
This is not a complete list of counters but presents a good set for a baseline. However please keep checking back for updates as I enhance the script over time.
===== Installation =====
=== Client side ===
Place the script on the SQL Server you want to monitor and add a appropriate section to the BBWin.cfg externals section.
Typically it would be configured like this.
Once this is added to the cfg file it should create a sql file in the tmp directory of BBwin for upload. If this is the case it is working.
=== Server side ===
While the Xymon server does not require any installation you can add the following to the hobbitserver.cfg to create a graph with some of the more important values on.
== 1) Adding NCV Definition to the hobbitserver.cfg file ==
* Add sql=ncv to the TEST2RRD section of the hobbitserver.cfg file.
* Add the following definition to the hobbitserver.cfg
''NCV_sql="BufferCacheHitRatio:GAUGE,PageLifeExpectancy:GAUGE
,CheckpointPagesSec:GAUGE
,LazyWritesSec:GAUGE
,LocksTimeoutssec:GAUGE
,NumberofDeadlocksse:GAUGE
,PageSplitssec:GAUGE
,ActiveTransactions:GAUGE
,Transactionssec:GAUGE
,Loginssec:GAUGE
,ActiveTempTables:GAUGE
,NumberofUserConnect:GAUGE
,CursorRequestsec:GAUGE
,Logoutsec:GAUGE"''
* Restart Xymon
== 2) Adding Graph Definition to the hobbitgraph.cfg file ==
* Add the following to the file.
[sql]
TITLE SQL Server Performance And Health
-u 1.0
YAXIS Number
DEF:BufferCacheHitRatio=sql.rrd:BufferCacheHitRatio:AVERAGE
DEF:PageLifeExpectancy=sql.rrd:PageLifeExpectancy:AVERAGE
DEF:CheckpointPagesSec=sql.rrd:CheckpointPagesSec:AVERAGE
DEF:LazyWritesSec=sql.rrd:LazyWritesSec:AVERAGE
DEF:LocksTimeoutssec=sql.rrd:LocksTimeoutssec:AVERAGE
DEF:NumberofDeadlocksse=sql.rrd:NumberofDeadlocksse:AVERAGE
DEF:PageSplitssec=sql.rrd:PageSplitssec:AVERAGE
DEF:ActiveTransactions=sql.rrd:ActiveTransactions:AVERAGE
DEF:Transactionssec=sql.rrd:Transactionssec:AVERAGE
DEF:ActiveTempTables=sql.rrd:ActiveTempTables:AVERAGE
DEF:Loginssec=sql.rrd:Loginssec:AVERAGE
DEF:Logoutsec=sql.rrd:Logoutsec:AVERAGE
DEF:NumberofUserConnect=sql.rrd:NumberofUserConnect:AVERAGE
DEF:CursorRequestsec=sql.rrd:CursorRequestsec:AVERAGE
VDEF:BufferCacheHitRatiomax=BufferCacheHitRatio,MAXIMUM
VDEF:BufferCacheHitRatioavg=BufferCacheHitRatio,AVERAGE
VDEF:BufferCacheHitRatiomin=BufferCacheHitRatio,MINIMUM
VDEF:BufferCacheHitRatiolast=BufferCacheHitRatio,LAST
VDEF:PageLifeExpectancymax=PageLifeExpectancy,MAXIMUM
VDEF:PageLifeExpectancyavg=PageLifeExpectancy,AVERAGE
VDEF:PageLifeExpectancymin=PageLifeExpectancy,MINIMUM
VDEF:PageLifeExpectancylast=PageLifeExpectancy,LAST
VDEF:CheckpointPagesSecmax=CheckpointPagesSec,MAXIMUM
VDEF:CheckpointPagesSecavg=CheckpointPagesSec,AVERAGE
VDEF:CheckpointPagesSecmin=CheckpointPagesSec,MINIMUM
VDEF:CheckpointPagesSeclast=CheckpointPagesSec,LAST
VDEF:LazyWritesSecmax=LazyWritesSec,MAXIMUM
VDEF:LazyWritesSecavg=LazyWritesSec,AVERAGE
VDEF:LazyWritesSecmin=LazyWritesSec,MINIMUM
VDEF:LazyWritesSeclast=LazyWritesSec,LAST
VDEF:NumberofDeadlockssemax=NumberofDeadlocksse,MAXIMUM
VDEF:NumberofDeadlocksseavg=NumberofDeadlocksse,AVERAGE
VDEF:NumberofDeadlockssemin=NumberofDeadlocksse,MINIMUM
VDEF:NumberofDeadlocksselast=NumberofDeadlocksse,LAST
VDEF:LocksTimeoutssecmax=LocksTimeoutssec,MAXIMUM
VDEF:LocksTimeoutssecavg=LocksTimeoutssec,AVERAGE
VDEF:LocksTimeoutssecmin=LocksTimeoutssec,MINIMUM
VDEF:LocksTimeoutsseclast=LocksTimeoutssec,LAST
VDEF:NumberofDeadlockmax=NumberofDeadlocksse,MAXIMUM
VDEF:NumberofDeadlockavg=NumberofDeadlocksse,AVERAGE
VDEF:NumberofDeadlockmin=NumberofDeadlocksse,MINIMUM
VDEF:NumberofDeadlocklast=NumberofDeadlocksse,LAST
VDEF:PageSplitssecmax=PageSplitssec,MAXIMUM
VDEF:PageSplitssecavg=PageSplitssec,AVERAGE
VDEF:PageSplitssecmin=PageSplitssec,MINIMUM
VDEF:PageSplitsseclast=PageSplitssec,LAST
VDEF:ActiveTransactionsmax=ActiveTransactions,MAXIMUM
VDEF:ActiveTransactionsavg=ActiveTransactions,AVERAGE
VDEF:ActiveTransactionsmin=ActiveTransactions,MINIMUM
VDEF:ActiveTransactionslast=ActiveTransactions,LAST
VDEF:Transactionssecmax=Transactionssec,MAXIMUM
VDEF:Transactionssecavg=Transactionssec,AVERAGE
VDEF:Transactionssecmin=Transactionssec,MINIMUM
VDEF:Transactionsseclast=Transactionssec,LAST
VDEF:ActiveTempTablesmax=ActiveTempTables,MAXIMUM
VDEF:ActiveTempTablesavg=ActiveTempTables,AVERAGE
VDEF:ActiveTempTablesmin=ActiveTempTables,MINIMUM
VDEF:ActiveTempTableslast=ActiveTempTables,LAST
VDEF:Loginssecmax=Loginssec,MAXIMUM
VDEF:Loginssecavg=Loginssec,AVERAGE
VDEF:Loginssecmin=Loginssec,MINIMUM
VDEF:Loginsseclast=Loginssec,LAST
VDEF:Logoutsecmax=Logoutsec,MAXIMUM
VDEF:Logoutsecavg=Logoutsec,AVERAGE
VDEF:Logoutsecmin=Logoutsec,MINIMUM
VDEF:Logoutseclast=Logoutsec,LAST
VDEF:NumberofUserConnectmax=NumberofUserConnect,MAXIMUM
VDEF:NumberofUserConnectavg=NumberofUserConnect,AVERAGE
VDEF:NumberofUserConnectmin=NumberofUserConnect,MINIMUM
VDEF:NumberofUserConnectlast=NumberofUserConnect,LAST
VDEF:CursorRequestsecmax=CursorRequestsec,MAXIMUM
VDEF:CursorRequestsecavg=CursorRequestsec,AVERAGE
VDEF:CursorRequestsecmin=CursorRequestsec,MINIMUM
VDEF:CursorRequestseclast=CursorRequestsec,LAST
COMMENT:
COMMENT:\t\t\tMaximum
COMMENT:\tAverage
COMMENT:\tMinimum
COMMENT:\tCurrent \l
LINE2:BufferCacheHitRatio#000000:Buffer Cache Hit Ratio
GPRINT:BufferCacheHitRatiomax:\t%6.2lf %S
GPRINT:BufferCacheHitRatioavg:\t%6.2lf %S
GPRINT:BufferCacheHitRatiomin:\t%6.2lf %S
GPRINT:BufferCacheHitRatiolast:\t%6.2lf %S\l
LINE2:LazyWritesSec#b527d4:Lazy Writes/Sec
GPRINT:LazyWritesSecmax:\t%6.0lf %S
GPRINT:LazyWritesSecavg:\t%6.0lf %S
GPRINT:LazyWritesSecmin:\t%6.0lf %S
GPRINT:LazyWritesSeclast:\t%6.0lf %S\l
LINE2:NumberofDeadlocksse#ff6c00:Deadlocks/Sec
GPRINT:NumberofDeadlockmax:\t%6.0lf %S
GPRINT:NumberofDeadlockavg:\t%6.0lf %S
GPRINT:NumberofDeadlockmin:\t%6.0lf %S
GPRINT:NumberofDeadlocklast:\t%6.0lf %S\l
LINE2:ActiveTransactions#12ff00:Active Transactions
GPRINT:ActiveTransactionsmax:\t%6.0lf %S
GPRINT:ActiveTransactionsavg:\t%6.0lf %S
GPRINT:ActiveTransactionsmin:\t%6.0lf %S
GPRINT:ActiveTransactionslast:\t%6.0lf %S\l
LINE2:ActiveTempTables#0000e9:Active Temp Tables
GPRINT:ActiveTempTablesmax:\t%6.0lf %S
GPRINT:ActiveTempTablesavg:\t%6.0lf %S
GPRINT:ActiveTempTablesmin:\t%6.0lf %S
GPRINT:ActiveTempTableslast:\t%6.0lf %S\l
LINE2:NumberofUserConnect#ff0000:Users Connected
GPRINT:NumberofUserConnectmax:\t%6.0lf %S
GPRINT:NumberofUserConnectavg:\t%6.0lf %S
GPRINT:NumberofUserConnectmin:\t%6.0lf %S
GPRINT:NumberofUserConnectlast:\t%6.0lf %S\l
#LINE2:PageLifeExpectancy#b527d4:Page Life Expectancy
COMMENT:Data Not On Graph\l
COMMENT:Page Life Expectancy
GPRINT:PageLifeExpectancymax:\t%6.0lf %S
GPRINT:PageLifeExpectancyavg:\t%6.0lf %S
GPRINT:PageLifeExpectancymin:\t%6.0lf %S
GPRINT:PageLifeExpectancylast:\t%6.0lf %S\l
#LINE2:Transactionssec#1ebdf8:Transactions/Sec
COMMENT:Transactions/Sec
GPRINT:Transactionssecmax:\t%6.0lf %S
GPRINT:Transactionssecavg:\t%6.0lf %S
GPRINT:Transactionssecmin:\t%6.0lf %S
GPRINT:Transactionsseclast:\t%6.0lf %S\l
#LINE2:LocksTimeoutssec#00FF66:Lock Timeout/Sec
COMMENT:Lock Timeout/Sec
GPRINT:LocksTimeoutssecmax:\t%6.0lf %S
GPRINT:LocksTimeoutssecavg:\t%6.0lf %S
GPRINT:LocksTimeoutssecmin:\t%6.0lf %S
GPRINT:LocksTimeoutsseclast:\t%6.0lf %S\l
#LINE2:CheckpointPagesSec#1ebdf8:Checkpoint Pages/Sec
COMMENT:Checkpoint Pages/Sec
GPRINT:CheckpointPagesSecmax:\t%6.0lf %S
GPRINT:CheckpointPagesSecavg:\t%6.0lf %S
GPRINT:CheckpointPagesSecmin:\t%6.0lf %S
GPRINT:CheckpointPagesSeclast:\t%6.0lf %S\l
#LINE2:PageSplitssec#00ffd2:Page Splits/Sec
COMMENT:Page Splits/Sec
GPRINT:PageSplitssecmax:\t%6.0lf %S
GPRINT:PageSplitssecavg:\t%6.0lf %S
GPRINT:PageSplitssecmin:\t%6.0lf %S
GPRINT:PageSplitsseclast:\t%6.0lf %S\l
#LINE2:Loginssec#0060ff:Login/Sec
COMMENT:Logins/Sec
GPRINT:Loginssecmax:\t%6.0lf %S
GPRINT:Loginssecavg:\t%6.0lf %S
GPRINT:Loginssecmin:\t%6.0lf %S
GPRINT:Loginsseclast:\t%6.0lf %S\l
#LINE2:Logoutsec#a1b4d4:Logouts/Sec
COMMENT:Logout/Sec
GPRINT:Logoutsecmax:\t%6.0lf %S
GPRINT:Logoutsecavg:\t%6.0lf %S
GPRINT:Logoutsecmin:\t%6.0lf %S
GPRINT:Logoutseclast:\t%6.0lf %S\l
#LINE2:CursorRequestsec#4aa2f3:Cursor Request/Sec
COMMENT:Cursor Request/Sec
GPRINT:CursorRequestsecmax:\t%6.0lf %S
GPRINT:CursorRequestsecavg:\t%6.0lf %S
GPRINT:CursorRequestsecmin:\t%6.0lf %S
GPRINT:CursorRequestseclast:\t%6.0lf %S\l
You should now see the graph after a couple of minutes of collecting data.
===== Source =====
mssqlperfpack.vbs
==== mssqlperfpack.vbs====
' SQL DBA Performance Pack Script Beta.
' Author: Neil Franken
' email: neil_franken@yahoo.com
' Description:
' This script collects some SQL related performance counters. It is based and inspired by the
' bbsql-server script that was written 03/2002 by Jason Benassi and modified by Bart Gillis.
'
' The information is used to get a perfomance baseline and monitor over time what performance
' tweaks can be made to your SQL server. It will be updated and become more comprehensive over time
' so please check in every once in a while for a update.
' You are welcome to use, modify, mangle and do what you please with this script just please
' keep me in the loop about bugs,updates and or improvements.
'
' IMPORTANT NOTES:
' Before running this script please do the following. Open a command prompt on the SQL server where the script
' runs. Run the following command wmiadap/f.
' Open the services manager screen and restart/start the WMI performance adapter service. This service must be running
' to read the performance counters via the WMI interface.
'
'
' KNOWN ISSUE:
' I encountered a problem where the CPU was 64 Bit but the installed OS was 32Bit. This caused the registry read to fail.
' If you have a 32 Bit OS running on a 64 bit system yuo will have to change the script to point to the BBWin\tmp folder
' as the script will attempt to read the value from a registry key that dont exist. Also comment out the ProcessorCheck function.
'
' Version 0.5 Released: 18/06/2010
'
strAlarmState = "green"
strTestName = "sql" 'this Is the filename i.e. column name in xymon.
strOutput = ""
Set ws = WScript.CreateObject("WScript.Shell")
Set ws = WScript.CreateObject("WScript.Shell")
ProcessorCheck
If Proc = "x86" Then
' extPath = "c:\"
extPath = ws.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\BBWin\tmppath") 'Registry key that stores the ext script path on 32bit Architecture
' WScript.Echo Proc
Else
' extPath = "c:\"
extPath = ws.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\BBWin\tmppath") 'Registry key that stores the ext script path on 64bit Architecture
' WScript.Echo Proc
End If
' Usage of the CheckValue,CheckReserveValue Functions:
' CheckValue takes the Performance Counter value,a description which appears on Xymon,the warning value and the Alarm value and does a check for values above the warn and alarm thresholds.
' CheckReverseValue takes the Performance Counter value,a description which appears on Xymon,the warning value and the Alarm value and does a check for values below the warn and alarm thresholds.
'
' Usage of the GetWMPercent and GetWMIValue functions:
' Both these functions takes the following parameters
' 1) The WMI Class Name i.e. Win32_PerfFormattedData_MSSQLSERVER_SQLServerBuffermanager this is a collection of performance counter instances related to the class.
' 2) Instance for the peformance counter. Some performance counters can be specific to a instance i.e. we could have performance counters
' For the masterdb, the pubs db and so on. If you want to monitor a specific database you can do so by specifying the name. If you want
' to monitor the entire server use the _Total instance. Other performance counters are spcific to the entire install such as Buffercachehitratio
' and you have to specify the @ for these to work. If you need some clarification use windows performance monitor to see the instance names for a counter
' if they are available.
' 3) The actuall counter name you want to get for the instance specified in parameter 2.
' The GetWMPercent function has a additional paramater called strBaseObject this is used in the calculations to get the percentage value for the counter.
'
'Handy List Of SQL Performance Counter Classes.
'____________________________________________________________
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerAccessMethods"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerAccessMethods"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerBackupDevice"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerBackupDevice"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerBrokerActivation"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerBrokerActivation"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerBrokerDBMTransport"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerBrokerDBMTransport"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerBrokerStatistics"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerBrokerStatistics"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerBufferManager"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerBufferManager"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerBufferNode"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerBufferNode"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerBufferPartition"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerBufferPartition"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerCatalogMetadata"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerCatalogMetadata"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerCLR"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerCLR"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerCursorManagerbyType"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerCursorManagerbyType"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerCursorManagerTotal"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerCursorManagerTotal"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerDatabaseMirroring"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerDatabaseMirroring"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerDatabases"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerDatabases"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerExecStatistics"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerExecStatistics"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerGeneralStatistics"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerGeneralStatistics"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerLatches"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerLatches"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerLocks"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerLocks"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerMemoryManager"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerMemoryManager"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerPlanCache"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerPlanCache"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerReplicationAgents"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationAgents"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerReplicationDist"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationDist"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerReplicationLogreader"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationLogreader"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerReplicationMerge"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationMerge"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerReplicationSnapshot"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationSnapshot"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerSQLErrors"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerSQLErrors"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerSQLStatistics"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerSQLStatistics"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerTransactions"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerTransactions"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerUserSettable"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerUserSettable"
'"Win32_PerfFormattedData_MSSQLSERVER_SQLServerWaitStatistics"
'"Win32_PerfRawData_MSSQLSERVER_SQLServerWaitStatistics"
'"Win32_PerfFormattedData_MSSQLServerOLAPService_MSAS2005Cache"
'"Win32_PerfRawData_MSSQLServerOLAPService_MSAS2005Cache"
'"Win32_PerfFormattedData_MSSQLServerOLAPService_MSAS2005Connection"
'"Win32_PerfRawData_MSSQLServerOLAPService_MSAS2005Connection"
'"Win32_PerfFormattedData_MSSQLServerOLAPService_MSAS2005DataMiningModelProcessing"
'"Win32_PerfRawData_MSSQLServerOLAPService_MSAS2005DataMiningModelProcessing"
'"Win32_PerfFormattedData_MSSQLServerOLAPService_MSAS2005DataMiningPrediction"
'"Win32_PerfRawData_MSSQLServerOLAPService_MSAS2005DataMiningPrediction"
'"Win32_PerfFormattedData_MSSQLServerOLAPService_MSAS2005Locks"
'"Win32_PerfRawData_MSSQLServerOLAPService_MSAS2005Locks"
'"Win32_PerfFormattedData_MSSQLServerOLAPService_MSAS2005MDX"
'"Win32_PerfRawData_MSSQLServerOLAPService_MSAS2005MDX"
'"Win32_PerfFormattedData_MSSQLServerOLAPService_MSAS2005Memory"
'"Win32_PerfRawData_MSSQLServerOLAPService_MSAS2005Memory"
'"Win32_PerfFormattedData_MSSQLServerOLAPService_MSAS2005ProactiveCaching"
'"Win32_PerfRawData_MSSQLServerOLAPService_MSAS2005ProactiveCaching"
'"Win32_PerfFormattedData_MSSQLServerOLAPService_MSAS2005ProcAggregations"
'"Win32_PerfRawData_MSSQLServerOLAPService_MSAS2005ProcAggregations"
'"Win32_PerfFormattedData_MSSQLServerOLAPService_MSAS2005Processing"
'"Win32_PerfRawData_MSSQLServerOLAPService_MSAS2005Processing"
'"Win32_PerfFormattedData_MSSQLServerOLAPService_MSAS2005ProcIndexes"
'"Win32_PerfRawData_MSSQLServerOLAPService_MSAS2005ProcIndexes"
'"Win32_PerfFormattedData_MSSQLServerOLAPService_MSAS2005StorageEngineQuery"
'"Win32_PerfRawData_MSSQLServerOLAPService_MSAS2005StorageEngineQuery"
'"Win32_PerfFormattedData_MSSQLServerOLAPService_MSAS2005Threads"
'"Win32_PerfRawData_MSSQLServerOLAPService_MSAS2005Threads"
'"Win32_PerfFormattedData_SQLSERVERAGENT_SQLAgentAlerts"
'"Win32_PerfRawData_SQLSERVERAGENT_SQLAgentAlerts"
'"Win32_PerfFormattedData_SQLSERVERAGENT_SQLAgentJobs"
'"Win32_PerfRawData_SQLSERVERAGENT_SQLAgentJobs"
'"Win32_PerfFormattedData_SQLSERVERAGENT_SQLAgentJobSteps"
'"Win32_PerfRawData_SQLSERVERAGENT_SQLAgentJobSteps"
'"Win32_PerfFormattedData_SQLSERVERAGENT_SQLAgentStatistics"
'"Win32_PerfRawData_SQLSERVERAGENT_SQLAgentStatistics"
' SQL Server Test starts here
strOutput = strOutput & vbCrLf & "SQL Server Information:" & vbCrLf
'Buffer Cache Hit Ration
strOutput = strOutput & CheckReverseValue(GetWMIValue("Win32_PerfFormattedData_MSSQLSERVER_SQLServerBufferManager","@","Buffercachehitratio"),"Buffer Cache Hit Ratio",90,85)
strOutput = strOutput & CheckReverseValue(GetWMIValue("Win32_PerfFormattedData_MSSQLSERVER_SQLServerBuffermanager","@","Pagelifeexpectancy"),"Page Life Expectancy",10, 2)
strOutput = strOutput & CheckValue(GetWMIValue("Win32_PerfFormattedData_MSSQLSERVER_SQLServerBuffermanager","@","CheckpointpagesPersec"),"Checkpoint Pages/Sec",100, 200)
strOutput = strOutput & CheckValue(GetWMIValue("Win32_PerfFormattedData_MSSQLSERVER_SQLServerBuffermanager","@","LazywritesPersec"),"Lazy Writes/Sec",100, 200)
'Lock Information
strOutput = strOutput & CheckValue(GetWMIValue("Win32_PerfFormattedData_MSSQLSERVER_SQLServerLocks.Name","""_Total""","LockTimeoutsPersec"),"Locks Timeouts/sec",50, 100)
strOutput = strOutput & CheckValue(GetWMIValue("Win32_PerfFormattedData_MSSQLSERVER_SQLServerLocks.Name","""_Total""","NumberofDeadlocksPersec"),"Number of Deadlocks/sec",2, 5)
'Page Splits Per second
strOutput = strOutput & CheckValue(GetWMIValue("Win32_PerfFormattedData_MSSQLSERVER_SQLServerAccessMethods","@","PageSplitsPersec"),"Page Splits/sec",100, 300)
'SQL Server Databases
strOutput = strOutput & CheckValue(GetWMIValue("Win32_PerfFormattedData_MSSQLSERVER_SQLServerDatabases.Name","""_Total""","ActiveTransactions"),"Active Transactions",1000, 3000)
strOutput = strOutput & CheckValue(GetWMIValue("Win32_PerfFormattedData_MSSQLSERVER_SQLServerDatabases.Name","""_Total""","TransactionsPersec"),"Transactions/sec",1000, 5000)
'SQL General Statistics
strOutput = strOutput & CheckValue(GetWMIValue("Win32_PerfFormattedData_MSSQLSERVER_SQLServerGeneralStatistics","@","LoginsPersec"),"Logins/sec",100, 300)
strOutput = strOutput & CheckValue(GetWMIValue("Win32_PerfFormattedData_MSSQLSERVER_SQLServerGeneralStatistics","@","LogoutsPersec"),"Logout/sec",100, 300)
strOutput = strOutput & CheckValue(GetWMIValue("Win32_PerfFormattedData_MSSQLSERVER_SQLServerGeneralStatistics","@","ActiveTempTables"),"Active Temp Tables",500, 1500)
strOutput = strOutput & CheckValue(GetWMIValue("Win32_PerfRawData_MSSQLSERVER_SQLServerGeneralStatistics","@","UserConnections"),"Number of User Connections",100, 200)
'SQL Cursor Information
strOutput = strOutput & CheckValue(GetWMIValue("Win32_PerfFormattedData_MSSQLSERVER_SQLServerCursorManagerbyType.Name","""_Total""","CursorRequestsPersec"),"Cursor Request/sec",500, 1500)
' Write the file for BB
WriteFile extPath, strTestName, strAlarmState, strOutput
'===========================================================
' FUNCTIONS and SUBS start here
Sub ProcessorCheck ()
Dim WshShell, WshSysEnv
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshSysEnv = WshShell.Environment("SYSTEM")
Proc = WshSysEnv("PROCESSOR_ARCHITECTURE")
End Sub
' This is used to get a percentage value from WMI. It requires the value and the base objects.
' It then returns the percentage
Function GetWMIPercent(strCollection,strInstance,strObject,strBaseObject)
Set counterCollection = GetObject("winmgmts:" & strCollection & "=" & strInstance)
For Each cntproperty In counterCollection.properties_
If cntproperty.name = strObject Then
iObjectValue = CDbl(cntproperty)
ElseIf cntproperty.name = strBaseObject Then
iObjectBaseValue =CDbl(cntproperty)
End If
Next
If iObjectBaseValue = 0 Then
GetWMIPercent = "N/A"
Else
GetWMIPercent = Round(CDbl(iObjectValue) / CDbl(iObjectBaseValue) * CDbl(100),0)
End If
End Function
' This is used to pull a value from WMI.
Function GetWMIValue(strCollection,strInstance,strObject)
Set counterCollection = GetObject("winmgmts:" & strCollection & "=" & strInstance)
For Each cntproperty In counterCollection.properties_
If cntproperty.name = strObject Then
iObjectValue = CDbl(cntproperty)
End If
Next
GetWMIValue = CDbl(iObjectValue)
End Function
' This is used to check the actual value against the warning and alarm.
Function CheckValue(iObjectValue,strObjectDesc,iWarnValue,iAlarmValue)
If iWarnValue > iAlarmValue Then
CheckValue = "&red" & " " & strObjectDesc & ":" & vbTab & "Object is Misconfigured"
If strAlarmState <> "red" Then
strAlarmState = "red"
End If
Else
If CDbl(iObjectValue) > CDbl(iWarnValue) Then
If CDbl(iObjectValue) > CDbl(iAlarmValue) Then
CheckValue = "&red" & " " & strObjectDesc & ":" & vbTab & iObjectValue & vbCrLf
SetAlarmStatus "red"
Else
CheckValue = "&yellow" & " " & strObjectDesc & ":" & vbTab & iObjectValue & vbCrLf
'CheckValue = "&yellow" & strObjectDesc & vbTab & iObjectValue & vbCrLf
SetAlarmStatus "yellow"
End If
Else
CheckValue = "&green" & " " & strObjectDesc & ":" & vbTab & iObjectValue & vbCrLf
'CheckValue = "&green" & strObjectDesc & vbTab & iObjectValue & vbCrLf
End If
End If
End Function
Function ShowDriveList
Dim fso, d, dc, s, n
Set fso = CreateObject("Scripting.FileSystemObject")
Set dc = fso.Drives
For Each d In dc
n = ""
s = s & d.DriveLetter & " - "
If d.DriveType = 3 Then
n = d.ShareName
ElseIf d.IsReady Then
n = d.VolumeName
Else
n = "[Drive not ready]"
End If
s = s & n & "
"
Next
ShowDriveList = s
End Function
' This is used to check the actual value against the warning and alarm.
' This one the alarm will be a lower value than the warning. (Values Decrease rather than increase)
Function CheckReverseValue(iObjectValue,strObjectDesc,iWarnValue,iAlarmValue)
If CDbl(iWarnValue) < CDbl(iAlarmValue) Then
CheckReverseValue = "&red" & " " & strObjectDesc & ":" & vbTab & "Object is Misconfigured"
If strAlarmState <> "red" Then
strAlarmState = "red"
End If
Else
If CDbl(iObjectValue) < CDbl(iWarnValue) Then
If CDbl(iObjectValue) < CDbl(iAlarmValue) Then
CheckReverseValue = "&red" & " " & strObjectDesc & ":" & vbTab & iObjectValue & vbCrLf
SetAlarmStatus "red"
Else
CheckReverseValue = "&yellow" & " " & strObjectDesc & ":" & vbTab & iObjectValue & vbCrLf
SetAlarmStatus "yellow"
End If
Else
CheckReverseValue = "&green" & " " & strObjectDesc & ":" & vbTab & iObjectValue & vbCrLf
End If
End If
End Function
' This is called to set the overall alarm status.
Sub SetAlarmStatus(strnewAlarmState)
If strnewAlarmState = "red" Then
strAlarmState = strnewAlarmState
ElseIf strnewAlarmState = "yellow" Then
If strAlarmState <> "red" Then
strAlarmState = strnewAlarmState
End If
End If
End Sub
' This SUB is used for outputting the file to the external's directory in bb
Sub WriteFile(strExtPath, strTestName, strAlarmState, strOutput)
Set fso = CreateObject("Scripting.FileSystemObject")
strOutput = strAlarmState & " " & Date & " " & Time & vbCrLf & vbCrLf & strOutput & vbCrLf
Set f = fso.OpenTextFile(strExtPath & "\" & strTestName , 8 , True)
f.Write strOutput
f.Close
Set fso = Nothing
End Sub
===== Known Bugs and Issues =====
Two issues that can potentially cause problems:
* Running a 32 Bit Windows on a 64 Bit CPU(It happens apparently). This causes the script to look for the HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\BBWin\tmppath registry key. This does not exist in a 32 windows version and the script will bomb. To fix comment out the Processor check and hard code(yuck) the bath to the BBwin\tmp folder.
* When running the script it throws a null exception which looks something like C:\Program Files (x86)\BBWin\ext\SQLNewWay.vbs(103, 2) (null). To fix this problem open a command prompt and execute the following command wmiadap/f. Open the administrative tools under control panel and run the windows services manager. Right at the bottom of the list there is a WMI Performance Adapter service. Restart the service if started, if the service is not running please start it.
* SQL 2008 There seems to be a problem with some of the counter specifically Buffercachehitratio. This was fixed in the release on 2010-06-21
===== To Do =====
Well this pack can be more comprehensive. In this inital release I hope to spark some debate under the DBA's on the list. My goal is to have a performance pack to help in identifying performance related issues and also provide us with information to provide to the accountants when we need more hardware.
===== Credits =====
I borrowed some code from:
Bart Gillis
Jason Benassi
Most of the other stuff
Neil Franken
As special thanks to Walter Van Loon for being brave enough to step up and test the script with his DBA's.
===== Changelog =====
* **2010-06-18**
* Initial release
* **2010-06-21**
* Updated the code to work with SQL 2008 Instances as well.
* Using Win32_PerfFormattedData_MSSQLSERVER_SQLServerBufferManager class to read values.
* Code contributed by Walter Van Loon.