系統城裝機大師 - 唯一官網:www.farandoo.com!

當前位置:首頁 > 腳本中心 > PowerShell > 詳細頁面

如何利用PowerShell監控Win-Server性能詳解

時間:2020-01-28來源:系統城作者:電腦系統城

前言

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

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

本文就給大家介紹了關于利用PowerShell監控Win-Server性能的相關內容,下面話不多說了,來一起看看詳細的介紹吧

一、關于PowerShell

1、什么是PowerShell

  表層面的翻譯:強大的Shell。

  強大?

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

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

2、如何打開PowerShell

  1)Win鍵+R,輸入cmd,然后cmd會話框里再輸入powershell

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

  3)或是直接找到Windows PowerShell程序打開

3、學習PowerShell

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

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

二、PowerShell腳本的編寫與執行

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

  1)對于簡單的小腳本編寫,可以通過echo命令重定向進文件,或是將腳本文件通過@‘ '@閉合起來


 
  1. PS E:\> echo "Hello China"
  2. Hello China
  3. PS E:\> echo "Hello China">hello.psl
  4. PS E:\> cat .\hello.psl
  5. Hello China
  6. PS E:\> @'
  7. >> dir
  8. >> help dir
  9. >> ls
  10. >> '@>test.psl

  2)復雜點的大腳本編寫,一般借助文本編輯器方便些。

2、腳本執行

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

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

3、執行策略限制

  腳本能否執行取決于Powershell的執行策略;

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


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

  查看所有支持的執行策略:

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

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

  3>AllSigned:所有腳本都必須經過簽名才能在運行。

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

三、獲取系統性能情況

1、主機名

PS D:\> $env:computername

2、CPU使用情況

  注意,-f:-filter:過濾,執行;對于不是很清楚的命令可以通過 man 命令 來獲取幫助。

3、內存使用情況


 
  1. PS D:\> $mem = gwmi win32_OperatingSystem
  2. PS D:\> $mem
  3. SystemDirectory : C:\Windows\system32
  4. Organization :
  5. BuildNumber : 15063
  6. RegisteredUser : Windows 用戶
  7. SerialNumber : 00331-10000-00001-AA275
  8. Version : 10.0.15063

  1)總內存:


 
  1. PS D:\> $Allmem = "{0:0.0} MB" -f ($mem.TotalVisibleMemorySize / 1KB)
  2. PS D:\> $Allmem
  3. 4003.4 MB

  2)剩余內存:


 
  1. PS D:\> $Freemem = "{0:0.0} MB" -f ($mem.FreePhysicalMemory / 1KB)
  2. PS D:\> $Freemem
  3. 285.5 MB

  3)內存使用比:


 
  1. PS D:\> $Permem = "{0:0.0} %" -f ((($mem.TotalVisibleMemorySize-$mem.FreePhysicalMemory)/$mem.TotalVisibleMemorySize)*100)
  2. PS D:\> $Permem
  3. 92.9 %

4、磁盤使用情況

  1)多條件過濾:只獲取D、E磁盤的信息

  PS D:\> gwmi win32_logicaldisk -f "drivetype=3 and (DeviceID='E:' or DeviceID='D:')"

  2)輔助智能顯示信息:


 
  1. PS D:\> gwmi Win32_LogicalDisk | Foreach-Object { 'Disk {0} has {1:0.0} GB space available' -f $_.Caption, ($_.FreeSpace / 1024MB) }
  2. Disk C: has 53.1 GB space available
  3. Disk D: has 183.5 GB space available
  4. Disk E: has 164.1 GB space available

