分享

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

 新用户1062sf7K 2022-02-10

前言

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./powershell-online-tutorials/

二、PowerShell脚本的编写与执行

1、编写脚本(.psl扩展名的脚本文件)

  1)对于简单的小脚本编写,可以通过echo命令重定向进文件,或是将脚本文件通过@' '@闭合起来

1

2

3

4

5

6

7

8

9

10

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:

1

2

3

4

5

6

7

8

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、内存使用情况

1

2

3

4

5

6

7

8

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)总内存:

1

2

3

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

PS D:\> $Allmem

4003.4 MB

  2)剩余内存:

1

2

3

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

PS D:\> $Freemem

285.5 MB

  3)内存使用比:

1

2

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)辅助智能显示信息:

1

2

3

4

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、内存信息

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

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存储过程

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

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 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>  系统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性能的监控要求,但是,各种波折的获取性能信息,真的是很难把控到“实时监控”。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多