问题现象:经常远程不上,需要重启才能远程上,远程不上时查看云监控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)
记录下策略ID:cm-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次,看看这效果: