Powershell 3.0 — Рабочие процессы — Ограничение количества параллельных операций

Я клонирую виртуальные машины на сервере ESX из шаблона. Упрощенный код выглядит так:

Workflow Create-VM {
  $List = 1..500
  foreach -parallel ($Elem in $List)
  {
      # Create VM ...
      # Configure created VM ..
  }
}

Create-VM

Параллельное выполнение действительно полезно. К сожалению, в этом случае работает не очень хорошо. Генерируется слишком много параллельных запросов. Мне нужно ограничить количество параллельного выполнения меньшим числом (например, 4).

Я пытался изменить локальную конфигурацию сеанса (SessionThrottleLimit, MaxSessionsPerWorkflow, MaxRunningWorkflows) http://technet.microsoft.com/en-us/library/hh849862.aspx.

$WWE = New-PSWorkflowExecutionOption  -SessionThrottleLimit 4
Set-PSSessionConfiguration -Name microsoft.powershell.workflow `
   -SessionTypeOption $WWE 
Get-PSSessionConfiguration microsoft.powershell.workflow | 
fl SessionThrottleLimit

Вопрос

  • Какой параметр (или комбинацию) Конфигурации сеанса следует изменить, чтобы ограничить количество параллельных выполнений до 4?
  • Есть ли какой-то другой способ, как я могу этого добиться (например: другой способ выполнения рабочего процесса...)?

person Starspace    schedule 25.09.2012    source источник


Ответы (3)


Существует возможность ограничить количество параллельных процессов в цикле foreach-parallel с помощью -throttlelimit N. Это отлично подходит для уменьшения параллелизма, но если вы попробуете большое число, система все равно может ограничить вас до 5, в зависимости от всех ваших версий программного обеспечения (YAY! Консистенция Microsoft). Я знаю, что вопрос старый, но поскольку он появился в Google без достойного ответа, я решил вмешаться.

Workflow Create-VM {
  $List = 1..500
  foreach -parallel -throttlelimit 4 ($Elem in $List)
  {
      # Create VM ...
      # Configure created VM ..
  }
}

Create-VM
person jbo5112    schedule 26.12.2014

Тривиальное решение состоит в том, чтобы разделить список на более мелкие фрагменты и использовать их в качестве входных данных для параллельного foreach. Вот так,

Workflow Create-VM {
  $List = 1..500
  # Calclulate indexes to get elements 0,3; 4,7; 8,11 and so on
  # Use the .. operator to extract those elements from $list and pass
  # 'em to foreach -parallel processing part
  for($i=0;$i -le $List.Count-4; $i+=4) { 
    foreach -parallel ($Elem in $list[$i..($i+3)]) {
      # Create VM ...
      # Configure created VM ..
    } 
  }
}
person vonPryz    schedule 25.09.2012

Просто хотел добавить эту деталь: упомянутый выше переключатель ThrottleLimit доступен в Powershell v4.0, но недоступен в v3.0. У нас есть сочетание серверов 2.0 и 3.0.

person isingh    schedule 06.02.2015
comment
Версия 3 особенно плоха, потому что, хотя она имеет ограничение в 5 рабочих процессов, ни одна из них не будет повторно использоваться, пока они все не будут завершены. Так что он действительно работает только партиями по 5 штук. Насколько я знаю, этого же ограничения нет в v4. tl;dr, вероятно, не использует рабочие процессы в v3. - person Cody Konior; 31.08.2016