Q:如何系统层面的去监控一下Windows Server?html
A:额……一时间的话……能想到的可能也就是PowerShell+SQL Server+job,试试。shell
一、关于PowerShell数据库
二、PowerShell脚本的编写与执行windows
三、获取系统性能状况安全
= PowerShell+SQL Server+job 实现监控性能优化
一、什么是PowerShell网络
表层面的翻译:强大的Shell。编辑器
强大?性能
若是是从知名度和用户的使用量来谈的话,PowerShell相较当下流行的一些面向对象的语言来讲应该是逊色太多太多了,可是,做为一款系统内置的脚本语言,和Linux里的Shell同样,说其强大固然是不容置喙的。
Windows PowerShell 是一种命令行外壳程序和脚本环境,是运行在windows机器上实现系统和应用程序管理自动化的命令行脚本环境,使命令行用户和脚本编写者能够利用 .NET Framework的强大功能。你能够把它当作是命令行提示符cmd.exe的扩充,不对,应当是颠覆。 powershell须要.NET环境的支持,同时支持.NET对象。微软之因此将Powershell 定位为Power,并非夸大其词,由于它彻底支持对象。其可读性,易用性,能够位居当前全部shell之首。
二、如何打开PowerShell
1)Win键+R,输入cmd,而后cmd会话框里再输入powershell
2)Win键+R,输入powershell,即来到其会话框
3)或是直接找到Windows PowerShell程序双击或是管理员打开
三、学习PowerShell
一开始接触到PowerShell的时候,也是有一些懵圈的,但多少也仍是和DOS、Shell命令有些类似之处,习惯就好。
推荐学习网站:http://www.pstips.net/powershell-online-tutorials/
一、编写脚本(.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)复杂点的大脚本编写,通常借助文本编辑器方便些。
二、脚本执行
1)PowerShell脚本的执行直接是使用脚本文件的相对路径,或者绝对路径
2)经过别名设置(> Set-Alias),将脚本的执行语句保存为别名,如此,就能像输入命令同样的执行脚本
三、执行策略限制
脚本可否执行取决于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:本地脚本无限制,可是对来自网络的脚本必须通过签名。
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
PS D:\> $Allmem = "{0:0.0} MB" -f ($mem.TotalVisibleMemorySize / 1KB) PS D:\> $Allmem
4003.4 MB
PS D:\> $Freemem = "{0:0.0} MB" -f ($mem.FreePhysicalMemory / 1KB) PS D:\> $Freemem
285.5 MB
PS D:\> $Permem = "{0:0.0} %" -f ((($mem.TotalVisibleMemorySize-$mem.FreePhysicalMemory)/$mem.TotalVisibleMemorySize)*100) PS D:\> $Permem
92.9 %
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
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
一、利用psl脚本获取性能信息
死循环做业,只须要启动一次job即ok,若是担忧重启以后停掉,就设置:start automatically when SQL Server Agent start。
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