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


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 commence, 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.


37
2018-06-16 18:05


origine


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:


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 Décrit comment résoudre toute tâche à exécuter avec une priorité normale, mais le correctif laisse une chose légèrement différente: la priorité de la mémoire. La priorité mémoire était une nouvelle fonctionnalité de Windows Vista et est décrite à la section cet article de Technet. Vous pouvez voir la priorité de la mémoire en utilisant Explorateur de processus, qui est 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é, voir ma réponse à une question StackOverflow liée sur la priorité IO; Le paramétrage de la priorité mémoire est effectué de la même manière via NtSetInformationProcess, avec PROCESS_INFORMATION_CLASS mis à ProcessMemoryPriority (la valeur de ceci 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 écrit un utilitaire gratuit pour interroger et définir la priorité de la mémoire d'une tâche, disponible ici. Le téléchargement contient à la fois du code source et un binaire compilé.


32
2018-06-21 01:08



Heureux de l'avoir trouvé, merci pour le partage. - MadBoy
Vous pouvez voir la priorité de 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 mémoire". - Moshe


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 consiste à 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'il 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 "exportez-la"
  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). Un tableau 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.


15
2018-04-08 04:37



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 The format of the task is not valid. The following error was reported: (1,2):: est donné. 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


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: lorsque vous l'exécutez en tant que tâche planifiée - maintenant que vous avez défini la priorité de votre script, les sous-processus sont-ils tous exécutés en mode Normal ou inférieur à la normale?


1
2018-06-16 18:42



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 processus lui-même ne nécessite aucun accès réseau que vous sachiez pour que cela pose un 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


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

Utilisation prio pour forcer une priorité plus élevée.


1
2018-06-16 18:11



Vous avez raison de dire que leur priorité est moindre, mais comme je l’ai dit, j’en ai déjà rendu compte. Sauf s'il existe une priorité autre que la priorité du processus que je ne connais pas. - Charlie


au début - vous pouvez utiliser plus que la priorité normale (haute par exemple)

en second lieu - vous devez comprendre que la session de premier plan nécessite certaines ressources, principalement des E / S de 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


0
2018-06-17 13:05



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