5、大合集:執行腳本獲取CPU、內存信息


 
  1. PS D:\> cat .\GetCPUMem.ps1
  2. $Server = $env:computername
  3. #server's CPU Mem Hardinfor
  4. $cpu = Get-WMIObject –computername $Server win32_Processor
  5. $mem = gwmi -ComputerName $Server win32_OperatingSystem
  6. $Disks = gwmi –Computer: $Server win32_logicaldisk -filter "drivetype=3"
  7. $Havecpu = "{0:0.0} %" -f $cpu.LoadPercentage
  8. $Allmem = "{0:0.0} MB" -f ($mem.TotalVisibleMemorySize / 1KB)
  9. $Freemem = "{0:0.0} MB" -f ($mem.FreePhysicalMemory / 1KB)
  10. $Permem = "{0:0.0} %" -f ((($mem.TotalVisibleMemorySize-$mem.FreePhysicalMemory)/$mem.TotalVisibleMemorySize)*100)
  11. Write-Host "COMPUTER:$Server"`r`n
  12. # `r`n表示換行輸出
  13. Write-Host "CPU:$Havecpu"`r`n
  14. Write-Host "Total Mem:$Allmem"
  15. Write-Host "Free Mem:$Freemem"
  16. Write-Host "Used Mem:$Permem"`r`n
  17. $IpAdd = (Get-WmiObject -class win32_NetworkAdapterConfiguration -Filter 'ipenabled = "true"').ipaddress[0]
  18. Write-Host "Ipaddress:$IpAdd"`r`n
  19.  
  20. PS D:\> .\GetCPUMem.ps1
  21. COMPUTER:DESKTOP-P8MIUHK
  22.  
  23. CPU:15.0 %
  24.  
  25. Total Mem:4003.4 MB
  26. Free Mem:272.9 MB
  27. Used Mem:93.2 %
  28.  
  29. Ipaddress:192.168.203.111

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

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

  死循環作業,只需要啟動一次job即ok,如果擔心重啟之后停掉,就設置:start automatically when SQL Server Agent start。

2、監控標準把控

  1)CPU:80%

  2)內存:60% (通過io 和 ple 側面反映內存情況)

  3)Disk:90%

