前言
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='服务器:'+@ip+' CPU高耗报警' --CPU或调度器当前分配的工作情况 SET @str_html_cpu='Dear All:
系统CPU>80%,请参阅系统调度情况,进行性能优化处理!
Scheduler_ID |
CPU_ID |
状态 |
Is_Idle |
当前任务数 |
等待调度线程数 |
当前线程数 |
活动线程数 |
挂起任务数 |
Object_Name |
Counter_Name |
Value |
4、最后就是将上面的存储过程添加到定时作业里进行监控
总结:
最后的功能是实现了,到达了Windows Server性能的监控要求,但是,各种波折的获取性能信息,真的是很难把控到“实时监控”。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。