如何利用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='服务器:'+@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)

相关推荐

  • PowerShell脚本性能优化技巧总结

    最终优化 在你写脚本时,不要老是想着去优化,因为你的部分优化代码可能最终被丢弃.而且老是想着优化也会降低你的生产效率,因为和CPU的时间相比,脚本编写者的时间可能会更宝贵. 使用过滤参数 PowerShell可能会消耗很多资源,因为许多Cmdlet本身的设计就是用来提供数目很大的数据.所以,如果你使用的Cmdlet命令支持-Filter, -Include, 和 -Exclude这样的过滤条件,就尽量使用它们. 首先如果一条命令支持-Filter 过滤器参数,那就说明这里可能隐藏着一个对象访问A

  • PowerShell脚本监控文件夹变化实例

    本文介绍使用PowerShell来监视一个指定的文件夹,包括新建文件.删除文件.重命名文件等操作均会被监控或监视.本文使用了System.IO.FileSystemWatcher这个.NET对象.首先,我们来看看程序: 复制代码 代码如下: # 定义要监控的文件夹,这个文件夹必须先存在. $folder = 'D:\test' # 定义每次监控的间隔时间,这时定义为1000毫秒,即1秒 $timeout = 1000 # 创建文件系统监视对象 $FileSystemWatcher = New-O

  • python通过ssh-powershell监控windows的方法

    本文实例讲述了python通过ssh-powershell监控windows的方法.分享给大家供大家参考.具体分析如下: 对于服务器的监控来说,监控linux不管是自己动手写脚本还是用一些开源的工具比如nagios,zenoss什么的.但毕竟还是有些公司有windows做服务器的,相对linux来说,windows没有方便的shell,cmd下提供的命令对于监控来说远远没有linux方便.但是现在windows上如果安装了powershell(win7,2008自带),就比以前方便多了,linu

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

    前言 Q:如何系统层面的去监控一下Windows Server? A:额--一时间的话--能想到的可能也就是PowerShell+SQL Server+job,试试. 本文就给大家介绍了关于利用PowerShell监控Win-Server性能的相关内容,下面话不多说了,来一起看看详细的介绍吧 一.关于PowerShell 1.什么是PowerShell 表层面的翻译:强大的Shell. 强大? 如果是从知名度和用户的使用量来谈的话,PowerShell相较当下流行的一些面向对象的语言来说应该是逊

  • 利用Python上传日志并监控告警的方法详解

    目录 1.准备 2.使用阿里云SDK上传Python日志 3.配置日志告警 在我们的日常生活工作中,经常会遇到需要上传日志的场景,比如多台机器运行同一个程序,并且需要记录每台机器程序产生的日志,根据相关关键词告警,或者进行无数据告警,如果自己搭建这套系统需要耗费不少时间,因此如果能使用市面上现成的系统会很方便. 本文将教你如何通过阿里云日志服务搭建一套通过Python上传日志.配置日志告警的监控服务. 1.准备 开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文

  • 利用二进制文件安装etcd的教程详解

    etcd组件作为一个高可用强一致性的服务发现存储仓库. etcd作为一个受到ZooKeeper与doozer启发而催生的项目,除了拥有与之类似的功能外,更专注于以下四点. 简单:基于HTTP+JSON的API让你用curl就可以轻松使用. 安全:可选SSL客户认证机制. 快速:每个实例每秒支持一千次写操作. 可信:使用Raft算法充分实现了分布式. 场景一:服务发现(Service Discovery)一个强一致性.高可用的服务存储目录.基于Raft算法的etcd天生就是这样一个强一致性高可用的

  • 基于tomcat配置文件server.xml详解

    1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务,因为是入门示例,所以设置极其简单,只需修改$CATALINA_HOME/conf/server.xml文件为如下内容即可.其中大部分都采用了默认设置,只是在engine容器中添加了两个Host容器. <?xml version="1.0" encoding="UTF-8"?> <Server port="8005" shutdown="SH

  • 性能测试监控网络吞吐量过程详解

    性能监控之网络吞吐量 检查设备网络带宽 ip a#检查网卡,选取带eth的 ethtool eth0 这里就遇到问题了,有可能没有权限 也有可能你的是云主机,部分会是这样的 这种情况只能问一下运维来获取主机的带宽,那我们问来的是什么呢,偷来一张图,获取Speed里的数值,这里就是说是百兆宽带 监控网络吞吐量 sar -n DEV 1 4#1秒采集一次,采集4次 sar -n DEV 1#1秒采集1次,一直采集,直到手动结束 我们需要的是rxpck/s和txpck/s,这两个加起来就是现在总共使用

  • 利用Python实现面部识别的方法详解

    人脸识别正在成为软件开发中的一种趋势.它有助于识别人脸并使应用程序更加健壮.在本教程中,我们将使用python和face_recognition库创建一个简单的人脸识别. 对于开发环境,我们将使用 Visual Studio Community Edition. 如果你的计算机上还没有安装它,你可以从这里下载.并使用 C++安装桌面开发. 现在我们有了使用 C++ 进行桌面开发的 Visual Studio,我们可以开始我们的项目了. 使用 Visual Studio 打开一个新目录并创建一个新

  • Classloader隔离技术在业务监控中的应用详解

    目录 1. 背景&简介 2. 业务监控平台脚本调试流程 2.1 业务监控的脚本开发调试流程图 3. 自定义Classloder | 打破双亲委派 3.1 什么是Classloader 3.2 Classloader动态加载依赖文件 3.3 自定义类加载器 3.4 业务监控使用CustomClassloader 3.5 业务监控动态加载JAR和脚本的实现 4. 问题&原因&方案 5. 总结 1. 背景&简介 业务监控平台是得物自研的一款用于数据和状态验证的平台.能快速便捷发现

  • Java利用redis zset实现延时任务详解

    目录 一.实现原理 二.准备工作 三.代码实现 四.优缺点 所谓的延时任务给大家举个例子:你买了一张火车票,必须在30分钟之内付款,否则该订单被自动取消.「订单30分钟不付款自动取消,这个任务就是一个延时任务.」   我之前已经写过2篇关于延时任务的文章: <通过DelayQueue实现延时任务> <基于netty时间轮算法实战> 这两种方法都有一个缺点:都是基于单体应用的内存的方式运行延时任务的,一旦出现单点故障,可能出现延时任务数据的丢失.所以此篇文章给大家介绍实现延时任务的第

  • Python利用Pandas进行数据分析的方法详解

    目录 Series 代码 #1 代码 #2 代码#3 代码 #4 数据框 代码 #1 代码 #2 代码 #3 代码 #4 Pandas是最流行的用于数据分析的 Python 库.它提供高度优化的性能,后端源代码完全用C或Python编写. 我们可以通过以下方式分析 pandas 中的数据: 1.Series 2.数据帧 Series Series 是 pandas 中定义的一维(1-D)数组,可用于存储任何数据类型. 代码 #1 创建 Series # 创建 Series 的程序 # 导入 Pa

  • tomcat 集群监控与弹性伸缩详解

    目录 如何给 tomcat 配置合适的线程池 如何监控 tomcat 线程池的工作情况 tomcat 线程池扩缩容 tomcat 是如何避免原生线程池的缺陷的 如何给 tomcat 配置合适的线程池 任务分为 CPU 密集型和 IO 密集型 对于 CPU 密集型的应用来说,需要大量 CPU 计算速度很快,线程池如果过多,则保存和切换上下文开销过高反而会影响性能,可以适当将线程数量调小一些 对于 IO 密集型应用来说常见于普通的业务系统,比如会去查询 mysql.redis 等然后在内存中做简单的

随机推荐