zoukankan      html  css  js  c++  java
  • 利用PowerShell监控Win-Server性能

    Q:如何系统层面的去监控一下Windows Server?

    A:额……一时间的话……能想到的可能也就是PowerShell+SQL Server+job,试试。

    1、关于PowerShell

    2、PowerShell脚本的编写与执行

    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:本地脚本无限制,但是对来自网络的脚本必须经过签名。

    三、获取系统性能情况

    1、主机名
    PS D:> $env:computername
    2、CPU使用情况
      注意,-f:-filter:过滤,执行;对于不是很清楚的命令可以通过 man 命令 来获取帮助。
    3、内存使用情况
    PS D:> $mem = gwmi win32_OperatingSystem
    PS D:> $mem
    SystemDirectory : C:Windowssystem32
    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>&nbsp;&nbsp;系统CPU>80%,请参阅系统调度情况,进行性能优化处理!<br>
                    <table border=1 >'+
                    '<tr>
                        <td style=" 80px"><p align="center" >Scheduler_ID</p></td>
                        <td style=" 80px"><p align="center" >CPU_ID</p></td>
                        <td style=" 150px"><p align="center" >状态</p></td>
                        <td style=" 80px"><p align="center" >Is_Idle</p></td>
                        <td style=" 90px"><p align="center" >当前任务数</p></td>
                        <td style=" 80px"><p align="center" >等待调度线程数</p></td>
                        <td style=" 90px"><p align="center" >当前线程数</p></td>
                        <td style=" 90px"><p align="center" >活动线程数</p></td>
                        <td style=" 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>&nbsp;&nbsp;系统Memory>60%,请参阅系统性能监控情况,进行性能优化处理!<br>
                    <table border=1 >'+    
                    '<tr>
                        <td style=" 150px"><p align="center" >Object_Name</p></td>
                        <td style=" 150px"><p align="center" >Counter_Name</p></td>
                        <td style=" 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性能的监控要求,但是,几经波折地获取性能信息,真的是有点儿难把控到“实时监控”。
  • 相关阅读:
    后台返回null iOS
    iOS代码规范
    没落的公司 该何去何从
    定位框一闪而过 iOS Swift
    根据appid跳到App Store某个APP的详情页
    Analyze 静态分析内存泄漏代码优化 instrument之Xcode
    bugly手动上传符号表和自动上传符号表
    __null_unspecified属性关键字解决内存泄漏
    栅栏函数dispatch_barrier_sync/async
    cell左滑加删除置顶功能 iOS
  • 原文地址:https://www.cnblogs.com/geaozhang/p/9850742.html
Copyright © 2011-2022 走看看