2012-09-25 26 views
5

Estoy clonando máquinas virtuales en el servidor ESX desde la plantilla. código simplificado se ve así:Powershell 3.0 - Flujos de trabajo - Limite el número de ejecución en paralelo

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

Create-VM 

La ejecución paralela es realmente útil. Desafortunadamente en este caso no funciona bastante bien. Se generan demasiadas solicitudes paralelas. Necesito limitar el número de ejecución paralela a un número más pequeño (por ejemplo 4).

Estaba intentando cambiar la configuración de sesión local (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 

Pregunta

  • Qué parámetro (o combinación) de configuración de sesión que debe cambiar, con el fin de limitar el número de ejecución en paralelo a 4?
  • ¿Hay algún otro método de cómo puedo lograr eso (por ejemplo: forma diferente de ejecutar el flujo de trabajo ...)?

Respuesta

3

Una solución trivial es dividir la lista en trozos más pequeños y usarla como entrada para foreach paralelos. Como tal,

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 .. 
    } 
    } 
} 
+0

Gracias, funciona bien. – Starspace

9

Hay una opción para limitar el número de procesos paralelos en un bucle foreach-paralelo usando -throttlelimit N. Es ideal para reducir el paralelismo, pero si prueba un número alto, el sistema aún puede limitarlo a 5, dependiendo de todas las versiones de software (¡consistencia de YAY! De Microsoft). Sé que la pregunta es viejo, pero desde que entró en Google sin una respuesta decente, pensé que interrumpiría.

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

Create-VM 
0

sólo quería añadir este detalle, el interruptor ThrottleLimit mencionado anteriormente está disponible en Powershell v4 .0, no está disponible en v3.0. Tenemos una mezcla de 2.0 y 3.0 servidores

+0

v3 es particularmente malo, porque a pesar de que tiene un límite de 5 flujos de trabajo, no volverá a utilizar ninguno de ellos hasta que se hayan * completado *. Entonces realmente se ejecuta en tandas de 5 solamente. AFAIK esta misma limitación no existe en v4. tl; dr probablemente no use flujos de trabajo en v3. –

Cuestiones relacionadas