利用PowerShell监控Win-Server性能
Q:如何系统层面的去监控一下Windows Server?
A:额……一时间的话……能想到的可能也就是PowerShell+SQL Server+job,试试。
3、获取系统性能情况
= PowerShell+SQL Server+job 实现监控
一、关于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:本地脚本无限制,但是对来自网络的脚本必须经过签名。
三、获取系统性能情况

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
四、系统性能监控:CPU、内存、Disk
1、利用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
利用PowerShell监控Win-Server性能的更多相关文章
- SQL Server Profiler监控SQL Server性能
全面掌握SQL Server Profiler 1. 原理与相关概念介绍 SQL Server Profiler,大家已经非常熟悉.常常在性能优化中使用,本文档详细介绍SQL Server ...
- powershell加win的dns服务器,解决网站负载均衡问题
用我发明的powershell填坑法,加windows的dns服务器.从调整dns服务器解析ip时间段的角度,解决网站负载均衡问题. ------------------------win2012r2 ...
- LR如何利用siteScope监控MySQL性能
本次实验,是在自己的电脑上使用APMServ5.2.6部署Discuz2.X论坛下,对该论坛的数据库MySQL5.1进行性能测试的,下面讲述LoadRunner在设计场景时,如何利用siteScope ...
- [AlwaysOn Availability Groups]使用Powershell监控AlwayOn健康
使用Powershell监控AlwayOn健康 1.基本命令概述 AlwayOn Dashboard是很有用的查看整体AG健康状况的工具.但是这个工具不是用于7*24监控的.如果应用程序夜间发送严重的 ...
- 用脚本定时监控SQL Server主从一致性
用脚本定时监控SQL Server主从一致性 首先说一下我们的环境 我们使用的是事务复制,复制是单向的,主服务器和从服务器都在同一个机房,当然不同机房也可以,只需要改一下IP和端口 下面的脚本在我们的 ...
- Nagios利用NSClient++监控Windows主机
在Nagios的libexec下有check_nt这个插件,它就是用来检查windows机器的服务的.其功能类似于check_nrpe.不过还需要搭配另外一个软件NSClient++,它则类似于NRP ...
- SQL Server 性能优化详解
故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户, ...
- sql server性能调优
转自:https://www.cnblogs.com/woodytu/tag/%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98%E5%9F%B9%E8%AE%AD/defaul ...
- 监控 SQL Server (2005/2008) 的运行状况
Microsoft SQL Server 2005 提供了一些工具来监控数据库.方法之一是动态管理视图.动态管理视图 (DMV) 和动态管理函数 (DMF) 返回的服务器状态信息可用于监控服务器实例的 ...
随机推荐
- yii去掉自动排序功能
Yii去掉自动排序功能并自定义排序 public function search($params) { $query = SvnManage::find()->addOrderBy([ 'cre ...
- IO流(4)—字符流
1.IO体系: 抽象基类 --节点流(文件流) InputStream -- FileInputStream OutputStream --FileOutputSteam Reader --FileR ...
- js扩展运算符(spread)三个点(...)
常见用法: 1.该运算符主要用于函数调用. function push(array, ...items) { array.push(...items); } function add(x, y) { ...
- Nancy的基本用法
在前面的文章轻量级的Web框架——Nancy中简单的介绍了一下Nancy的特点,今天这里就介绍下它的基本用法,由于2.0的版本还是预览状态,我这里用的是1.4版本,和最小的版本API还是有些差异的. ...
- Deepin 15.4 个性化设置
2017.10.03,开始使用 Deepin 15.4.1 桌面系统 Chrome 版本 60.0.3112.78(正式版本) (64 位) 1.开启 ls 别名: vim .bashrc 去掉以下代 ...
- iOS:给标签栏控制器的UITabbarItem添加点击动效
一.介绍 现在很多app,附带很炫的点击效果,让用户享受到非常棒的体验,例如动画.渐变.音效等. 当然,市面上大多数app的标签栏点击还是挺中规中矩的,只是切换图片而已.然而,这个是可以优化的,附带点 ...
- $.contents().find设置的data在iframe子页面无法获取值
<iframe src="iframe16.html" id="iframe16" name="iframe16"></i ...
- 【ASP.NET 问题】ASP.NET 网站404页面返回200,或者302的解决办法
做网站在优化网站时遇到了跳转404页面却返回 200.302状态的问题,这样的话搜索引擎会认为这个页面是一个正常的页面,但是这个页面实际是个错误页面,虽然对访问的用户而言,HTTP状态码是“404”还 ...
- Pilosa文档翻译(一)导言、安装
目录 导言 安装 安装在MacOS 使用HomeBrew 下载二进制文件 从源码构建 使用Docker 安装在Linux 下载二进制文件 从源码构建 使用Docker 接下来是什么? 导言 原文地址 ...
- iOS CALayer 绘图模糊有锯齿的解决方案
在CALayer中绘制图形会出现锯齿和模糊,同样绘图在UIView中就没有问题.经查资料发现不自动处理两倍像素的情况. 解决方案为:设置layer的contentsScale属性为[[UIScreen ...