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

37

Eu tenho uma tarefa agendada que é muito intensiva em CPU e IO e leva cerca de quatro horas para ser executada (criar código-fonte, se você estiver curioso). A tarefa é um script Powershell que gera vários subprocessos para fazer seu trabalho. Quando eu executo o mesmo processo interativamente 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 para ser executado como uma tarefa agendada - mais de uma hora a mais. Uma coisa que notei é que o agendador de tarefas é executado na 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 ao normal e ainda demora o mesmo.

Alguém tem uma ideia do que poderia ser diferente entre os dois cenários? Eu excluí as diferenças no processador e na carga de IO - essa é a única coisa que o sistema é usado, então não há mais nada em execução que possa estar competindo por recursos.

    
por Charlie 16.06.2010 / 20:05

5 respostas

32

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

De qualquer forma, mesmo com a correção de prioridade da tarefa agendada, a prioridade de memória de sua tarefa é definida como 4, que é um degrau abaixo da configuração normal de 5. Quando aumentei manualmente a prioridade de memória de minha tarefa até 5, o desempenho estava a par com a execução do processo de forma interativa.

Para informações sobre como aumentar a prioridade, consulte minha resposta a uma questão StackOverflow relacionada sobre a prioridade IO; a definição da prioridade de memória é feita de maneira semelhante, via NtSetInformationProcess, com PROCESS_INFORMATION_CLASS definido como ProcessMemoryPriority (o valor disso é 39 ou 0x27). Eu posso fazer um utilitário gratuito que possa ser usado para definir isso, se outros precisarem dele e não tiverem acesso às ferramentas do programador.

EDIT: 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.

    
por 21.06.2010 / 03:08
15

A questão é que seu processo está começando com uma baixa prioridade de E / S e uma prioridade de pouca memória. A maneira mais fácil de verificar isso é com o Process Explorer do sysinternals. Se você olhar para as propriedades de qualquer um dos processos que foram gerados a partir desta tarefa agendada, você verá que ela tem uma prioridade de E / S de baixa e prioridade de memória de 2.

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

  1. Crie a tarefa
  2. Clique com o botão direito na tarefa e "exportar"
  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 com os possíveis valores: Propriedade TaskSettings.Priority
    • Um valor de 4 terá a mesma E / S e prioridade de 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 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 da GUI.

    
por 08.04.2011 / 06:37
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 de ser executado, ele deverá abrir uma janela em sua sessão quando for executado, em sua sessão.

Se você fizer isso, demora mais ou menos 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 quando efetuado login, mas não quando estiver executando como uma tarefa agendada, que precisa expirar e falhar? O comportamento é diferente se você criar uma nova conta de usuário e executá-la como uma tarefa agendada nessa conta?

Outra ideia: ao executá-la como uma tarefa agendada - agora que você corrigiu a prioridade em seu script, os subprocessos são executados como Normal ou Abaixo do normal?

    
por 16.06.2010 / 20:42
1

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

Use prio para forçar uma prioridade mais alta.

    
por 16.06.2010 / 20:11
0

em primeiro lugar - você pode usar mais do que a prioridade normal (alta, por exemplo)

no segundo - você tem que entender, que a sessão de primeiro plano leva alguns recursos, principalmente IO do disco rígido e memória, para que a tarefa agendada receba menos. para um benchmark claro, você precisa fazer logoff enquanto o script powershell está sendo executado

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

    
por 17.06.2010 / 15:05