2012-05-13 18 views
7

Cuando ejecuta una instrucción sencilla localmente¿Por qué los trabajos de Powershell son tan lentos?

$path = 'C:\Windows\System32\WindowsPowerShell\v1.0' 
gci $path 

veo la respuesta de inmediato. Pero cuando lo ejecuto como trabajo en mi máquina local

$start = get-date 
$path = 'C:\Windows\System32\WindowsPowerShell\v1.0' 
$cmd = [scriptblock]::Create("gci $path") 
$jnr1 = Invoke-Command -computer localhost -ScriptBlock $cmd -asJob 
Wait-Job $jnr1 
Receive-job $jnr1 
$end = Get-date 
($end - $start).totalseconds 

Tengo que esperar 55 segundos. De mi experiencia en Unix hace una década. Esperaría que los trabajos en segundo plano se ejecuten casi tan rápido como los trabajos en primer plano.

¿Hay formas de acelerar la ejecución de trabajos en segundo plano de PowerShell?

+0

El inicio de una ventana de powershell lleva mucho tiempo en mi máquina. Pero después de su carga, ejecuta el comando bastante rápido. Puede ser que el cron esté cargando powershell primero, de ahí la demora. –

+0

PowerShell_ISE comienza en aproximadamente 10 segundos y Powershell en menos de 3 segundos en mi caso. Debe haber algo más. –

+0

He probado su script en XP sp3 y Windows 7 pro y Windows Server 2008 R2 siempre con powershell 2.0 y el tiempo transcurrido es (en orden): ~ 6 seg, ~ 5 seg, ~ 4 seg. –

Respuesta

4

Este comando más corto hace lo mismo:

Measure-Command {Start-Job -Command {gci C:\Windows\System32\WindowsPowerShell\v1.0} | Wait-Job | Receive-Job} 

En Windows 8 beta w/PSV3 fue rápido para mí ~ 3 segundos, en WinXP w/pSV2 era ~ 15-30 segundos.

Se introdujeron trabajos en segundo plano w/PsV2. Han tenido tiempo de optimizar desde v2 y PowerShell ahora usa el DLR en v3 ahora, por lo que podría explicar las diferencias en el rendimiento.

Tiene que girar otro proceso de PowerShell con el texto de comando, ejecutar el comando, devolver los resultados serializados y derribar el proceso.

Para saber qué está haciendo, ejecuté procmon mientras se ejecutaba el comando anterior y la mayoría de las veces powershell.exe estaba leyendo redes y claves de registro relacionadas con COM.

0

También estoy teniendo problemas con trabajos lentos donde se ejecuta rápidamente en primer plano, pero su problema es tan pronunciado para un solo comando que sospecho que es algo relacionado con el costo o alguna dificultad específica de la máquina de desove un nuevo proceso de PowerShell (Sí, obtienes un powershell.exe adicional para cada trabajo simultáneo.) Sin embargo, para mucha gente, es más que eso. Esta publicación: (https://vwiki.co.uk/Background_Jobs_(PowerShell)) menciona que los trabajos se ejecutan en PS como prioridad normal por debajo de la predeterminada. Algunos puestos propuesto poner uno de estos procedimientos en el bloque de código de trabajo para solucionar problemas sobre todo de CPU:

[System.Threading.Thread]::CurrentThread.Priority = 'AboveNormal' 
([System.Diagnostics.Process]::GetCurrentProcess()).PriorityClass = 'AboveNormal' 

Por desgracia para mí, creo que estoy teniendo un problema de rendimiento de E/S como upposed a un problema de rendimiento de la CPU con trabajos. Esta publicación: (How to set Low I/O ("background") priority in Powershell) aborda el concepto de aumentar la memoria y la prioridad de IO, pero no vi una respuesta que me sienta cómodo implementando.

Una de las características más importantes de los trabajos de Powershell es la ejecución en paralelo de múltiples trabajos. Una alternativa a los trabajos de PS son los "flujos de trabajo" de PS, pero parece que todavía tengo los mismos problemas de rendimiento con los flujos de trabajo que con los trabajos. Muy frustrante.

Cuestiones relacionadas