Войти

Показать полную графическую версию : [решено] Запрос на колличество используемой RAM.


rudimko
22-11-2015, 13:34
Уважаемые друзья, в WMI опыта практически нет, поэтому обращаюсь к вам за помощью...
Помогите для системы мониторинга написать сценарий-запрос через WMI или Powershell на выдачу результата по используемой RAM (используемая память) в Mb. Использовал бы готовые значения по свободной RAM, но т.к. RAM динамическая, эти значения не несут требуемого смысла.
Заранее спасибо!

Foreigner
22-11-2015, 14:59
PowerShell:

[int] $total += (gwmi win32_physicalmemory).capacity | foreach { $_ / 1mb }
[int] $free = (gwmi Win32_PerfFormattedData_PerfOS_Memory).availablembytes
$used = $total - $free

'Всего {0} Mb' -f $total
'Использовано {0} Mb' -f $used
'Свободно {0} Mb' -f $free


Не проверялось в случае нескольких плашек памяти.

rudimko
22-11-2015, 15:12
Не проверялось в случае нескольких плашек памяти. »
Здорово. Плашка как бы одна (это виртуальная машина).
Правильно ли я понимаю, что не зависимо от того, что динамическая память будет расти или наоборот уменьшаться, то значение USED все равно будет правильным?

Выдает ошибку при сложении чисел:
'Свободно {0} Mb' -f $free
Не удается преобразовать значение "System.Object[]" типа "System.Object[]" в тип "System.I
nt32".
строка:1 знак:1
+ [int] $total += (gwmi win32_physicalmemory).capacity | foreach { $_ / 1mb }
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : ConvertToFinalInvalidCastException

Сбой вызова метода из-за отсутствия в [System.Object[]] метода с именем "op_Subtraction".
строка:3 знак:1
+ $used = $total - $free
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (op_Subtraction:String) [], RuntimeExcept
ion
+ FullyQualifiedErrorId : MethodNotFound

Foreigner
22-11-2015, 15:37
rudimko, Виртуалка? Тогда посмотрите в сторону этих классов:

Win32_PerfFormattedData_BalancerStats_HyperVDynamicMemoryVM
Win32_PerfRawData_BalancerStats_HyperVDynamicMemoryVM
Win32_PerfFormattedData_Counters_HyperVDynamicMemoryIntegrationService
Win32_PerfRawData_Counters_HyperVDynamicMemoryIntegrationService

Или с помощью get-counter:

# Посмотреть список счетчиков:
(get-counter -list 'Виртуальная машина с динамической памятью Hyper-V').counter
# Посмотреть конкретный счетчик
get-counter -counter '\Виртуальная машина с динамической памятью Hyper-V\Физическая память'

Сам этого сделать не могу (за отсутствием виртуальных машин)

rudimko
22-11-2015, 15:43
rudimko, Виртуалка? »
Да. В принципе самый первый вариант судя по всему будет работать, только числа не складывает, т.к. capacity имеет 2 значения. Посчитал на пальцах - все совпадает.
[server]: PS C:\Users\user\Documents> (gwmi win32_physicalmemory).capacity | foreach { $_ / 1mb }
3968
28800

А этих каунтеров и классов на виртуалки у меня почему-то нет.

Foreigner
22-11-2015, 15:57
Выдает ошибку при сложении чисел: »
Измените стрoку:

(gwmi win32_physicalmemory).capacity | foreach { [int] $total += $_ / 1mb }

rudimko
22-11-2015, 16:06
(gwmi win32_physicalmemory).capacity | foreach { [int] $total += $_ / 1mb } »
Спасибо!

rudimko
01-12-2015, 14:43
Спустя время обнаружилось:
(gwmi -ComputerName $host win32_physicalmemory).capacity | foreach { [int] $total += $_ / 1mb }
Этот запрос покажет минимальную ОЗУ выделенную для запуска, в данном случае, виртуальной машины. Но если этот предел будет превышен и виртуальной машине будет выделено больше чем выделено за запуска, то этот запрос покажет тот же самый результат и раньше - минимальное кол-во ОЗУ, выделенное для запуска. =\ Следовательно и расчет, отталкиваясь от этого значения, будет неверным, к сожалению. =\

Kazun
01-12-2015, 15:22
Get-WmiObject Win32_PerfFormattedData_PerfOS_NUMANodeMemory -Filter "Name='_Total'" | Foreach {$_.TotalMBytes - $_.AvailableMBytes}

greg zakharov
02-12-2015, 16:05
Как вариант, вкупе с Invoke-Command задействовать рефлексию:
$MEMORYSTATUSEX = ($$ = [Object].Assembly.GetType(
'Microsoft.Win32.Win32Native'
)).GetNestedType(
'MEMORYSTATUSEX', [reflection.BindingFlags]36
).GetConstructor(
[Reflection.BindingFlags]36, $null, [Type[]]@(), $null
).Invoke($null)

if ($$.GetMethod(
'GlobalMemoryStatusEx', [Reflection.BindingFlags]40
).Invoke($null, @($MEMORYSTATUSEX))) {
$MEMORYSTATUSEX.GetType().GetFields(
[Reflection.BindingFlags]36
) | ? {$_.Name -clike '*Phys'} | % {
'{0} : {1:F2} Mb' -f $_.Name, ($_.GetValue($MEMORYSTATUSEX) / 1Mb)
}
}

rudimko
03-12-2015, 08:06
Спасибо, ребята.
Get-WmiObject Win32_PerfFormattedData_PerfOS_NUMANodeMemory -Filter "Name='_Total'" | Foreach {$_.TotalMBytes - $_.AvailableMBytes} »
К сожалению, показывает только на W2012, а у меня W2008, но буду иметь на будущее, спасибо.

Как вариант, вкупе с Invoke-Command задействовать рефлексию »
Здорово! С помощью "Invoke-Command" я решил обратиться к кластеру на Hyper-V хосты напрямую без WMI (с проверкой по месту нахождению конкретной VM на одном из узлов) и взять от туда значения у виртуальной машины - "MemoryAssigned", "MemoryDemand" и "MemoryMaximum". Эти показатели будут более верными, нежели выдает сама гостевая ОС.

Но возникло небольшое затруднение, почему-то Invoke-Command не передаст никак значение переменной $vm на удаленный хост и возвращает ошибку. Подскажите как правильно сделать?


#PARAM
$cluster = "CLUSTER-NAME" # потом $args[0]
$vm = "VM-NAME" # потом $args[1]

#CODE
$clusterVM = Invoke-Command $cluster -ScriptBlock {Get-ClusterGroup} | ?{$_.name -eq $vm}
$vmParams = Invoke-Command $clusterVM.OwnerNode -ScriptBlock {Get-VM $vm}


Возвращает ошибку

Cannot validate argument on parameter 'Name'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again.
+ CategoryInfo : InvalidData: (:) [Get-VM], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.HyperV.PowerShell.Commands.GetVMCommand
+ PSComputerName : HYPER-V NAME




Дополню сообщение:
Вышеуказанный мной метод - невариант оказался. В момент запроса процесс RM создает пиковую активность на CPU. Нужно как-то иначе инициировать запрос к данным. =\




© OSzone.net 2001-2012