Le processus s'exécute plus lentement en tant que tâche planifiée que de manière interactive

41

J'ai une tâche planifiée qui nécessite beaucoup de ressources processeur et IO, et prend environ quatre heures à s'exécuter (création du code source, si vous êtes curieux). La tâche est un script Powershell qui génère différents sous-processus pour effectuer son travail. Lorsque j'exécute le même processus de manière interactive à partir d'une invite Powershell, en tant que même compte d'utilisateur, il s'exécute dans environ deux heures et demie. La tâche est en cours d'exécution sur Windows Server 2008 R2.

Ce que je veux savoir, c'est pourquoi l'exécution d'une tâche planifiée prend beaucoup plus de temps - plus d'une heure de plus. Une chose que j'ai remarquée est que le planificateur de tâches s'exécute avec une priorité inférieure à la normale. Par conséquent, lorsque ma tâche démarre, il hérite de la même priorité réduite. Cependant, j'ai mis à jour le script pour redéfinir la priorité du processus Powershell sur Normal, et cela prend toujours autant de temps.

Quelqu'un a une idée de ce qui pourrait être différent entre les deux scénarios? J'ai écarté les différences de charge de processeur et d'E / S - cette tâche est la seule chose pour laquelle le système est utilisé. Il n'y a donc rien d'autre en cours d'exécution qui pourrait faire concurrence aux ressources.

Charlie
la source
Les mises à jour? Je suis très curieux de voir ce que vous pouvez trouver.
Mfinni
J'ai trouvé ce que je pense être la cause; voir ma réponse ci-dessous.
Charlie
Depuis Windows 10 Fall Creators, ce problème persiste et la solution de contournement de @Jason Mathison (modification du fichier .xml du Planificateur de tâches) reste la meilleure solution.
BSalita

Réponses:

36

Il semble qu’il n’ya pas que la priorité du processus "normal" à l’œuvre ici. Comme je l'ai indiqué dans la question, le planificateur de tâches exécute votre tâche par défaut avec une priorité inférieure à la normale. Cette question sur StackOverflow explique comment résoudre toute tâche à exécuter avec une priorité normale, mais le correctif laisse toujours une chose légèrement différente: la priorité de la mémoire. La priorité mémoire était une nouvelle fonctionnalité de Windows Vista, décrite dans cet article de Technet . Vous pouvez voir la priorité de la mémoire à l'aide de Process Explorer , un outil indispensable pour tout administrateur ou programmeur.

Quoi qu'il en soit, même avec le correctif de priorité de tâche planifiée, la priorité de mémoire de votre tâche est définie sur 4, soit un cran en dessous du réglage normal de 5. Lorsque j'ai boosté manuellement la priorité de mémoire de ma tâche jusqu'à 5, les performances étaient activées. est comparable à l'exécution interactive du processus.

Pour plus d'informations sur l'augmentation de la priorité, reportez -vous à ma réponse à une question connexe de StackOverflow sur la priorité d'IO; le paramétrage de la priorité de la mémoire est similaire, via NtSetInformationProcess, avec la valeur PROCESS_INFORMATION_CLASSdéfinie sur ProcessMemoryPriority(la valeur est 39 ou 0x27). Je pourrais créer un utilitaire gratuit qui peut être utilisé pour définir cela, si d’autres en ont besoin et n’ont pas accès aux outils de programmation.

EDIT: Je suis allé de l'avant et a écrit un utilitaire gratuit pour interroger et définir la priorité de mémoire d'une tâche, disponible ici . Le téléchargement contient à la fois du code source et un binaire compilé.

Charlie
la source
Vous pouvez voir la priorité de la mémoire dans Process Explorer en double-cliquant sur le nom de l'exécutable, en ouvrant l'onglet "Performances". Sous "Mémoire physique", vous trouverez une entrée pour "Priorité de la mémoire"
Moshe
17

Le problème est que votre processus commence avec une priorité d'entrée / sortie basse et une priorité de mémoire faible. Le moyen le plus simple de vérifier cela est d'utiliser l'explorateur de processus de sysinternals. Si vous examinez les propriétés de l'un des processus générés à partir de cette tâche planifiée, vous verrez qu'elle a une priorité d'entrée / sortie basse et une priorité de mémoire de 2.

Voici la solution à ce problème:

  1. Créer la tâche
  2. Faites un clic droit sur la tâche et "l'exportez"
  3. Editez le fichier task.xml que vous venez d'exporter
  4. Vous trouverez une ligne similaire à <Priority>7</Priority>
  5. Définissez la valeur sur une priorité normale (entre 4 et 6). Une table des valeurs potentielles: propriété TaskSettings.Priority
    • Une valeur de 4 aura la même priorité d'E / S et de mémoire qu'un processus interactif. Les valeurs de 5 et 6 auront une priorité de mémoire inférieure
  6. Dans le planificateur de tâches, supprimez la tâche créée initialement
  7. Dans le planificateur de tâches, dans la zone des actions, importez la tâche à partir du fichier XML.

