利用PowerShell監控Win-Server性能

Q:如何系統層面的去監控一下Windows Server?html

A:額……一時間的話……能想到的可能也就是PowerShell+SQL Server+job,試試。shell

一、關於PowerShell數據庫

二、PowerShell腳本的編寫與執行windows

三、獲取系統性能狀況安全

PowerShell+SQL Server+job 實現監控性能優化

1、關於PowerShell服務器

一、什麼是PowerShell網絡

  表層面的翻譯:強大的Shell。編輯器

  強大?性能

  若是是從知名度和用戶的使用量來談的話,PowerShell相較當下流行的一些面向對象的語言來講應該是遜色太多太多了,可是,做爲一款系統內置的腳本語言,和Linux裏的Shell同樣,說其強大固然是不容置喙的。

  Windows PowerShell 是一種命令行外殼程序和腳本環境,是運行在windows機器上實現系統和應用程序管理自動化的命令行腳本環境,使命令行用戶和腳本編寫者能夠利用 .NET Framework的強大功能。你能夠把它當作是命令行提示符cmd.exe的擴充,不對,應當是顛覆。 powershell須要.NET環境的支持,同時支持.NET對象。微軟之因此將Powershell 定位爲Power,並非誇大其詞,由於它徹底支持對象。其可讀性,易用性,能夠位居當前全部shell之首。

二、如何打開PowerShell

  1)Win鍵+R,輸入cmd,而後cmd會話框裏再輸入powershell

  2)Win鍵+R,輸入powershell,即來到其會話框

  3)或是直接找到Windows PowerShell程序雙擊或是管理員打開

三、學習PowerShell

  一開始接觸到PowerShell的時候,也是有一些懵圈的,但多少也仍是和DOS、Shell命令有些類似之處,習慣就好。

  推薦學習網站:http://www.pstips.net/powershell-online-tutorials/

 

2、PowerShell腳本的編寫與執行

一、編寫腳本(.psl擴展名的腳本文件

  1)對於簡單的小腳本編寫,能夠經過echo命令重定向進文件,或是將腳本文件經過@‘ ’@閉合起來

PS E:\> echo "Hello China" Hello China PS E:\> echo "Hello China">hello.psl PS E:\> cat .\hello.psl Hello China PS E:\> @' >> dir >> help dir >> ls >> '@>test.psl

  2)複雜點的大腳本編寫,通常藉助文本編輯器方便些。

二、腳本執行

  1)PowerShell腳本的執行直接是使用腳本文件的相對路徑,或者絕對路徑

  2)經過別名設置(> Set-Alias),將腳本的執行語句保存爲別名,如此,就能像輸入命令同樣的執行腳本

三、執行策略限制

  腳本可否執行取決於Powershell的執行策略;

  Powershell通常初始化狀況下都會禁止腳本執行。只有管理員纔有權限更改該策略,非管理員會報錯。以管理員身份打開powershell:

PS E:\> Get-ExecutionPolicy Restricted PS E:\> Set-ExecutionPolicy Unrestricted 執行策略更改 執行策略可幫助你防止執行不信任的腳本。更改執行策略可能會產生安全風險,如 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies 幫助主題所述。是否要更改執行策略? [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暫停(S) [?] 幫助 (默認值爲「N」): y

  查看全部支持的執行策略:

  1>Unrestricted:權限最高,能夠不受限制執行任何腳本。

  2>Default:爲Powershell默認的策略:Restricted,不容許任何腳本執行。

  3>AllSigned:全部腳本都必須通過簽名才能在運行。

  4>RemoteSigned:本地腳本無限制,可是對來自網絡的腳本必須通過簽名。

 

3、獲取系統性能狀況

一、主機名
PS D:\> $env:computername
二、CPU使用狀況
   注意, -f:-filter:過濾,執行; 對於不是很清楚的命令能夠經過 man 命令 來獲取幫助。
三、內存使用狀況
PS D:\> $mem = gwmi win32_OperatingSystem PS D:\> $mem SystemDirectory : C:\Windows\system32 Organization : BuildNumber : 15063 RegisteredUser : Windows 用戶 SerialNumber : 00331-10000-00001-AA275 Version : 10.0.15063
  1)總內存:
PS D:\> $Allmem = "{0:0.0} MB" -f ($mem.TotalVisibleMemorySize / 1KB) PS D:\> $Allmem
4003.4 MB
  2)剩餘內存:
PS D:\> $Freemem = "{0:0.0} MB" -f ($mem.FreePhysicalMemory / 1KB) PS D:\> $Freemem
285.5 MB
  3)內存使用比:
