前言
最终的目的是了解SQL Server实例的运行,但每个实例是跑在windows上的,所以主机级别的稳定性也是不可或缺的,这篇文章主要围绕这张图的windows主机节点部分来讲。
一 工具
工欲善其事,必先利其器。要做windows的性能监控除了要了解我们关注的性能点外还要去准确的收集处理。收集这些数据的方式有很多,这里我主要讲我们监控中用到的两种工具:powershell和perfmon。
1.1. powershell
类似linux的shell,是微软为windows开发的壳程序,我们可以借助powershell编写很多脚本程序来完成一些自动化的工作。
get-counter
get-counter是powershell获取windows performance counter的接口命令,而performance counter如同它的英文名一样代表了系统相关的性能计数器,也就是说我们可以用powershell来获取我们关注的metrics信息,当然performance counter的值也不只这么一种获取方式。
get-wmiobject
WMI(Windows Management Instrumentation,Windows 管理规范)是一项核心的 Windows 管理技术,是对windows资源的一种抽象,通过它我们可以直接访问、配置、管理和监视近乎所有windows资源。同样通过powershell的get-wmiobject我们可以监控到所有资源。
1.2. perfmon
perfmon主要是windows系统自带的性能监控工具,它可以将我们关注的metrics以图形化的方式展现出来,并且还可以抓取一段时间的性能数据生成性能报告方便我们查看结果。
在我们的windows主机性能监控中主要借助powershell来获取监控数据,perfmon可以帮我们更加实时的查看问题也可以在做相关测试时用到。
二 metrics
2.1. CPU相关
%Processor Time
命令:Get-Counter -Counter ‘Processor(_Total)% Processor Time’
解释:获取本机所有处理器的使用率,瞬时值。它的计算方式是首先获得cpu执行空闲线程的时间,因为每个cpu上都有一个空闲线程,当没有任务的时候就执行空闲线程,通过计算空闲线程的执行时间进而得到cpu忙碌的时间。
公式:
问题:通过这个命令我们可以得到cpu瞬时的使用率,但是并不能很好的反映出一段时间的cpu使用情况,假使cpu在2分钟前非常忙碌并且已经产生瓶颈而我的监控粒度又比较粗,每5分钟取一次数据,那么我就无法得知cpu准确的使用情况,不能一下找出性能瓶颈可能会怀疑是磁盘或者内存的问题,这样非常耽误事儿。
解决:1.通过增加SampleInterval参数来获取一段时间的平均值,从而准确的了解这段时间内cpu的使用情况,但很容易理解的是加了这个参数会让脚本程序阻塞到这,它会等待这样一段时间后再返回结果,这样会降低并发影响我们的性能数据收集。
2.减小性能数据采集的时间间隔,尽量做到秒级,然后可以再通过求均值的尽量让数据能准确反映一段时间内的cpu使用情况,但数据收集的粒度到底有多细致还得看集群的大小和采集的方式。如果是通过pull,也就是存在中心节点定时到每个监控节点取数据,那么随着集群规模的增长,监控的粒度肯定会受影响,中心节点会成为瓶颈。而如果是通过push,每个监控节点都有相应的agent来做数据的收集,不存在中心节点,那么能够支撑的集群规模会大很多,监控粒度也能细致很多。
(以下数据的收集都是一样的问题,我就不复述了,具体到每个metrics肯能会存在不同的计算方式,这个可以参考微软官方详细说明)
% Privileged Time
命令:Get-Counter -Counter ‘Processor(_Total)% Privileged Time’
Get-Counter -Counter ‘Processor(_Total)% Privileged Time’ -SampleInterval X
解释:对应于处理器执行 Microsoft Windows 内核命令(例如处理 SQL Server I/O 请求)所用时间的百分比。,类似linux的sys。
公式:
% User Time
命令:Get-Counter -Counter ‘Processor(_Total)% User Time’
解释:cpu执行用户进程的时间百分比,类似linux的user。
计算方式同privileged time。
System Processor Queue Length
命令:Get-Counter -Counter ‘SystemProcessor Queue Length’
解释:处理队列的线程数,它使指需要处理的,而不是正在处理的。
SUM (N) / x
2.2. 存储相关
关于磁盘响应时间
Avg. Disk sec/Transfer
命令:Get-Counter -Counter ‘PhysicalDisk(_Total)Avg. Disk sec/Transfer’
解释:显示存储端处理每个IO请求的平均响应时间。
Avg. Disk sec/Read
命令:Get-Counter -Counter ‘PhysicalDisk(_Total)Avg. Disk sec/Read’
解释:显示存储端处理每个读IO的平均响应时间。
Avg. Disk sec/Write
命令:Get-Counter -Counter ‘PhysicalDisk(_Total)Avg. Disk sec/Write’
解释:显示存储端处理每个写IO的平均响应时间。
关于IOPS
Disk Transfers/sec
命令:Get-Counter -Counter ‘PhysicalDisk(_Total)Disk Transfers/sec’
解释:显示了磁盘上的IOPS总数,直观的显示了所对应LUN上的每秒IO的吞吐量。
Disk Reads/sec
命令:Get-Counter -Counter ‘PhysicalDisk(_Total)Disk Reads/sec’
解释:显示磁盘每秒的读IO数量。
Disk Writes/sec
命令:Get-Counter -Counter ‘PhysicalDisk(_Total)Disk Write/sec’
解释:显示磁盘每秒的写IO数量。
关于Throughput
Disk Bytes/sec
命令:Get-Counter -Counter ‘PhysicalDisk(_Total)Disk Bytes/sec’
解释:磁盘上总得数据传输量,包括读写。
Disk Read Bytes/sec
命令:Get-Counter -Counter ‘PhysicalDisk(_Total)Disk Read Bytes/sec’| format-table –auto
解释:磁盘上每秒读数据的传输量。
Disk Write Bytes/sec
命令:Get-Counter -Counter ‘PhysicalDisk(_Total)Disk Write Bytes/sec’| format-table –auto
解释:磁盘上每秒写数据的传输量。
2.3 内存相关
Pages/sec
命令:Get-Counter -Counter ‘MemoryPages/sec’
解释:每秒发生的硬错误页数,包括从磁盘读取的和写入磁盘释放工作空间的,类似linux的swap。
FreePhysicalMemory,TotalVisibleMemorySize
命令:Get-WmiObject -Query ‘Select * from Win32_OperatingSystem’ | Select FreePhysicalMemory,TotalVisibleMemorySize | Format-Table -AutoSize”
解释:获取空闲内存和总内存,可以用于计算内存使用率等。
2.4 网络相关
Bytes Total/sec
命令:Get-Counter –Counter ‘Network Interface(*)Bytes Total/sec’ | format-table –auto
解释:获取所有网卡的流量,并未求和只是分别获取。
Bytes Received/sec
命令:Get-Counter –Counter ‘Network Interface(*)Bytes Received/sec’ | format-table –auto
解释:获取所有网卡的流入量。
Bytes Sent/sec
命令:Get-Counter –Counter ‘Network Interface(*)Bytes Sent/sec’ | format-table –auto
解释:获取所有网卡的流出量。
Packets Received/sec
命令:Get-Counter -Counter ‘Network Interface(*)Packets Received/sec’ | format-table –auto
解释:获取所有网卡的收到的数据包的数量。
Packets Sent/sec
命令:Get-Counter -Counter ‘Network Interface(*)Packets Sent/sec’ | format-table –auto
解释:获取所有网卡的发送包得数量。