这篇文章主要给大家介绍了关于如何利用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的强大功能。你可以把它看成是命令行提示符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

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

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='服务器:'[email protected]+' 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='[email protected]',
   @[email protected]_subject_cpu,
   @[email protected]_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='服务器:'[email protected]+' 内存高耗报警'
  --系统性能计数器
  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='[email protected]',
   @[email protected]_subject_mem,
   @[email protected]_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='服务器:'[email protected]+' 磁盘空间不足' 
  EXEC msdb.dbo.sp_send_dbmail
  @profile_name='Email',
  @recipients='[email protected]',
  @[email protected]_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性能的监控要求,但是,各种波折的获取性能信息,真的是很难把控到“实时监控”。

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

最新资讯
华为首席战略架构师:面对AI领域竞争 华为有自身优势

华为首席战略架构师:

华为首席战略架构师党文栓表示,竞争不仅仅在于一颗芯片
亚马逊与加拿大货运公司签署协议 至多入股15%

亚马逊与加拿大货运公

据彭博社报道,亚马逊已与加拿大货运公司Cargojet签署一
最新文件:FB 2015年就知晓剑桥分析违规使用数据

最新文件:FB 2015年就

据外媒报道,最新曝光的一些内部沟通文件显示,Facebook早
美团迎来关键转折点:外卖毛利率超20% 首次季度盈利

美团迎来关键转折点:外

美团于8月23日晚间发布2019年二季度财报。这份财报远
美团点评高管解读二季度财报:将在外卖领域主动创新

美团点评高管解读二季

美团点评今日发布的2019年第二季度财报显示,美团点评第
小赢科技遭调查 或违反美国联邦证券法

小赢科技遭调查 或违

股东权利律师事务所Johnson Fistel今日宣布,正在调查小
最新文章
PowerShell使用match操作符来筛选数组

PowerShell使用match

本文介绍PowerShell中使用match操作符,配合正则表达式
PowerShell 语音计算器实现代码

PowerShell 语音计算

带中文发音功能的计算器程序,支持鼠标和小键盘输入,支持
通过DNS TXT记录执行powershell

通过DNS TXT记录执行p

这篇文章主要介绍了通过DNS TXT记录执行powershell的
如何防范PowerShell代码注入漏洞绕过受限语言模式

如何防范PowerShell代

这篇文章主要介绍了如何防范PowerShell代码注入漏洞绕
PowerShell管道入门必看篇(管道例子大全)

PowerShell管道入门必

下面小编就为大家带来一篇PowerShell管道入门必看篇(
使用 powershell 创建虚拟机

使用 powershell 创建

Azure PowerShell 模块用于从 PowerShell 命令行或脚