PS D:\> $Permem = "{0:0.0} %" -f ((($mem.TotalVisibleMemorySize-$mem.FreePhysicalMemory)/$mem.TotalVisibleMemorySize)*100) PS D:\> $Permem
92.9 %
四、磁盤使用狀況
  1)多條件過濾: 只獲取D、E磁盤的信息
  PS D:\> gwmi win32_logicaldisk -f "drivetype=3 and (DeviceID='E:' or DeviceID='D:')"
  2)輔助智能顯示信息:
PS D:\> gwmi Win32_LogicalDisk | Foreach-Object { 'Disk {0} has {1:0.0} GB space available' -f $_.Caption, ($_.FreeSpace / 1024MB) } Disk C: has 53.1 GB space available Disk D: has 183.5 GB space available Disk E: has 164.1 GB space available
五、大合集:執行腳本獲取CPU、內存信息
PS D:\> cat .\GetCPUMem.ps1 $Server = $env:computername
#server's CPU Mem Hardinfor
  $cpu = Get-WMIObject –computername $Server win32_Processor $mem = gwmi -ComputerName $Server win32_OperatingSystem $Disks = gwmi –Computer: $Server win32_logicaldisk -filter "drivetype=3"
  $Havecpu = "{0:0.0} %" -f $cpu.LoadPercentage $Allmem = "{0:0.0} MB" -f ($mem.TotalVisibleMemorySize  / 1KB) $Freemem = "{0:0.0} MB" -f ($mem.FreePhysicalMemory  / 1KB) $Permem =  "{0:0.0} %" -f ((($mem.TotalVisibleMemorySize-$mem.FreePhysicalMemory)/$mem.TotalVisibleMemorySize)*100) Write-Host "COMPUTER:$Server"`r`n # `r`n表示換行輸出
  Write-Host "CPU:$Havecpu"`r`n Write-Host "Total Mem:$Allmem" Write-Host "Free Mem:$Freemem" Write-Host "Used Mem:$Permem"`r`n $IpAdd = (Get-WmiObject -class win32_NetworkAdapterConfiguration -Filter 'ipenabled = "true"').ipaddress[0] Write-Host "Ipaddress:$IpAdd"`r`n PS D:\> .\GetCPUMem.ps1 COMPUTER:DESKTOP-P8MIUHK CPU:15.0 % Total Mem:4003.4 MB Free Mem:272.9 MB Used Mem:93.2 % Ipaddress:192.168.203.111

 

4、系統性能監控:CPU、內存、Disk

一、利用psl腳本獲取性能信息

  死循環做業,只須要啓動一次job即ok,若是擔憂重啓以後停掉,就設置:start automatically when SQL Server Agent start。

二、監控標準把控
  1)CPU:80%
  2)內存:60% (經過io 和 ple 側面反映內存狀況)
  3)Disk:90%
