52 votes

Le processus s'exécute plus lentement en tant que tâche programmée qu'en mode interactif.

J'ai programmé une tâche très gourmande en ressources CPU et IO, qui prend environ quatre heures à exécuter (construction du code source, si vous êtes curieux). Cette tâche est un script Powershell script qui génère divers sous-processus pour effectuer son travail. Lorsque j'exécute le même processus de manière interactive à partir d'une invite Powershell, avec le même compte d'utilisateur, il s'exécute en deux heures et demie environ. La tâche est exécutée sur Windows Server 2008 R2.

Ce que je veux savoir, c'est pourquoi il faut beaucoup plus de temps pour l'exécuter en tant que tâche planifiée - plus d'une heure de plus. Une chose que j'ai remarquée est que le planificateur de tâches fonctionne avec une priorité inférieure à la normale, de sorte que lorsque ma tâche démarre, elle hérite de la même priorité réduite. Cependant, j'ai mis à jour le script pour rétablir la priorité du processus Powershell à Normal, et cela prend toujours autant de temps.

Quelqu'un a-t-il une idée de ce qui pourrait différer entre les deux scénarios ? J'ai exclu les différences de charge du processeur et des entrées-sorties - cette tâche est la seule chose pour laquelle le système est utilisé, donc il n'y a rien d'autre en cours d'exécution qui pourrait être en concurrence pour les ressources.

44voto

n0pe Points 1339

Il semble qu'il y ait plus qu'une simple priorité de processus "normale" à l'œuvre ici. Comme je l'ai indiqué dans la question, le planificateur de tâches exécute par défaut votre tâche avec une priorité inférieure à la normale. Cette question sur StackOverflow décrit comment faire en sorte que n'importe quelle tâche s'exécute en priorité normale, mais il reste une chose légèrement différente : la priorité à la mémoire. La priorité à la mémoire est une nouvelle fonctionnalité de Windows Vista, décrite dans le document 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 la correction de la priorité des tâches planifiées, la priorité mémoire de votre tâche est fixée à 4, soit un cran en dessous de la valeur normale de 5. Lorsque j'ai augmenté manuellement la priorité mémoire de ma tâche à 5, les performances étaient comparables à celles de l'exécution interactive du processus.

Pour plus d'informations sur le renforcement de la priorité, voir ma réponse à une question connexe de StackOverflow La priorité de la mémoire se fait de la même manière, via NtSetInformationProcess, avec PROCESS_INFORMATION_CLASS fixé à ProcessMemoryPriority (sa valeur est 39 ou 0x27). Je pourrais créer un utilitaire gratuit qui peut être utilisé pour régler cela, si d'autres en ont besoin et n'ont pas accès à des outils de programmation.

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

25voto

Jason Mathison Points 231

Le problème est que votre processus démarre avec une faible priorité E/S et une faible priorité mémoire. Le moyen le plus simple de le vérifier est d'utiliser l'explorateur de processus de sysinternals. Si vous regardez les propriétés de n'importe lequel des processus qui ont été créés à partir de cette tâche planifiée, vous verrez qu'il a une priorité d'E/S faible et une priorité de mémoire de 2.

Voici la solution à ce problème :

  1. Créer la tâche
  2. Cliquer avec le bouton droit de la souris sur la tâche et l'"exporter".
  3. Modifier le fichier task.xml que vous venez d'exporter
  4. Vous trouverez une ligne similaire à <Priority>7</Priority>
  5. Modifier la valeur pour obtenir 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 5 et 6 auront une priorité de mémoire inférieure
  6. Dans le planificateur de tâches, supprimez la tâche que vous avez créée initialement
  7. Dans le planificateur de tâches, dans la zone d'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.

5voto

Hank Killinger Points 95

Voici un extrait powershell pour définir la priorité (fonctionne dans une session powershell distante !):

$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = $currentTask.Settings ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -TaskPath $currentTask.TaskPath -Settings $settings

1voto

Glen Solsberry Points 4756

Il se peut que les tâches planifiées soient exécutées par défaut à un niveau de priorité inférieur.

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

1voto

mfinni Points 35332

Si vous le configurez pour qu'il s'exécute en tant que tâche planifiée en tant qu'utilisateur X, et que vous vous connectez en tant qu'utilisateur X avant qu'il ne soit censé s'exécuter, il devrait ouvrir une fenêtre dans votre session lorsqu'il s'exécutera, car il s'exécutera dans votre session.

Dans ce cas, le délai est-il plus long ou plus court ? Je ne sais pas ce que cela signifie, mais cela peut être un facteur de différenciation utile. Se pourrait-il que le compte utilisateur ait un accès au réseau lorsqu'il est connecté, mais pas lorsqu'il est exécuté en tant que tâche planifiée, et que cet accès doive être interrompu dans le temps et échouer ? Le comportement est-il différent si vous créez un nouveau compte d'utilisateur et que vous l'exécutez en tant que tâche planifiée sous ce compte ?

Une autre idée : Lorsque vous l'exécutez en tant que tâche programmée - maintenant que vous avez fixé la priorité de votre script, les sous-processus s'exécutent-ils tous en mode Normal ou Inférieur à la normale ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X