Malheureusement, il n’existe aucun moyen de modifier la priorité initiale des tâches planifiées à partir de l’interface graphique.

Jason Mathison
la source
Merci pour la suggestion. La priorité des processus réguliers et la priorité des E / S en font définitivement partie, et l’autre partie est la priorité de la mémoire. Voir la réponse acceptée pour plus d'informations.
Charlie
Après avoir exporté la tâche dans un fichier XML, vous devrez peut-être modifier le codage de caractères d'Unicode à ANSI. Sur Windows Server 2008 R2, l'exportation est un fichier Unicode et lorsque vous essayez de le réimporter, le message d'erreur s'affiche The format of the task is not valid. The following error was reported: (1,2)::. L'enregistrement du fichier au format ANSI le résout pour moi.
Erik Anderson
Merci beaucoup, c'est vraiment la meilleure solution. Comme mentionné dans la documentation, vous pouvez également définir une priorité encore plus élevée (au moins jusqu'à 1) pour obtenir une priorité de processeur plus élevée.
Rune Aamodt
Pour ceux qui pensent que vous pourriez être en mesure de modifier cela dans le registre, ne vous inquiétez pas, ne semble pas être là d'une manière facilement modifiable.
Nik
1

Si vous le configurez pour qu'il s'exécute en tant que tâche planifiée en tant qu'utilisateur X, puis que vous vous connectez en tant qu'utilisateur X avant de l'exécuter, il devrait ouvrir une fenêtre dans votre session lors de son exécution, il s'exécutera dans votre session.

Si vous faites cela, est-ce que cela prend plus ou moins de temps? Je ne sais pas ce que cela signifiera, mais cela peut être un facteur de différenciation utile. Le compte d'utilisateur peut-il avoir un accès réseau lors de la connexion, mais pas lors de l'exécution en tant que tâche planifiée, ce délai doit expirer et échouer? Le comportement est-il différent si vous créez un nouveau compte d'utilisateur et le faites exécuter en tant que tâche planifiée sous ce compte?

Une autre idée: lorsqu’il s’exécute en tant que tâche planifiée - maintenant que vous avez défini la priorité de votre script, les sous-processus s’exécutent-ils tous en mode Normal ou Inférieur à la normale?

Mfinni
la source
1
Les sous-processus fonctionnent définitivement en tant que Normal, comme vérifié par procexp / taskman. Je pense que le problème du réseau n’est pas le cas, car il ne crée aucun accès réseau important, mais je le vérifierai deux fois. L'idée de faire de la tâche une tâche interactive est également intéressante, je vais l'essayer.
Charlie le
Le processus lui-même ne nécessite aucun accès réseau que vous sachiez pour que cela pose problème. Lisez ce message de Sysinternals et voyez comment quelque chose apparemment sans lien peut causer des blocages / lenteurs. blogs.technet.com/b/markrussinovich/archive/2005/08/28/…
mfinni
1

Peut-être que les tâches planifiées sont exécutées avec une priorité inférieure par défaut.

Utilisez priopour forcer une priorité plus élevée.

mcandre
la source
Vous avez raison de dire qu'ils ont une priorité plus faible, mais comme je l'ai mentionné, je l'ai déjà expliqué. Sauf s'il existe une priorité autre que la priorité du processus que je ne connais pas.
Charlie
0

au début - vous pouvez utiliser une priorité supérieure à la normale (Haute par exemple)

en second lieu - vous devez comprendre, qu'une session en avant-plan nécessite certaines ressources, principalement des entrées / sorties sur disque dur et de la mémoire, de sorte que les tâches planifiées deviennent moins longues. pour référence claire, vous devez vous déconnecter pendant que vous exécutez le script PowerShell

et aussi vous pouvez essayer d'ajouter plus de mémoire / utiliser ramdrive / split work sur plusieurs disques durs pour accélérer les processus

evg345
la source
Merci pour les idées. La machine dispose de beaucoup de mémoire et de capacité d'E / S. Le problème est simplement que les tâches programmées sont plus lentes que les tâches planifiées de manière interactive. Lorsque la tâche planifiée est en cours d'exécution, il n'y a généralement pas de session d'ouverture de session interactive, donc je pense que ce n'est pas le problème non plus.
Charlie
0

Cette question a été posée il y a quelque temps, et pour Windows Server 2008R2. J'avais la même question, mais pour Windows 10. Sous Windows 10 (vérifié sur 1703 et 1809), il suffit de définir la "Priorité" sur 4 via xml importé pour obtenir la même priorité de base, priorité dynamique, priorité d'entrée / sortie et Priorité mémoire en tant que processus démarré de manière interactive.

aggieNick02
la source
0

Voici un extrait PowerShell pour définir la priorité (fonctionne dans une session PowerShell à distance!):

$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
la source