10

我正在从模板克隆 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?
  • 有没有其他方法可以实现这一点(例如:执行工作流的不同方式......)?
4

3 回答 3

15

有一个选项可以使用-throttlelimit N. 这对于降低并行度非常有用,但是如果您尝试使用较高的数量,系统可能仍会将您限制为 5,具体取决于您的所有软件版本(YAY!Microsoft 一致性)。我知道这个问题很老了,但由于它在谷歌上没有一个像样的答案,我想我会插话的。

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

Create-VM
于 2014-12-26T17:49:15.980 回答
3

一个简单的解决方案是将列表分成更小的块并将其用作并行 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 ..
    } 
  }
}
于 2012-09-25T14:01:27.337 回答
1

Just wanted to add this detail, ThrottleLimit switch mentioned above is available in Powershell v4.0, its not available in v3.0. We have a mix of 2.0 and 3.0 servers

于 2015-02-06T20:12:26.367 回答