WINDOWS主機的性能監控
前言
最終的目的是了解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
解釋:獲取所有網卡的發送包得數量。
最後更新:2017-04-03 08:26:18