как получить данные из vcenter самым быстрым способом

Я пытаюсь собрать данные о производительности из vcenter для хостов. Я создал этот скрипт powershell. Это работает, но это занимает очень много времени. Есть ли более эффективный способ получения данных из vcenters.

Connect-VIServer "vcenter.server.com" -User user123 -Password testpassword
$allvms = @()
$allhosts = @()
$hosts = Get-VMHost
$vms = Get-Vm

foreach($vmHost in $hosts){
  $hoststat = "" | Select HostName, MemMax, MemAvg, MemMin, CPUMax, CPUAvg, CPUMin
  $hoststat.HostName = $vmHost.name

  $statcpu = Get-Stat -Entity ($vmHost)-start (get-date).AddDays(-1) -Finish (Get-Date)-MaxSamples 10 -stat cpu.usage.average
  $statmem = Get-Stat -Entity ($vmHost)-start (get-date).AddDays(-1) -Finish (Get-Date)-MaxSamples 10 -stat mem.usage.average

  $cpu = $statcpu | Measure-Object -Property value -Average -Maximum -Minimum
  $mem = $statmem | Measure-Object -Property value -Average -Maximum -Minimum

  $hoststat.CPUMax = $cpu.Maximum
  $hoststat.CPUAvg = $cpu.Average
  $hoststat.CPUMin = $cpu.Minimum
  $hoststat.MemMax = $mem.Maximum
  $hoststat.MemAvg = $mem.Average
  $hoststat.MemMin = $mem.Minimum
  $allhosts += $hoststat
}
$allhosts | Select HostName, MemMax, MemAvg, MemMin, CPUMax, CPUAvg, CPUMin | Export-Csv "c:\output\Hosts.csv" -noTypeInformation

person user1471980    schedule 20.08.2014    source источник
comment
Рассматривали ли вы возможность использования заданий PowerShell? Вы можете создать фоновое задание для каждого узла виртуальной машины.   -  person Trevor Sullivan    schedule 21.08.2014
comment
@TrevorSullivan, я даже подключился к одному хосту esx в vcenter, это занимает много времени. У вас есть пример работы, на которую вы ссылаетесь?   -  person user1471980    schedule 21.08.2014
comment
Вы можете поместить весь код внутри цикла foreach в вызов Start-Job. Таким образом, вы запускаете одно фоновое задание для каждого хоста виртуальной машины вместо синхронного запуска всего кода. В конце сценария вы можете использовать Wait-Job, чтобы дождаться завершения всех заданий, а затем агрегировать результаты вместе.   -  person Trevor Sullivan    schedule 21.08.2014


Ответы (2)


Рассмотрим следующий код, который переводит обработку в фоновое задание PowerShell:

Connect-VIServer "vcenter.server.com" -User user123 -Password testpassword
$allvms = @()
$allhosts = @()
$hosts = Get-VMHost;
$vms = Get-Vm;

# Define the code that will be executed as part of the background job
$Job = {
  $hoststat = @{};

  $statcpu = Get-Stat -Entity $args[0] -start (get-date).AddDays(-1) -Finish (Get-Date)-MaxSamples 10 -stat cpu.usage.average;
  $statmem = Get-Stat -Entity $args[0] -start (get-date).AddDays(-1) -Finish (Get-Date)-MaxSamples 10 -stat mem.usage.average;

  $cpu = $statcpu | Measure-Object -Property value -Average -Maximum -Minimum;
  $mem = $statmem | Measure-Object -Property value -Average -Maximum -Minimum;

  $hoststat.HostName = $args[0];
  $hoststat.CPUMax = $cpu.Maximum;
  $hoststat.CPUAvg = $cpu.Average;
  $hoststat.CPUMin = $cpu.Minimum;
  $hoststat.MemMax = $mem.Maximum;
  $hoststat.MemAvg = $mem.Average;
  $hoststat.MemMin = $mem.Minimum;

  return $hoststat;
}

$JobList = @();
foreach($vmHost in $hosts){
    $JobList += Start-Job -ScriptBlock $Job -Name $vmHost.Name -ArgumentList $vmHost.Name;
}

Wait-Job -Job $JobList;
$JobList | % { $allhosts += Receive-Job -Job $PSItem; };
$allhosts | Select HostName, MemMax, MemAvg, MemMin, CPUMax, CPUAvg, CPUMin | Export-Csv "c:\output\Hosts.csv" -noTypeInformation
person Trevor Sullivan    schedule 20.08.2014
comment
Я просто запускаю этот скрипт как любой другой ps1? - person user1471980; 21.08.2014
comment
хотя это здорово, закончилась память. - person user1471980; 21.08.2014

Вы можете собрать несколько метрик из нескольких сущностей хоста с помощью одного вызова get-stat, например,

get-stat -Entity $hosts -MaxSamples 10 -Stat "cpu.usage.average","mem.usage.average"

а затем используйте Group-Object для анализа результатов. Сообщения LucD здесь могут оказаться полезными .

Интересно, нужен ли вам $vms = Get-Vm, потому что опубликованный вами код не относится к этому.

Ваш сеанс PS должен находиться в той же локальной сети, что и vcenter db. См. также kb.vmware.com/kb/2007388.

person noam    schedule 20.08.2014
comment
Команда get-stat выполняется очень долго. Знаете ли вы какой-либо другой способ быстрого получения данных о производительности от vcenter? - person user1471980; 21.08.2014
comment
Не навскидку, но API может не помочь, если запросы к vcenter db выполняются плохо. Смотрите обновленный ответ. - person noam; 21.08.2014
comment
создание скрипта powershell для извлечения данных из vcenters занимает очень много времени, я пока не видел, чтобы он был успешно завершен. Мне интересно, есть ли другой способ? - person user1471980; 22.08.2014