应配置powershell自动告警脚本,阈值设为85%,每60秒检测一次,超限则抓取内存与cpu top10进程并弹窗提醒,通过schtasks注册为系统级计划任务实现无人值守。
当windows服务器内存使用率持续偏高,远程连接卡顿甚至中断时,靠人工巡检已来不及。最有效的做法是配置自动触发脚本,在阈值突破前就发出告警,并附带关键进程信息,帮你快速定位问题源头。
设置合理的内存告警阈值
建议将告警阈值设为85%,而非100%——因为系统在真正耗尽内存前,页面交换、响应延迟、服务挂起等异常已开始发生。90%以上通常意味着系统已进入不稳定状态,此时再介入往往需要强制重启。避免设为95%或更高,那已不是预警,而是“事故通报”。
用PowerShell实时获取内存使用率
直接调用WMI性能类更稳定,推荐使用Win32_PerfFormattedData_PerfOS_Memory(格式化数据,单位统一,无需手动换算):
- 已用内存百分比:`(Get-WmiObject Win32_PerfFormattedData_PerfOS_Memory).PercentCommittedBytesInUse`
- 可用物理内存(MB):`(Get-WmiObject Win32_PerfFormattedData_PerfOS_Memory).AvailableMBytes`
- 注意:不要用Win32_OperatingSystem里的
TotalVisibleMemorySize和FreePhysicalMemory,它们单位是KB且未格式化,计算易出错
编写可执行的告警触发脚本
以下脚本满足三个核心需求:检测、诊断、通知。保存为Alert-MemoryHigh.ps1,以管理员权限运行:
- 每60秒检查一次内存使用率,连续2次超85%即触发
- 自动抓取CPU和内存占用Top 10进程(含PID、名称、工作集、CPU时间)
- 生成本地日志+弹窗提醒,并支持后续扩展邮件或企业微信通知
示例关键逻辑段:
```powershell$usedPct = (Get-WmiObject Win32_PerfFormattedData_PerfOS_Memory).PercentCommittedBytesInUse
if ($usedPct -gt 85) {
$topMem = Get-Process | Sort-Object WS -Descending | Select-Object Name, PID, WS -First 10
$topCPU = Get-Process | Sort-Object CPU -Descending | Select-Object Name, PID, CPU -First 10
Write-Host "⚠ 内存超限:$usedPct%" -ForegroundColor Red
Write-Host "内存Top10:" -ForegroundColor Yellow; $topMem
Write-Host "CPUTop10:" -ForegroundColor Yellow; $topCPU
[System.Windows.Forms.MessageBox]::Show("内存使用率 $usedPct%!已记录Top进程", "高内存告警")
}
接入定时任务实现无人值守
仅靠手动运行脚本没有意义。必须通过schtasks注册为计划任务:
- 命令示例:
schtasks /create /tn "MemoryAlert" /tr "powershell.exe -ExecutionPolicy Bypass -File C:\Scripts\Alert-MemoryHigh.ps1" /sc minute /mo 1 /rl HIGHEST - 确保勾选“不管用户是否登录都要运行”并使用系统账户(如
NT AUTHORITY\SYSTEM),避免会话限制导致脚本静默失败 - 首次部署后,用
schtasks /query /tn "MemoryAlert"确认状态,观察“最后结果”列是否为0x0











