当前位置: 移动技术网 > IT编程>脚本编程>Shell > 如何利用PowerShell监控Win-Server性能详解

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

2018年11月03日  | 移动技术网IT编程  | 我要评论

前言

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

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网