web-dev-qa-db-fra.com

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 est très gourmande en CPU et en E/S et prend environ quatre heures à exécuter (construction du code source, si vous êtes curieux). La tâche est un script Powershell qui engendre divers sous-processus pour faire son travail. Lorsque j'exécute le même processus de manière interactive à partir d'une invite Powershell, comme le même compte d'utilisateur, il s'exécute en environ deux heures et demie. La tâche s'exécute sur Windows Server 2008 R2.

Ce que je veux savoir, c'est pourquoi cela prend tellement plus de temps à s'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 s'exécute à une priorité inférieure à la normale, donc 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 exclu les différences de processeur et IO charge - cette tâche est la seule raison 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.

43
Charlie

Il semble qu'il y ait plus qu'une simple priorité de processus "régulière" à l'œuvre ici. Comme je l'ai noté dans la question, le planificateur de tâches exécute par défaut votre tâche à une priorité inférieure à la normale. Cette question sur StackOverflow décrit comment corriger n'importe quelle tâche à exécuter en priorité normale, mais le correctif laisse toujours une chose légèrement différente: la priorité de la mémoire. La priorité de la mémoire était une nouvelle fonctionnalité pour Windows Vista, et est décrite dans cet article Technet . Vous pouvez voir la priorité de la mémoire en utilisant Process Explorer , 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, ce qui est un cran en dessous du paramètre normal de 5. Lorsque j'ai augmenté manuellement la priorité de mémoire de ma tâche jusqu'à 5, les performances étaient activées. comparable à l'exécution interactive du processus.

Pour plus d'informations sur l'augmentation de la priorité, voir ma réponse à une question StackOverflow connexe about IO priorité; la définition de la priorité de la mémoire se fait de la même manière, via NtSetInformationProcess, avec PROCESS_INFORMATION_CLASS défini sur ProcessMemoryPriority (la valeur est 39 ou 0x27). Je pourrais faire 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: J'ai continué et j'ai é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é.

37
Charlie

Le problème est que votre processus démarre avec une priorité d'E/S faible et une priorité de mémoire faible. Le moyen le plus simple de vérifier cela est avec 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'E/S faible et une priorité 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. Modifiez le fichier task.xml que vous venez d'exporter
  4. Vous trouverez une ligne similaire à <Priority>7</Priority>
  5. Modifiez 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 que vous avez initialement créée
  7. Dans le planificateur de tâches, dans la zone d'actions, importez la tâche à partir du fichier XML

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

18
Jason Mathison

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

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

1
mcandre

Si vous le définissez 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 qu'il ne soit censé s'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, cela prend-il la période de temps plus longue ou plus courte? Je ne sais pas ce que cela signifie, mais cela peut être un différenciateur utile. Pourrait-il y avoir un accès réseau dont dispose le compte d'utilisateur lorsqu'il est connecté, mais pas lors de l'exécution en tant que tâche planifiée, qui doit expirer 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 planifiée - maintenant que vous avez fixé la priorité sur votre script, les sous-processus s'exécutent-ils tous en Normal ou en dessous de la normale?

1
mfinni

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

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

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

à la seconde - vous devez comprendre que la session de premier plan prend quelques ressources, principalement le disque dur IO et la mémoire, donc la tâche planifiée devient moins. pour un benchmark clair, vous devez vous déconnecter pendant l'exécution du script powershell

et vous pouvez également essayer d'ajouter plus de mémoire/utiliser un ramdrive/travail fractionné sur plusieurs disques durs pour accélérer les processus

0
evg345

Cette question date d'un certain temps et concerne le serveur Windows 2008R2. J'avais la même question, mais pour Windows 10. Sur Windows 10 (vérifié sur 1703 et 1809), il suffit de définir la "priorité" à 4 via le xml importé pour vous donner la même priorité de base, priorité dynamique, priorité d'E/S et la priorité mémoire en tant que processus démarré de manière interactive.

0
aggieNick02