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.
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 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_CLASS
définie surProcessMemoryPriority
(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é.
la source
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:
<Priority>7</Priority>
Malheureusement, il n’existe aucun moyen de modifier la priorité initiale des tâches planifiées à partir de l’interface graphique.
la source
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.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?
la source
Peut-être que les tâches planifiées sont exécutées avec une priorité inférieure par défaut.
Utilisez
prio
pour forcer une priorité plus élevée.la source
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
la source
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.
la source
Voici un extrait PowerShell pour définir la priorité (fonctionne dans une session PowerShell à distance!):
la source