在之前的篇幅​​简单聊聊Azure VM的内存指标​​里已经提过了​,Windows并没提供内置的方式来让你直接通过百分比的形式展示内存使用率,这样对于告警的设置来说就不太灵活了

但是这个其实也有一些别的方法可以变相的解决这个问题,因为Windows实际上是可以收集到Available MBytes这种数据的,缺的无非就是VM的总内存数,之后除一下其实就是百分比了,这个思路和方法是微软的support工程师提供的,所以算不上是原创,感觉还是挺有意思,也挺厉害的,我这里算是借花献佛,把方法分享出来

大概的思路就是因为Agent其实也可以收集Windows日志数据,所以就把内存容量手动写入到日志里,然后收集到Log Analytics中,这样就可以直接query了,把下边的脚本设置成task schedule,让他定期运行,脚本其实比较简单,只是一些基础的查询和写log的操作

$SourceName = "MemorySize"
$EventID = "5555"
if([System.Diagnostics.EventLog]::SourceExists($SourceName) -eq $false)
{
New-EventLog -LogName System -Source $SourceName
}
$phMem = Get-WmiObject -Class Win32_ComputerSystem | Select-Object totalphysicalmemory
$phMemString = $phMem.totalphysicalmemory | Out-String
Write-EventLog -LogName System -EventId $EventID -Source $SourceName -Message $phMemStrin

之后在event log里就能看到ID为5555的日志了

用百分比显示Windows内存使用率_Azure

之后在Log Analytics里设置收集Windows系统日志,否则日志不会打到LA里

用百分比显示Windows内存使用率_数据_02

注意在Windows Performance Counter里也要设置收集内存数据

用百分比显示Windows内存使用率_Computer_03

再通过KUSTO的query就能查到百分比的数据了

Perf 
| where ObjectName == "Memory" and CounterName == "Available MBytes"
| sort by TimeGenerated desc
| join (
Event
| where Source == "MemorySize"
| sort by TimeGenerated desc
| project Computer, phMem = (tolong(RenderedDescription)) / (1024 * 1024)
| take 1
)
on Computer
| extend UtilizedMemPercent = 100 - (round(100 * (CounterValue / phMem), 0))
| project
UtilizedMemPercent,
AvailableMegabytes = CounterValue,
PhysicalMemory = phMem,
Computer


查询到的结果里就有百分比了

用百分比显示Windows内存使用率_云_04