3、T-SQL存儲過程


 
  1. USE [TestDB]
  2. GO
  3. /*系統性能監控:CPU、內存、disk*/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. ALTER proc M_cpumem
  9. --手動獲取數據庫服務器IP
  10. @ip nvarchar(20)
  11. AS
  12. BEGIN
  13. /*獲取CPU、內存使用情況信息*/
  14. --作業Get-CPU_Mem,執行powershell腳本
  15. DECLARE @cm nvarchar(100)
  16. SET @cm=(
  17. SELECT log
  18. FROM msdb.dbo.sysjobstepslogs)
  19. --cpu使用率
  20. DECLARE @cpu int
  21. SET @cpu=CAST((SELECT SUBSTRING(@cm,5,4)) AS numeric(2,0))
  22. --內存使用率
  23. DECLARE @mem int
  24. SET @mem=CAST((SELECT SUBSTRING(@cm,22,4)) AS numeric(2,0))
  25.  
  26. /*CPU過載報警監控*/
  27. --CPU使用率大于80%說明系統出現高耗
  28. IF (@cpu>80)
  29. BEGIN
  30. DECLARE @str_subject_cpu nvarchar(100),@str_html_cpu nvarchar(max);
  31. SET @str_subject_cpu='服務器:'+@ip+' CPU高耗報警'
  32. --CPU或調度器當前分配的工作情況
  33. SET @str_html_cpu='Dear All:
  34. <br>  系統CPU>80%,請參閱系統調度情況,進行性能優化處理!<br>
  35. <table border=1 >'+
  36. '<tr>
  37. <td style="width: 80px"><p align="center" >Scheduler_ID</p></td>
  38. <td style="width: 80px"><p align="center" >CPU_ID</p></td>
  39. <td style="width: 150px"><p align="center" >狀態</p></td>
  40. <td style="width: 80px"><p align="center" >Is_Idle</p></td>
  41. <td style="width: 90px"><p align="center" >當前任務數</p></td>
  42. <td style="width: 80px"><p align="center" >等待調度線程數</p></td>
  43. <td style="width: 90px"><p align="center" >當前線程數</p></td>
  44. <td style="width: 90px"><p align="center" >活動線程數</p></td>
  45. <td style="width: 90px"><p align="center" >掛起任務數</p></td>
  46. </tr>'+
  47. CAST((
  48. SELECT
  49. td=scheduler_id,'',
  50. td=cpu_id,'',
  51. td=status,'',
  52. td=is_idle,'',
  53. td=current_tasks_count,'',
  54. td=runnable_tasks_count,'',
  55. td=current_workers_count,'',
  56. td=active_workers_count,'',
  57. td=work_queue_count,''
  58. FROM master.sys.dm_os_schedulers
  59. WHERE scheduler_id<255
  60. FOR xml path('tr'),type
  61. ) AS nvarchar(max))+
  62. N'</table>';
  63. BEGIN
  64. EXEC msdb.dbo.sp_send_dbmail
  65. @profile_name='Email',
  66. @recipients='xxx@xxx.com',
  67. @subject=@str_subject_cpu,
  68. @body=@str_html_cpu,
  69. @body_format='HTML'
  70. END
  71. END
  72.  
  73. /*內存過載報警監控*/
  74. --內存使用率大于60%說明系統出現高耗
  75. IF (@mem>60)
  76. BEGIN
  77. DECLARE @str_subject_mem nvarchar(100),@str_html_mem nvarchar(max);
  78. SET @str_subject_mem='服務器:'+@ip+' 內存高耗報警'
  79. --系統性能計數器
  80. SET @str_html_mem='Dear All:
  81. <br>  系統Memory>60%,請參閱系統性能監控情況,進行性能優化處理!<br>
  82. <table border=1 >'+
  83. '<tr>
  84. <td style="width: 150px"><p align="center" >Object_Name</p></td>
  85. <td style="width: 150px"><p align="center" >Counter_Name</p></td>
  86. <td style="width: 100px"><p align="center" >Value</p></td>
  87. </tr>'+
  88. CAST((
  89. SELECT
  90. td=object_name,'',
  91. td=counter_name,'',
  92. td=cntr_value,''
  93. FROM sys.dm_os_performance_counters
  94. WHERE object_name in ('SQLServer:Buffer Manager','SQLServer:Memory Manager')
  95. 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)')
  96. FOR xml path('tr'),type
  97. ) AS nvarchar(max))+
  98. N'</table>';
  99. BEGIN
  100. EXEC msdb.dbo.sp_send_dbmail
  101. @profile_name='Email',
  102. @recipients='xxx@xxx.com',
  103. @subject=@str_subject_mem,
  104. @body=@str_html_mem,
  105. @body_format='HTML'
  106. END
  107. END
  108.  
  109. /*磁盤使用報警監控*/
  110. --磁盤可使用率小于15%時進行郵件報警
  111. CREATE TABLE temp_disk_space(Drive_Name nvarchar(50),Total_Space_GBNUMERIC(18,2),Free_Space_GB NUMERIC(18,2))
  112. INSERT INTO temp_disk_space
  113. SELECT DISTINCT
  114. vs.volume_mount_point,
  115. CAST(vs.total_bytes / 1024.0 / 1024 / 1024 AS NUMERIC(18,2)),
  116. CAST(vs.available_bytes / 1024.0 / 1024 / 1024 AS NUMERIC(18,2))
  117. FROM sys.master_files AS f
  118. CROSS APPLY sys.dm_os_volume_stats(f.database_id,f.file_id) AS vs
  119.  
  120. SELECT Drive_Name,(Free_Space_GB * 100)/Total_Space_GB AS [% Free_Space]
  121. INTO #temp_space_monitor
  122. FROM temp_disk_space
  123. ORDER BY Drive_Name
  124.  
  125. IF exists(SELECT 1 FROM #temp_space_monitor WHERE [% Free_Space] < 15)
  126. BEGIN
  127. DECLARE @str_subject_disk nvarchar(100);
  128. SET @str_subject_disk='服務器:'+@ip+' 磁盤空間不足'
  129. EXEC msdb.dbo.sp_send_dbmail
  130. @profile_name='Email',
  131. @recipients='xxx@xxx.com',
  132. @subject=@str_subject_disk,
  133. @body = 'Dear ALL:
  134. 請及時清理磁盤,磁盤空間使用情況見附件!',
  135. @query = 'SELECT * FROM TestDB.dbo.temp_disk_space', --使用全稱
  136. @attach_query_result_as_file = 1,
  137. @query_attachment_filename = 'disk.txt'
  138. END
  139.  
  140. DROP table TestDB.dbo.temp_disk_space, #temp_space_monitor
  141.  
  142. END

4、最后就是將上面的存儲過程添加到定時作業里進行監控

總結:

最后的功能是實現了,到達了Windows Server性能的監控要求,但是,各種波折的獲取性能信息,真的是很難把控到“實時監控”。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支持。

分享到:

相關信息

  • Powershell 腳本數字簽名實現方法

    腳本很容易被冒名頂替或者更改,因為它們是由純文本構成的。數字簽名為腳本提供了更高的安全性,因為它能確定腳本和腳本的編輯者的唯一性,并且不能被更改。作為腳本的發布者,你能確定你的腳本沒有被惡意篡改。即使專家也無...

    2020-01-28

  • PowerShell 語音計算器實現代碼

    帶中文發音功能的計算器程序,支持鼠標和小鍵盤輸入,支持多種數值轉人民幣的相關資料...

    2020-01-28

系統教程欄目

欄目熱門教程

人氣教程排行

站長推薦

熱門系統下載

jlzzjlzz亚洲乱熟在线播放