如何利用PowerShell监控Win-Server性能详解

2023-12-05 0 759

前言

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命令重定向进文件,或是将脚本文件通过@‘ \’@闭合起来

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.com/fwlink/?LinkID=135170
中的 about_Execution_Policies 帮助主题所述。是否要更改执行策略?
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“N”): y

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

如何利用PowerShell监控Win-Server性能详解

  1>Unrestricted:权限最高,可以不受限制执行任何脚本。

  2>Default:为Powershell默认的策略:Restricted,不允许任何脚本执行。

  3>AllSigned:所有脚本都必须经过签名才能在运行。

  4>RemoteSigned:本地脚本无限制,但是对来自网络的脚本必须经过签名。

三、获取系统性能情况

1、主机名

PS D:\\> $env:computername

2、CPU使用情况

如何利用PowerShell监控Win-Server性能详解

  注意,-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、磁盘使用情况

如何利用PowerShell监控Win-Server性能详解

  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>&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

4、最后就是将上面的存储过程添加到定时作业里进行监控

总结:

最后的功能是实现了,到达了Windows Server性能的监控要求,但是,各种波折的获取性能信息,真的是很难把控到“实时监控”。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对悠久资源网的支持。

您可能感兴趣的文章:

  • PowerShell基本使用教程
  • PowerShell 指令操作集合(小结)
  • PowerShell中Job相关命令及并行执行任务详解
  • 基于PowerShell在Ubuntu系统的使用详解
  • PowerShell 远程执行任务的方法步骤
  • powershell玩转SQL SERVER所有版本的方法
  • 如何在power shell添加vim实现代码示例

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 PowerShell 如何利用PowerShell监控Win-Server性能详解 https://www.u-9.cn/jiaoben/powershell/101343.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务