如何利用PowerShell監(jiān)控Win-Server性能詳解
Q:如何系統(tǒng)層面的去監(jiān)控一下Windows Server?
A:額……一時(shí)間的話(huà)……能想到的可能也就是PowerShell+SQL Server+job,試試。
本文就給大家介紹了關(guān)于利用PowerShell監(jiān)控Win-Server性能的相關(guān)內(nèi)容,下面話(huà)不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧
一、關(guān)于PowerShell
1、什么是PowerShell
表層面的翻譯:強(qiáng)大的Shell。
強(qiáng)大?
如果是從知名度和用戶(hù)的使用量來(lái)談的話(huà),PowerShell相較當(dāng)下流行的一些面向?qū)ο蟮恼Z(yǔ)言來(lái)說(shuō)應(yīng)該是遜色太多太多了,但是,作為一款系統(tǒng)內(nèi)置的腳本語(yǔ)言,和Linux里的Shell一樣,說(shuō)其強(qiáng)大當(dāng)然是不容置喙的。
Windows PowerShell 是一種命令行外殼程序和腳本環(huán)境,是運(yùn)行在windows機(jī)器上實(shí)現(xiàn)系統(tǒng)和應(yīng)用程序管理自動(dòng)化的命令行腳本環(huán)境,使命令行用戶(hù)和腳本編寫(xiě)者可以利用 .NET Framework的強(qiáng)大功能。你可以把它看成是命令行提示符cmd.exe的擴(kuò)充,不對(duì),應(yīng)當(dāng)是顛覆。 powershell需要.NET環(huán)境的支持,同時(shí)支持.NET對(duì)象。微軟之所以將Powershell 定位為Power,并不是夸大其詞,因?yàn)樗耆С謱?duì)象。其可讀性,易用性,可以位居當(dāng)前所有shell之首。
2、如何打開(kāi)PowerShell
1)Win鍵+R,輸入cmd,然后cmd會(huì)話(huà)框里再輸入powershell
2)Win鍵+R,輸入powershell,即來(lái)到其會(huì)話(huà)框
3)或是直接找到Windows PowerShell程序打開(kāi)
3、學(xué)習(xí)PowerShell
一開(kāi)始接觸到PowerShell的時(shí)候,也是有一些懵圈的,但多少也還是和DOS、Shell命令有些相似之處,習(xí)慣就好。
推薦學(xué)習(xí)網(wǎng)站:http://www.pstips.net/powershell-online-tutorials/
二、PowerShell腳本的編寫(xiě)與執(zhí)行
1、編寫(xiě)腳本(.psl擴(kuò)展名的腳本文件)
1)對(duì)于簡(jiǎn)單的小腳本編寫(xiě),可以通過(guò)echo命令重定向進(jìn)文件,或是將腳本文件通過(guò)@‘ '@閉合起來(lái)
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)復(fù)雜點(diǎn)的大腳本編寫(xiě),一般借助文本編輯器方便些。
2、腳本執(zhí)行
1)PowerShell腳本的執(zhí)行直接是使用腳本文件的相對(duì)路徑,或者絕對(duì)路徑
2)通過(guò)別名設(shè)置(> Set-Alias),將腳本的執(zhí)行語(yǔ)句保存為別名,如此,就能像輸入命令一樣的執(zhí)行腳本
3、執(zhí)行策略限制
腳本能否執(zhí)行取決于Powershell的執(zhí)行策略;
Powershell一般初始化情況下都會(huì)禁止腳本執(zhí)行。只有管理員才有權(quán)限更改該策略,非管理員會(huì)報(bào)錯(cuò)。以管理員身份打開(kāi)powershell:
PS E:\> Get-ExecutionPolicy Restricted PS E:\> Set-ExecutionPolicy Unrestricted 執(zhí)行策略更改 執(zhí)行策略可幫助你防止執(zhí)行不信任的腳本。更改執(zhí)行策略可能會(huì)產(chǎn)生安全風(fēng)險(xiǎn),如 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies 幫助主題所述。是否要更改執(zhí)行策略? [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暫停(S) [?] 幫助 (默認(rèn)值為“N”): y
查看所有支持的執(zhí)行策略:

1>Unrestricted:權(quán)限最高,可以不受限制執(zhí)行任何腳本。
2>Default:為Powershell默認(rèn)的策略:Restricted,不允許任何腳本執(zhí)行。
3>AllSigned:所有腳本都必須經(jīng)過(guò)簽名才能在運(yùn)行。
4>RemoteSigned:本地腳本無(wú)限制,但是對(duì)來(lái)自網(wǎng)絡(luò)的腳本必須經(jīng)過(guò)簽名。
三、獲取系統(tǒng)性能情況
1、主機(jī)名
PS D:\> $env:computername
2、CPU使用情況

注意,-f:-filter:過(guò)濾,執(zhí)行;對(duì)于不是很清楚的命令可以通過(guò) man 命令 來(lái)獲取幫助。
3、內(nèi)存使用情況
PS D:\> $mem = gwmi win32_OperatingSystem PS D:\> $mem SystemDirectory : C:\Windows\system32 Organization : BuildNumber : 15063 RegisteredUser : Windows 用戶(hù) SerialNumber : 00331-10000-00001-AA275 Version : 10.0.15063
1)總內(nèi)存:
PS D:\> $Allmem = "{0:0.0} MB" -f ($mem.TotalVisibleMemorySize / 1KB)
PS D:\> $Allmem
4003.4 MB
2)剩余內(nèi)存:
PS D:\> $Freemem = "{0:0.0} MB" -f ($mem.FreePhysicalMemory / 1KB)
PS D:\> $Freemem
285.5 MB
3)內(nèi)存使用比:
PS D:\> $Permem = "{0:0.0} %" -f ((($mem.TotalVisibleMemorySize-$mem.FreePhysicalMemory)/$mem.TotalVisibleMemorySize)*100)
PS D:\> $Permem
92.9 %
4、磁盤(pán)使用情況

