Question

J'ai un système quad core avec une application tierce qui exécute de temps en temps plusieurs processus (toujours le même exécutable mais plusieurs instances) et qui prend 100% du temps CPU. J'ai également quelques services Web fonctionnant sur la même boîte (IIS et une tierce partie).

Le problème, car tous les cœurs sont occupés, c’est que le délai imparti à ce serveur Web tiers est dépassé (IIS fonctionne cependant, mais plus lentement que d'habitude). Je n'ai aucun contrôle sur le serveur Web tiers, il fait partie du plus gros produit et doit être opérationnel. J'ai donc essayé de jouer avec l'affinité des processeurs (via SysInternals Process Explorer), de limiter ces processus fastidieux à 3 cœurs sur 4 et de dédier le 4ème cœur au serveur Web tiers, et cela semble fonctionner assez bien.

Le problème est qu’il ne définit l’affinité que sur le processus en cours et non sur le niveau de l’exécutable. Par conséquent, une fois ces processus terminés et réapparus en tant que nouveaux processus, ils sont tous identiques. Ils prennent les quatre cœurs. Donc, j'ai cherché sur Google cet utilitaire ImageCfg.exe de Microsoft, mais je ne le trouve pas sur le site Web de Microsoft pour le téléchargement et je vois que certaines personnes l'ont essayé et se plaignent maintenant que cela ne fonctionne pas vraiment.

Y at-il un moyen de coller l’affinité à l’exécutable?

Était-ce utile?

La solution

Une des fonctionnalités de Lasso de processus est de définir l'affinité d'un processus à chaque lancement de ce processus. .

Autres conseils

http: // waynes -world-it.blogspot.com/2009/06/processor-affinity-on-windows-server.html

PowerShell

Utilisez PowerShell pour définir l'affinité de processeur pour un ou plusieurs processus en cours d'exécution. Un exemple de script ci-dessous définit le masque de processeur de calc.exe sur les 4 premiers processeurs. J'aime cette méthode car le script est simple, facile à planifier, fonctionne sur x86 et x64, prend en charge plusieurs processus du même nom et au moins en partie, car il souligne à quel point la gestion avec PowerShell est simple.

Notez que si vous utilisez la factorielle d’un grand nombre avec calc.exe (n!), vous générerez 100% de CPU, ce qui peut être utile pour les tests. Le masque ci-dessous est 0xf = 1111 - un masque permettant d’utiliser uniquement les quatre premiers processeurs:

$calcSet = Get-Process -ProcessName "calc"
foreach ($calc in $calcSet) {$calc.ProcessorAffinity=0xF}

Vous pouvez consulter le paramètre / AFFINITY pour démarrer .

De l'aide:

AFFINITY    The new application will have the specified processor
            affinity mask, expressed as a hexadecimal number.

L’affinité des processeurs sur Windows étant un masque de bits, vous aurez peut-être besoin d’expérimentation, mais je suppose que 1 est le premier noyau, par conséquent 7 étant les trois premiers cœurs et < code> F étant tous les quatre. Ou 8 uniquement pour le quatrième.

Vous pouvez ensuite remplacer les tâches ou les raccourcis planifiés par un appel à start par les paramètres appropriés.

Vous pouvez utiliser le shim de l'application d'affinité à proc simple pour forcer un processeur au niveau exécutable, ce qui forcera le processus sur un cœur.

Cet article, http://msdn.microsoft.com/en- us / library / bb173458.aspx , contient un paragraphe sur l'activation de la cale vers le bas.

Utilisez SetProcessAffinityMask () . Et méfiez-vous, L'affinité du processeur est héritée!

Vous devez utiliser ImageFileExecutionOptions, plus précisément le " Débogueur " Option et écrivez votre propre petit exécutable qui appelle SetProcessAffinityMask () sur lui-même, puis génère un nouveau processus, celui pour lequel vous souhaitez définir l'affinité. Définissez-le comme débogueur et vous avez terminé.

L'utilitaire ImageCfg.exe fonctionne. Je viens de l'utiliser pour résoudre un problème de société aujourd'hui. Il est disponible à partir de http://www.robpol86.com/pages/imagecfg.php

Imagecfg -a 0x3 xxx.exe

limite le fichier .exe à CPU0 et CPU1, par exemple.

Clairement, ce fil est obsolète, mais j’ajoute un commentaire quand même au cas où quelqu'un googlerait sur ce sujet (comme je l’ai fait)

  

Vous pouvez essayer de définir la priorité du processus afin que même si cela   décide d'utiliser 100% de la CPU, ce qui est prioritaire   prendre le relais quand il le faut.

     

Faire cela automatiquement (plutôt que d'avoir à jouer dans la tâche   gestionnaire) est quelque chose que j'ai demandé il y a quelque temps.

La commande de démarrage peut être utilisée pour définir la priorité de démarrage d'un processus.

Par exemple. démarrer "mon chemin \ mon processus" / LOW pour une priorité basse.

Commutateurs de priorité autorisés BAS, NORMAL, HAUT, EN TEMPS RÉEL, ABOVENORMAL, BELOWNORMAL

Peut être appelé à partir d'un fichier batch par exemple.

Vous pouvez essayer de définir la priorité du processus de sorte que même s'il décide d'utiliser 100% des ressources du processeur, une priorité plus élevée peut prendre le relais en cas de besoin.

Faire cela automatiquement (plutôt que de jouer dans le gestionnaire de tâches) est une chose que je demandé il y a quelque temps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top