三、T-SQL存儲過程
USE [TestDB]
GO
/*系統性能監控:CPU、內存、disk*/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc M_cpumem --手動獲取數據庫服務器IP
@ip nvarchar(20) AS
BEGIN
    /*獲取CPU、內存使用狀況信息*/
    --做業Get-CPU_Mem,執行powershell腳本
    DECLARE @cm nvarchar(100) SET @cm=( SELECT log  
        FROM msdb.dbo.sysjobstepslogs) --cpu使用率
    DECLARE @cpu int
    SET @cpu=CAST((SELECT SUBSTRING(@cm,5,4)) AS numeric(2,0)) --內存使用率
    DECLARE @mem int
    SET @mem=CAST((SELECT SUBSTRING(@cm,22,4)) AS numeric(2,0)) /*CPU過載報警監控*/
    --CPU使用率大於80%說明系統出現高耗
    IF (@cpu>80) BEGIN
        DECLARE @str_subject_cpu nvarchar(100),@str_html_cpu nvarchar(max); SET @str_subject_cpu='服務器:'+@ip+' CPU高耗報警'
        --CPU或調度器當前分配的工做狀況
        SET @str_html_cpu='Dear All: <br>&nbsp;&nbsp;系統CPU>80%,請參閱系統調度狀況,進行性能優化處理!<br> <table border=1 >'+
                '<tr> <td style="width: 80px"><p align="center" >Scheduler_ID</p></td> <td style="width: 80px"><p align="center" >CPU_ID</p></td> <td style="width: 150px"><p align="center" >狀態</p></td> <td style="width: 80px"><p align="center" >Is_Idle</p></td> <td style="width: 90px"><p align="center" >當前任務數</p></td> <td style="width: 80px"><p align="center" >等待調度線程數</p></td> <td style="width: 90px"><p align="center" >當前線程數</p></td> <td style="width: 90px"><p align="center" >活動線程數</p></td> <td style="width: 90px"><p align="center" >掛起任務數</p></td> </tr>'+
            CAST(( SELECT td=scheduler_id,'', td=cpu_id,'', td=status,'', td=is_idle,'', td=current_tasks_count,'', td=runnable_tasks_count,'', td=current_workers_count,'', td=active_workers_count,'', td=work_queue_count,''
                FROM master.sys.dm_os_schedulers WHERE scheduler_id<255
                FOR xml path('tr'),type ) AS nvarchar(max))+ N'</table>'; BEGIN    
            EXEC msdb.dbo.sp_send_dbmail @profile_name='Email', @recipients='xxx@xxx.com', @subject=@str_subject_cpu, @body=@str_html_cpu, @body_format='HTML'                
        END
    END
    
    /*內存過載報警監控*/
    --內存使用率大於60%說明系統出現高耗
    IF (@mem>60) BEGIN
        DECLARE @str_subject_mem nvarchar(100),@str_html_mem nvarchar(max); SET @str_subject_mem='服務器:'+@ip+' 內存高耗報警'
        --系統性能計數器
        SET @str_html_mem='Dear All: <br>&nbsp;&nbsp;系統Memory>60%,請參閱系統性能監控狀況,進行性能優化處理!<br> <table border=1 >'+    
                '<tr> <td style="width: 150px"><p align="center" >Object_Name</p></td> <td style="width: 150px"><p align="center" >Counter_Name</p></td> <td style="width: 100px"><p align="center" >Value</p></td> </tr>'+
            CAST(( SELECT td=object_name,'', td=counter_name,'', td=cntr_value,''
                FROM sys.dm_os_performance_counters WHERE object_name in ('SQLServer:Buffer Manager','SQLServer:Memory Manager') AND counter_name in ('Buffer cache hit ratio','Checkpoint pages/sec','Lazy writes/sec','Page lIFe expectancy','Memory Grants PENDing','Target Server Memory (KB)','Total Server Memory (KB)') FOR xml path('tr'),type ) AS nvarchar(max))+ N'</table>'; BEGIN    
            EXEC msdb.dbo.sp_send_dbmail @profile_name='Email', @recipients='xxx@xxx.com', @subject=@str_subject_mem, @body=@str_html_mem, @body_format='HTML'                
        END
    END

    /*磁盤使用報警監控*/
    --磁盤可以使用率小於15%時進行郵件報警
    CREATE TABLE temp_disk_space(Drive_Name nvarchar(50),Total_Space_GB NUMERIC(18,2),Free_Space_GB NUMERIC(18,2)) INSERT INTO temp_disk_space SELECT DISTINCT vs.volume_mount_point, CAST(vs.total_bytes / 1024.0 / 1024 / 1024 AS NUMERIC(18,2)), CAST(vs.available_bytes / 1024.0 / 1024 / 1024  AS NUMERIC(18,2)) FROM sys.master_files AS f CROSS APPLY sys.dm_os_volume_stats(f.database_id,f.file_id) AS vs SELECT Drive_Name,(Free_Space_GB * 100)/Total_Space_GB AS [% Free_Space]  
    INTO #temp_space_monitor FROM temp_disk_space ORDER BY Drive_Name IF exists(SELECT 1 FROM #temp_space_monitor WHERE [% Free_Space] < 15) BEGIN
        DECLARE @str_subject_disk nvarchar(100); SET @str_subject_disk='服務器:'+@ip+' 磁盤空間不足'    
        EXEC msdb.dbo.sp_send_dbmail @profile_name='Email', @recipients='xxx@xxx.com', @subject=@str_subject_disk, @body = 'Dear ALL: 請及時清理磁盤,磁盤空間使用狀況見附件!', @query = 'SELECT * FROM TestDB.dbo.temp_disk_space',    --使用全稱
        @attach_query_result_as_file = 1, @query_attachment_filename = 'disk.txt'
    END   
    
    DROP table TestDB.dbo.temp_disk_space, #temp_space_monitor END
四、最後就是將上面的存儲過程添加到定時做業裏進行監控
 
總結:最後的功能是實現了,到達了Windows Server性能的監控要求,可是,幾經波折地獲取性能信息,真的是有點兒難把控到「實時監控」。
相關文章
相關標籤/搜索