El proceso se ejecuta más lento como tarea programada que de forma interactiva

El proceso se ejecuta más lento como tarea programada que de forma interactiva

Tengo una tarea programada que requiere mucha CPU y IO, y tarda aproximadamente cuatro horas en ejecutarse (compilando el código fuente, si tiene curiosidad). La tarea es un script de Powershell que genera varios subprocesos para realizar su trabajo. Cuando ejecuto el mismo proceso de forma interactiva desde un indicador de Powershell, como la misma cuenta de usuario, se ejecuta en aproximadamente dos horas y media. La tarea se ejecuta en Windows Server 2008 R2.

Lo que quiero saber es por qué tarda tanto más en ejecutarse como tarea programada: más de una hora más. Una cosa que noté es que el programador de tareas se ejecuta con una prioridad inferior a lo normal, por lo que cuando comienza mi tarea, hereda la misma prioridad reducida. Sin embargo, actualicé el script para restablecer la prioridad del proceso de Powershell a Normal, y todavía lleva el mismo tiempo.

¿Alguien tiene una idea de qué podría ser diferente entre los dos escenarios? He descartado diferencias en el procesador y la carga de E/S: esta tarea es para lo único que se utiliza el sistema, por lo que no hay nada más en ejecución que pueda competir por los recursos.

Respuesta1

Parece que aquí hay algo más que una prioridad de proceso "normal". Como señalé en la pregunta, el programador de tareas ejecuta su tarea de forma predeterminada con una prioridad inferior a la normal.Esta pregunta en StackOverflowdescribe cómo arreglar cualquier tarea para que se ejecute con prioridad Normal, pero la solución aún deja una cosa ligeramente diferente: la prioridad de la memoria. La prioridad de memoria era una característica nueva de Windows Vista y se describe eneste artículo de Technet. Puedes ver la prioridad de la memoria usandoExplorador de procesos, que es una herramienta imprescindible para cualquier administrador o programador.

De todos modos, incluso con la corrección de prioridad de tarea programada, la prioridad de memoria de su tarea se establece en 4, que está un nivel por debajo de la configuración normal de 5. Cuando aumenté manualmente la prioridad de memoria de mi tarea hasta 5, el rendimiento estaba activado. a la par de ejecutar el proceso de forma interactiva.

Para obtener información sobre cómo aumentar la prioridad, consultemi respuesta a una pregunta relacionada con StackOverflowsobre la prioridad de IO; La configuración de la prioridad de la memoria se realiza de manera similar, a través de NtSetInformationProcess, con el valor PROCESS_INFORMATION_CLASSestablecido en ProcessMemoryPriority(el valor de esto es 39 o 0x27). Podría crear una utilidad gratuita que pueda usarse para configurar esto, si otros la necesitan y no tienen acceso a herramientas de programación.

EDITAR: Seguí adelante y escribí una utilidad gratuita para consultar y configurar la prioridad de memoria de una tarea.disponible aquí. La descarga contiene código fuente y un binario compilado.

Respuesta2

El problema es que su proceso comienza con una prioridad de E/S baja y una prioridad de memoria baja. La forma más sencilla de verificar esto es con el explorador de procesos de sysinternals. Si observa las propiedades de cualquiera de los procesos que se generaron a partir de esta tarea programada, verá que tiene una prioridad de E/S baja y una prioridad de memoria de 2.

Aquí está la solución a este problema:

  1. Crea la tarea
  2. Haga clic derecho en la tarea y "expórtela"
  3. Edite el archivo task.xml que acaba de exportar
  4. Encontrarás una línea similar a<Priority>7</Priority>
  5. Cambie el valor a una prioridad normal (entre 4 y 6). Una tabla de los valores potenciales:Propiedad TaskSettings.Priority
    • Un valor de 4 tendrá la misma prioridad de memoria y E/S que un proceso interactivo. Los valores de 5 y 6 tendrán menor prioridad de memoria.
  6. En el programador de tareas, elimine la tarea que creó inicialmente
  7. En el programador de tareas, en el área de acciones, importe la tarea desde el archivo XML

Lamentablemente no hay forma de modificar la prioridad inicial de las tareas programadas desde la GUI.

Respuesta3

Aquí hay un fragmento de PowerShell para establecer la prioridad (¡funciona en una sesión remota de PowerShell!):

$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = $currentTask.Settings ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -TaskPath $currentTask.TaskPath -Settings $settings

Respuesta4

Quizás las tareas programadas se ejecuten con una prioridad más baja de forma predeterminada.

Úselo priopara forzar una mayor prioridad.

información relacionada