1)多條件過(guò)濾:只獲取D、E磁盤(pán)的信息
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
5、大合集:執(zhí)行腳本獲取CPU、內(nèi)存信息
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
四、系統(tǒng)性能監(jiān)控:CPU、內(nèi)存、Disk
1、利用psl腳本獲取性能信息
死循環(huán)作業(yè),只需要啟動(dòng)一次job即ok,如果擔(dān)心重啟之后停掉,就設(shè)置:start automatically when SQL Server Agent start。
2、監(jiān)控標(biāo)準(zhǔn)把控
1)CPU:80%
2)內(nèi)存:60% (通過(guò)io 和 ple 側(cè)面反映內(nèi)存情況)
3)Disk:90%
3、T-SQL存儲(chǔ)過(guò)程
USE [TestDB]
GO
/*系統(tǒng)性能監(jiān)控:CPU、內(nèi)存、disk*/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc M_cpumem
--手動(dòng)獲取數(shù)據(jù)庫(kù)服務(wù)器IP
@ip nvarchar(20)
AS
BEGIN
/*獲取CPU、內(nèi)存使用情況信息*/
--作業(yè)Get-CPU_Mem,執(zhí)行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))
--內(nèi)存使用率
DECLARE @mem int
SET @mem=CAST((SELECT SUBSTRING(@cm,22,4)) AS numeric(2,0))
/*CPU過(guò)載報(bào)警監(jiān)控*/
--CPU使用率大于80%說(shuō)明系統(tǒng)出現(xiàn)高耗
IF (@cpu>80)
BEGIN
DECLARE @str_subject_cpu nvarchar(100),@str_html_cpu nvarchar(max);
SET @str_subject_cpu='服務(wù)器:'+@ip+' CPU高耗報(bào)警'
--CPU或調(diào)度器當(dāng)前分配的工作情況
SET @str_html_cpu='Dear All:
<br> 系統(tǒng)CPU>80%,請(qǐng)參閱系統(tǒng)調(diào)度情況,進(jìn)行性能優(yōu)化處理!<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" >狀態(tài)</p></td>
<td style="width: 80px"><p align="center" >Is_Idle</p></td>
<td style="width: 90px"><p align="center" >當(dāng)前任務(wù)數(shù)</p></td>
<td style="width: 80px"><p align="center" >等待調(diào)度線(xiàn)程數(shù)</p></td>
<td style="width: 90px"><p align="center" >當(dāng)前線(xiàn)程數(shù)</p></td>
<td style="width: 90px"><p align="center" >活動(dòng)線(xiàn)程數(shù)</p></td>
<td style="width: 90px"><p align="center" >掛起任務(wù)數(shù)</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
/*內(nèi)存過(guò)載報(bào)警監(jiān)控*/
--內(nèi)存使用率大于60%說(shuō)明系統(tǒng)出現(xiàn)高耗
IF (@mem>60)
BEGIN
DECLARE @str_subject_mem nvarchar(100),@str_html_mem nvarchar(max);
SET @str_subject_mem='服務(wù)器:'+@ip+' 內(nèi)存高耗報(bào)警'
--系統(tǒng)性能計(jì)數(shù)器
SET @str_html_mem='Dear All:
<br> 系統(tǒng)Memory>60%,請(qǐng)參閱系統(tǒng)性能監(jiān)控情況,進(jìn)行性能優(yōu)化處理!<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
/*磁盤(pán)使用報(bào)警監(jiān)控*/
--磁盤(pán)可使用率小于15%時(shí)進(jìn)行郵件報(bào)警
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='服務(wù)器:'+@ip+' 磁盤(pán)空間不足'
EXEC msdb.dbo.sp_send_dbmail
@profile_name='Email',
@recipients='xxx@xxx.com',
@subject=@str_subject_disk,
@body = 'Dear ALL:
請(qǐng)及時(shí)清理磁盤(pán),磁盤(pán)空間使用情況見(jiàn)附件!',
@query = 'SELECT * FROM TestDB.dbo.temp_disk_space', --使用全稱(chēng)
@attach_query_result_as_file = 1,
@query_attachment_filename = 'disk.txt'
END
DROP table TestDB.dbo.temp_disk_space, #temp_space_monitor
END
4、最后就是將上面的存儲(chǔ)過(guò)程添加到定時(shí)作業(yè)里進(jìn)行監(jiān)控
總結(jié):
最后的功能是實(shí)現(xiàn)了,到達(dá)了Windows Server性能的監(jiān)控要求,但是,各種波折的獲取性能信息,真的是很難把控到“實(shí)時(shí)監(jiān)控”。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)本站的支持。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信