Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Запрос на колличество используемой RAM. (http://forum.oszone.net/showthread.php?t=308286)

rudimko 22-11-2015 13:34 2577683

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

Foreigner 22-11-2015 14:59 2577719

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 2577724

Цитата:

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

Здорово. Плашка как бы одна (это виртуальная машина).
Правильно ли я понимаю, что не зависимо от того, что динамическая память будет расти или наоборот уменьшаться, то значение 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 2577730

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 2577731

Цитата:

Цитата Foreigner
rudimko, Виртуалка? »

Да. В принципе самый первый вариант судя по всему будет работать, только числа не складывает, т.к. capacity имеет 2 значения. Посчитал на пальцах - все совпадает.
Код:

[server]: PS C:\Users\user\Documents> (gwmi win32_physicalmemory).capacity | foreach { $_ / 1mb }
3968
28800

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

Foreigner 22-11-2015 15:57 2577734

Цитата:

Цитата rudimko
Выдает ошибку при сложении чисел: »

Измените стрoку:
Код:

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

rudimko 22-11-2015 16:06 2577736

Цитата:

Цитата Foreigner
(gwmi win32_physicalmemory).capacity | foreach { [int] $total += $_ / 1mb } »

Спасибо!

rudimko 01-12-2015 14:43 2580349

Спустя время обнаружилось:
Код:

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

Kazun 01-12-2015 15:22 2580358

Код:

Get-WmiObject Win32_PerfFormattedData_PerfOS_NUMANodeMemory -Filter "Name='_Total'" | Foreach {$_.TotalMBytes - $_.AvailableMBytes}

greg zakharov 02-12-2015 16:05 2580692

Как вариант, вкупе с 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 2580941

Спасибо, ребята.
Цитата:

Цитата Kazun
Get-WmiObject Win32_PerfFormattedData_PerfOS_NUMANodeMemory -Filter "Name='_Total'" | Foreach {$_.TotalMBytes - $_.AvailableMBytes} »

К сожалению, показывает только на W2012, а у меня W2008, но буду иметь на будущее, спасибо.

Цитата:

Цитата greg zakharov
Как вариант, вкупе с 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. Нужно как-то иначе инициировать запрос к данным. =\


Время: 18:30.

Время: 18:30.
© OSzone.net 2001-