O processo é executado mais lentamente como uma tarefa agendada do que interativamente

41

Eu tenho uma tarefa agendada que consome muita CPU e IO e leva cerca de quatro horas para ser executada (criando código-fonte, se você estiver curioso). A tarefa é um script do 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á sendo executada no Windows Server 2008 R2.

O que eu quero saber é por que demora muito mais tempo para executar como uma tarefa agendada - mais de uma hora a mais. Uma coisa que notei é que o agendador de tarefas é executado com prioridade abaixo da 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 idéia do que poderia ser diferente entre os dois cenários? Eu descartei as 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 estar competindo por recursos.

Charlie
fonte
Alguma atualização? Estou muito curioso para ver o que você pode encontrar.
mfinni
Eu encontrei o que acho que foi a causa; veja minha resposta abaixo.
Charlie
No Windows 10 Fall Creators, esse problema ainda existe e a solução do @Jason Mathison (editar arquivo .xml do Agendador de tarefas) ainda é a melhor solução.
BSalita

Respostas:

36

Parece que há mais do que apenas prioridade "regular" do processo em ação aqui. Como observei na pergunta, o agendador de tarefas, por padrão, executa sua tarefa com prioridade abaixo da normal. Esta pergunta no StackOverflow descreve como corrigir qualquer tarefa para executar com prioridade normal, mas a correção ainda deixa uma coisa um pouco diferente: prioridade de memória. A prioridade da memória era um novo recurso do Windows Vista e é descrita neste artigo da Technet . Você pode ver a prioridade da memória usando o Process Explorer , que é uma ferramenta essencial para qualquer administrador ou programador.

De qualquer forma, mesmo com a correção da prioridade da tarefa agendada, a prioridade da memória da sua tarefa é definida como 4, que é um nível abaixo da configuração normal de 5. Quando eu aprimorei manualmente a prioridade da memória da tarefa para 5, o desempenho estava ativado par com a execução do processo interativamente.

Para obter informações sobre como aumentar a prioridade, consulte minha resposta para uma pergunta relacionada ao StackOverflow sobre prioridade de E / S; definir a prioridade da memória é feito da mesma forma, via NtSetInformationProcess, com PROCESS_INFORMATION_CLASSdefinido como ProcessMemoryPriority(o valor é 39 ou 0x27). Eu poderia criar um utilitário gratuito que pode ser usado para definir isso, se outros precisarem e não tiverem acesso às ferramentas do programador.

Edição: Eu fui em frente e escrevi um utilitário gratuito para consultar e definir a prioridade de memória de uma tarefa, disponível aqui . O download contém o código fonte e um binário compilado.

Charlie
fonte
Você pode ver a prioridade de memória no Process Explorer clicando duas vezes sobre o nome do executável, abrir a aba "Desempenho", e em "memória física" é uma entrada para "Prioridade de Memória"
Moshe
17

O problema é que seu processo está começando com uma baixa prioridade de E / S e uma 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 gerados a partir desta tarefa agendada, verá que ela tem uma prioridade de E / S baixa e uma prioridade de memória 2.

Aqui está a solução para esse problema:

  1. Crie a tarefa
  2. Clique com o botão direito do mouse na tarefa e "exporte"
  3. Edite o arquivo task.xml que você acabou de exportar
  4. Você encontrará uma linha semelhante a <Priority>7</Priority>
  5. Altere o valor para uma prioridade normal (entre 4-6). Uma tabela dos valores possíveis: 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
  6. No agendador de tarefas, exclua a tarefa que você criou inicialmente
  7. No planejador 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.

