如何利⽤PowerShell监控Win-Server性能详解
前⾔
Q:如何系统层⾯的去监控⼀下Windows Server?
A:额……⼀时间的话……能想到的可能也就是PowerShell+SQL Server+job,试试。
本⽂就给⼤家介绍了关于利⽤PowerShell监控Win-Server性能的相关内容,下⾯话不多说了,来⼀起看看详细的介绍吧
⼀、关于PowerShell
1、什么是PowerShell
  表层⾯的翻译:强⼤的Shell。
  强⼤?
  如果是从知名度和⽤户的使⽤量来谈的话,PowerShell相较当下流⾏的⼀些⾯向对象的语⾔来说应该是逊⾊太多太多了,但是,作为⼀款系统内置的脚本语⾔,和Linux⾥的Shell⼀样,说其强⼤当然是不容置
喙的。
  Windows PowerShell 是⼀种命令⾏外壳程序和脚本环境,是运⾏在windows机器上实现系统和应⽤程序管理⾃动化的命令⾏脚本环境,使命令⾏⽤户和脚本编写者可以利⽤ .NET Framework的强⼤功能。你可以把它看成是命令⾏提⽰符的扩充,不对,应当是颠覆。 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命令有些相似之处,习惯就好。
⼆、PowerShell脚本的编写与执⾏
1、编写脚本(.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)复杂点的⼤脚本编写,⼀般借助⽂本编辑器⽅便些。
2、脚本执⾏
  1)PowerShell脚本的执⾏直接是使⽤脚本⽂件的相对路径,或者绝对路径
  2)通过别名设置(> Set-Alias),将脚本的执⾏语句保存为别名,如此,就能像输⼊命令⼀样的执⾏脚本
3、执⾏策略限制
  脚本能否执⾏取决于Powershell的执⾏策略;
  Powershell⼀般初始化情况下都会禁⽌脚本执⾏。只有管理员才有权限更改该策略,⾮管理员会报错。以管理员⾝份打开powershell:
PS E:\> Get-ExecutionPolicy
Restricted
PS E:\> Set-ExecutionPolicy Unrestricted
执⾏策略更改
执⾏策略可帮助你防⽌执⾏不信任的脚本。更改执⾏策略可能会产⽣安全风险,如 https:/go.microsoft/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:本地脚本⽆限制,但是对来⾃⽹络的脚本必须经过签名。
三、获取系统性能情况
1、主机名
PS D:\> $env:computername
2、CPU使⽤情况
  注意,-f:-filter:过滤,执⾏;对于不是很清楚的命令可以通过 man 命令来获取帮助。
3、内存使⽤情况
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 %
4、磁盘使⽤情况
  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
5、⼤合集:执⾏脚本获取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
四、系统性能监控: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存储过程
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>  ;系统CPU>80%,请参阅系统调度情况,进⾏性能优化处理!<br>
<table border=1 >'+
'<tr>
<td ><p align="center" >Scheduler_ID</p></td>
<td ><p align="center" >CPU_ID</p></td>
<td ><p align="center" >状态</p></td>
<td ><p align="center" >Is_Idle</p></td>
<td ><p align="center" >当前任务数</p></td>
<td ><p align="center" >等待调度线程数</p></td>
<td ><p align="center" >当前线程数</p></td>
<td ><p align="center" >活动线程数</p></td>
<td ><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='***********',
@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>  ;系统Memory>60%,请参阅系统性能监控情况,进⾏性能优化处理!<br>    <table border=1 >'+
'<tr>
<td ><p align="center" >Object_Name</p></td>
<td ><p align="center" >Counter_Name</p></td>
<td ><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='***********',
@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,
al_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='***********',
@subject=@str_subject_disk,
@body = 'Dear ALL:
请及时清理磁盘,磁盘空间使⽤情况见附件!',
powershell怎么以管理员身份运行
@query = 'SELECT * FROM p_disk_space', --使⽤全称
@attach_query_result_as_file = 1,
@query_attachment_filename = ''
END
DROP table p_disk_space, #temp_space_monitor
END
4、最后就是将上⾯的存储过程添加到定时作业⾥进⾏监控
总结:
最后的功能是实现了,到达了Windows Server性能的监控要求,但是,各种波折的获取性能信息,真的是很难把控到“实时监控”。
好了,以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。