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.
Respostas:
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_CLASS
definido comoProcessMemoryPriority
(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.
fonte
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:
<Priority>7</Priority>
Infelizmente, não há como modificar a prioridade inicial das tarefas agendadas na GUI.
fonte
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.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?
fonte
Talvez as tarefas agendadas sejam executadas com uma prioridade mais baixa por padrão.
Use
prio
para forçar maior prioridade.fonte
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
fonte
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.
fonte
Aqui está um trecho do PowerShell para definir a prioridade (funciona em uma sessão remota do PowerShell!):
fonte