配置自定义消息实现Windows服务器CPU和内存高利用率时触发告警抓住最佳时机上机排查

2020-10-14 11:11:14 浏览数 (1)

问题现象:经常远程不上,需要重启才能远程上,远程不上时查看云监控CPU或内存指标都是接近100%的利用率。

处理思路:设置监控告警,当内存或CPU利用率超过85%时触发告警,然后立即上机调出任务管理器查看是什么进程占用CPU或内存最多或者上机后在powershell里执行get-process |sort-object ws -descending |select-object -first 10查看内存使用率排名前10的进程,执行get-process |sort-object cpu -descending |select-object -first 10查看CPU使用率排名前10的进程。

有2种监控告警,一种是平台告警功能需要自己配置,一种是自定义消息需要自己写代码实现业务逻辑。2种的共同点是都需要先配置告警接收人,然后新建策略。前者的策略逻辑是平台实现的,后者的策略逻辑是自己写代码实现的。

首先配置告警接收人

https://console.cloud.tencent.com/cam

或者在“[默认项目]默认监控接收组”里添加用户

https://console.cloud.tencent.com/cam/groups

先把用户添加到组,关联手机、邮箱(必须做关联

https://console.cloud.tencent.com/monitor/message

这里主要说自定义消息监控告警,平台监控告警在另一篇文档里说(https://cloud.tencent.com/developer/article/1557962)

自定义消息控制台:

https://console.zijiebao.com/monitor/message

自定义消息文档:

https://cloud.tencent.com/document/product/248/6218

该文档Windows示例部分能直接执行cagent_tools命令是因为设置了C:Program FilesQCloudMonitorBarad的环境变量,如果是用户自己导入的镜像,需要用户自己设置环境变量或者用命令切换到cagent_tools所在目录再执行。如果是cmd,用cd /d "C:Program FilesQCloudMonitorBarad"切换目录;如果是powershell,用cd "C:Program FilesQCloudMonitorBarad"切换目录(注意没有/d)

记录下策略IDcm-812hsdyc(后面的代码里替换成你自己的策略ID)

编写powershell脚本mem.ps1

$a=(get-wmiobject -class Win32_PhysicalMemory -namespace "rootcimv2").Capacity

$b=(get-wmiobject -class Win32_PerfFormattedData_PerfOS_Memory -namespace "rootcimv2").AvailableMBytes

$c=$a/1024/1024

$d=$c-$b

$e=$d/$c

cls

echo 您当前总内存$c 可用内存$b 已用内存$d 内存使用率$e

cd "C:Program FilesQCloudMonitorBarad"

If( $e -gt 0.55 ){

.cagent_tools alarm "内存利用超过55%" cm-812hsdyc

}

以上代码保存为mem.ps1,设置计划任务每1分钟执行1次,触发后会收到告警信息,到时候立即上机器调出任务管理器看下是哪个进程占用内存最多

为了快点触发告警,以上示例截图,我设置的内存利用超过55%告警(因为我调出任务管理器发现我的机器内存利用超过60%了,为了快速验证,设置的告警值比它小)

告警成功后可以在控制台查看详情

单次告警成功了,只差设置计划任务

参考如下2个文档

https://www.cnblogs.com/52php/p/5681412.html

https://blog.csdn.net/kk185800961/article/details/50587794

打开计划任务的快捷方式在 “管理工具”内

C:ProgramDataMicrosoftWindowsStart MenuProgramsAdministrative ToolsTask Scheduler.lnk

红色圈出的地方特意去掉了“不存储密码”前面✅里的对勾

“重复任务间隔”没有1分钟的选项,那就选5分钟,手动把5改成1

触发器根据自己的需要进行选择,最常用的是这3个:在系统启动时触发、当任何用户登录时触发、当创建任务或修改任务时触发。我一般选“当创建任务或修改任务时触发”。

上图里的条件都是限定条件,不选就是不限定。

如果是为了一直运行,需去掉上图“如果任务运行时间超过以下时间,停止任务”前面✅里的对勾

计划任务创建好后的状态关注下,如果是“准备就绪”状态,需要在计划任务上右击点“运行”

如果是已经成功执行过一次了,那状态就会变成“排队”等待下一次执行计划任务里对应的操作

一切就绪后,我试了很多次都没有成功,最后发现是忽视了这个细节,powershell脚本跟bat有区别

同样,CPU利用率告警也可以如法炮制

cpu.ps1脚本内容如下

$Server = $env:computername

$cpu = gwmi -computername $Server win32_Processor

$PercentCPU = "{0:0.0} %" -f $cpu.LoadPercentage

$memory = (get-wmiobject -class Win32_PhysicalMemory -namespace "rootcimv2").Capacity

$Allmemory = "{0:0.00} MB" -f ($memory/1024/1024)

$mem = gwmi -ComputerName $Server win32_OperatingSystem

$Allmem = "{0:0.00} MB" -f ($mem.TotalVisibleMemorySize / 1KB)

$Freemem = "{0:0.00} MB" -f ($mem.FreePhysicalMemory / 1KB)

$PercentMEM = "{0:0.00} %" -f ((($mem.TotalVisibleMemorySize-$mem.FreePhysicalMemory)/$mem.TotalVisibleMemorySize)*100)

Write-Host "COMPUTER:$Server"`r`n

Write-Host "CPU Used: $PercentCPU"`r`n

Write-Host "Total Physical Memory:$Allmemory"`r`n

Write-Host "Total Visible Memory:$Allmem"`r`n

Write-Host "Free Physical Memory:$Freemem"`r`n

Write-Host "Mem Used:$PercentMEM"`r`n

$IpAddr = (Get-WmiObject -class win32_NetworkAdapterConfiguration -Filter 'ipenabled = "true"').ipaddress[0]

Write-Host "IP Address:$IpAddr"`r`n

cd "C:Program FilesQCloudMonitorBarad"

If( $PercentCPU -gt 0.01 ){

.cagent_tools alarm "CPU利用超过1%" cm-812hsdyc

}

示例中设置的CPU利用率超过1%触发告警是为了快速验证,实际操作中根据自己的需求来,别忘了把策略ID替换成你自己的。定时任务设置1分钟1次,看看这效果:

0 人点赞