Jason Mathison
fonte
Obrigado pela sugestão. A prioridade regular do processo e a prioridade de E / S são definitivamente parte dela, e a outra parte é a prioridade da memória. Veja a resposta aceita para mais informações.
31511 Charlie
Após exportar a tarefa para um arquivo XML, pode ser necessário alterar a codificação de caracteres de Unicode para ANSI. No Windows Server 2008 R2, a exportação é um arquivo Unicode e quando você tenta importá-lo novamente, a mensagem de erro The format of the task is not valid. The following error was reported: (1,2)::é fornecida. Salvar o arquivo em ANSI resolve-o para mim.
Erik Anderson
Muito obrigado, esta é realmente a melhor solução. Como os documentos mencionam, você também pode definir a Prioridade ainda mais alta (pelo menos até 1), para obter maior prioridade da CPU.
Rune Aamodt
Para quem pensa que você pode ajustar isso no registro, não se preocupe, não parece estar lá de uma maneira bem editável.
Nik
1

Se você configurá-lo para ser executado como uma tarefa agendada como Usuário X e, em seguida, efetuar login como Usuário X antes da execução, ele deverá abrir uma janela na sua sessão quando for executado, e será executado na sua sessão.

Se você fizer isso, leva mais tempo ou mais curto período de tempo? Não sei o que isso significa, mas pode ser um diferenciador útil. Pode haver algum acesso à rede que a conta do usuário tenha efetuado login, mas não durante a execução como uma tarefa agendada, que precise exceder o tempo limite e falhar? O comportamento é diferente se você criar uma nova conta de usuário e executá-la como uma tarefa agendada nessa conta?

Outra idéia: ao executá-lo como uma tarefa agendada - agora que você fixou a prioridade em seu script, todos os subprocessos são executados como Normal ou Abaixo do Normal?

mfinni
fonte
11
Os subprocessos definitivamente são executados como Normal, conforme verificado pelo procexp / taskman. Acho que a coisa da rede não é, porque não faz nenhum acesso substancial à rede, mas vou verificar isso duas vezes. A idéia de executar a tarefa como interativa também é interessante, vou tentar.
Charlie
O processo em si não precisa fazer nenhum acesso à rede que você conheça para que isso seja um problema. Leia este post da Sysinternals e veja como algo aparentemente não relacionado pode causar travamentos / lentidão. blogs.technet.com/b/markrussinovich/archive/2005/08/28/…
mfinni
1

Talvez as tarefas agendadas sejam executadas com uma prioridade mais baixa por padrão.

Use priopara forçar maior prioridade.

mcandre
fonte
Você está certo de que eles são executados com prioridade mais baixa, mas como eu mencionei, eu já expliquei isso. A menos que haja alguma prioridade além da prioridade do processo que eu não conheça.
Charlie
0

no início - você pode usar mais do que a prioridade normal (alta, por exemplo)

no segundo - você precisa entender, a sessão em primeiro plano requer alguns recursos, principalmente E / S de disco rígido e memória, para que a tarefa agendada fique menos. para uma referência clara, você precisa fazer logoff enquanto executa o script do PowerShell

e você também pode tentar adicionar mais memória / usar o trabalho ramdrive / split em vários discos rígidos para acelerar os processos

evg345
fonte
Obrigado pelas idéias. A máquina possui muita memória e capacidade de E / S; o problema é que as coisas ficam mais lentas como tarefas agendadas do que interativamente. Quando a tarefa agendada está em execução, geralmente não há sessão interativa de logon, então acho que esse também não é o problema.
Charlie
0

Esta pergunta é de um tempo atrás, e para o Windows Server 2008R2. Eu tinha a mesma pergunta, mas para o Windows 10. No Windows 10 (verificado em 1703 e 1809), basta definir a "Prioridade" como 4 via xml importado é suficiente para fornecer a mesma prioridade básica, prioridade dinâmica, prioridade de E / S e Prioridade de memória como um processo iniciado interativamente.

aggieNick02
fonte
0

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 = New-ScheduledTaskSettingsSet ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -Trigger $currentTask.Triggers -Action $currentTask.Actions -Settings $settings -User "NT AUTHORITY\SYSTEM"
Hank Killinger
fonte