
Eu tenho uma tarefa agendada que consome muito CPU e IO e leva cerca de quatro horas para ser executada (construindo código-fonte, se você estiver curioso). A tarefa é um script Powershell que gera vários subprocessos para realizar seu trabalho. Quando executo o mesmo processo interativamente a partir de um prompt do Powershell, como a mesma conta de usuário, ele é executado em cerca de duas horas e meia. A tarefa está em execução no Windows Server 2008 R2.
O que quero saber é por que demora muito mais para ser executada como uma tarefa agendada - mais de uma hora a mais. Uma coisa que notei é que o agendador de tarefas é executado com prioridade abaixo do normal, portanto, quando minha tarefa é iniciada, ela herda a mesma prioridade reduzida. No entanto, atualizei o script para definir a prioridade do processo do Powershell de volta para Normal, e ainda leva o mesmo tempo.
Alguém tem uma ideia do que poderia ser diferente entre os dois cenários? Excluí diferenças no processador e na carga de E/S - essa tarefa é a única coisa para a qual o sistema é usado, portanto, não há mais nada em execução que possa competir por recursos.
Responder1
Parece que há mais do que apenas prioridade de processo “normal” em ação aqui. Como observei na pergunta, o agendador de tarefas, por padrão, executa sua tarefa com prioridade inferior ao normal.Esta pergunta no StackOverflowdescreve como corrigir qualquer tarefa para ser executada com prioridade Normal, mas a correção ainda deixa uma coisa um pouco diferente: prioridade de memória. A prioridade de memória era um novo recurso do Windows Vista e está descrita emeste artigo da Technet. Você pode ver a prioridade da memória usandoExplorador de processos, que é uma ferramenta obrigatória para qualquer administrador ou programador.
De qualquer forma, mesmo com a correção da prioridade da tarefa agendada, a prioridade de memória da sua tarefa está definida como 4, que é um degrau abaixo da configuração normal de 5. Quando aumentei manualmente a prioridade de memória da minha tarefa para 5, o desempenho estava ligado par com a execução do processo interativamente.
Para obter informações sobre como aumentar a prioridade, consulteminha resposta a uma pergunta relacionada ao StackOverflowsobre a prioridade das OI; a configuração da prioridade da memória é feita de forma semelhante, via NtSetInformationProcess, com PROCESS_INFORMATION_CLASS
definido como ProcessMemoryPriority
(o valor é 39 ou 0x27). Eu poderia criar um utilitário gratuito que possa ser usado para configurar isso, se outras pessoas precisarem e não tiverem acesso às ferramentas do programador.
EDIT: fui em frente e escrevi um utilitário gratuito para consultar e definir a prioridade de memória de uma tarefa,disponivel aqui. O download contém o código-fonte e um binário compilado.
Responder2
O problema é que seu processo está iniciando com baixa prioridade de E/S e baixa prioridade de memória. A maneira mais fácil de verificar isso é com o Process Explorer da sysinternals. Se você observar as propriedades de qualquer um dos processos que foram gerados a partir desta tarefa agendada, verá que ele tem uma prioridade de E/S baixa e uma prioridade de memória 2.
Aqui está a solução para este problema:
- Crie a tarefa
- Clique com o botão direito na tarefa e "exporte-a"
- Edite o arquivo task.xml que você acabou de exportar
- Você encontrará uma linha semelhante a
<Priority>7</Priority>
- Altere o valor para uma prioridade normal (entre 4-6). Uma tabela dos valores potenciais:Propriedade TaskSettings.Priority
- Um valor 4 terá a mesma prioridade de E/S e memória que um processo interativo. Valores de 5 e 6 terão menor prioridade de memória
- No agendador de tarefas, exclua a tarefa que você criou inicialmente
- No agendador de tarefas, na área de ações, importe a tarefa do arquivo XML
Infelizmente não há como modificar a prioridade inicial das tarefas agendadas na GUI.
Responder3
Aqui está um trecho do PowerShell para definir a prioridade (funciona em uma sessão remota do PowerShell!):
$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = $currentTask.Settings ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -TaskPath $currentTask.TaskPath -Settings $settings
Responder4
Talvez as tarefas agendadas sejam executadas com prioridade mais baixa por padrão.
Use prio
para forçar uma prioridade mais alta.