Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
414 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Powershell]Commande gestion (affinité) des cores par appli

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Powershell]Commande gestion (affinité) des cores par appli

n°2234919
-Riphur-
Posté le 04-08-2014 à 19:42:04  profilanswer
 

Salut à tous,
 
Etant infographiste 3D, je suis à la recherche d'une ligne de commande (pour un .bat) / d'un soft qui serai capable de pointer une application déjà lancée et de gérer ses affinité CPU (comme Bill2's Process Manager que j'utilise déjà, mais capable de recevoir des lignes de commande) pour servir de "fusible" quand les T° sont trop haute pendant les phases de rendus.
 
Pour le moment, j'ai configuré SpeedFan qui m’envoie des mails espacés de 10mn à chaque fois qu'un core dépasse 75°c. C'est bien, mais en pleine nuit, j'ai juste la flemme d'allumer un teamviewer pour calmer le cpu en coupant quelques core.
 
L'idée sera de définir sur Speedfan des régles du type :
" Si la T° CPU > 72°, alors couper 1 core sur toto.exe"
" Si la T° CPU > 74°, alors couper 2 core sur toto.exe"
" Si la T° CPU < 70°, allumé tous les cores sur toto.exe"
 
En cas de forte température et de réduire la charge du CPU pour le maintenir dans des T° raisonnable.
 
Je connais la commande "start toto.exe /affinity 0xx" qui marche pour le lancement, mais rien d'équivalent quand le processus est déjà en route.
 
(PS Modo, je sais pas si c'était mieux ici ou dans la section Windows)


Message édité par -Riphur- le 06-08-2014 à 11:40:57
mood
Publicité
Posté le 04-08-2014 à 19:42:04  profilanswer
 

n°2235034
-Riphur-
Posté le 06-08-2014 à 11:02:43  profilanswer
 

Bon, j'ai la base de la solution.
 
Je remercie le développeur de Bill2's Process Manager de m'avoir donné la piste. :jap:  
 
La commande existe a travers Powershell !
Tout est ici : http://stackoverflow.com/questions [...] ows-script
 
Reste à faire les règles avec les commandes adaptés pour Speedfan :bounce:

n°2235103
-Riphur-
Posté le 06-08-2014 à 17:07:43  profilanswer
 

Alors, j'ai une nouvelle question, je continue :

 

La fonction marche nickel pour faire ce genre de chose :
(modifié notepad++ pour utiliser les cores 1 - 3 - 4)
$Process = Get-Process notepad++; $Process.ProcessorAffinity=13

 

Par contre, si j'ai 2 processus notepad++, et bien la commande ne fonctionne plus...

 

Comment cibler tous les processus notepad++ en cours ?

 

(je prends notepad++ comme exemple, mais ca sera 3dsmax dans mon cas concret)


Message édité par -Riphur- le 06-08-2014 à 17:08:44
n°2235117
-Riphur-
Posté le 06-08-2014 à 19:06:05  profilanswer
 

Je continue, par rapport à mon post précédent
 
J'ai trouvé une commande Powershell permettant de cibler un processus et de modifier ses cores cpu affectés.
 

Code :
  1. $Process = Get-Process 3dsmax; $Process.ProcessorAffinity=13


13 étant 0001101 en binaire, donc les cores 1 - 3 - 4 sont actifs pour 3dsmax.
 
Jusque là, ca va.
 
Mes questions
- Par rapport à mon post précédent, la commande Powershell ne fonctionne que si il n'y a qu'un seul 3dsmax de lancé. Si j'ai 2 processus 3dsmax, ca ne marche plus. Il me dit que le paramètre ProcessorAffinity n'est pas trouvable.
Comment cibler tous les processus du même nom ?
 
- Plus complexe : Si je veux gérer les cores indépendamment, selon les T° que Speedfan m'envoi, il va me falloir interroger quels sont les cores actifs (avec Get-Process 3dsmax | Select-Object ProcessorAffinity).
Puis récupérer la valeur décimale, la convertir en binaire pour identifier les cores, stocker les états des cores pour ne changer que le core qui serai trop chaud.
Ensuite, manip inverse, reprendre le binaire en décimale, et l'attribuer au processus 3dsmax.
 
Bon, je sais pas si c'est très clair. Concrètement, lorsqu'un core devient trop chaud, il se désactive du processus sans modifier l'état des autres cores.
Lorsque que le core deviendra plus froid, j'envoi une autre commande pour le réactiver.
 
Comment stocker la valeur du get-process dans une variable ?
 
Comment mathématiquement gérer ma valeur d'affinité pour identifier les cores ?
 
Voilà, est-ce que quelqu'un pourrai m'orienter un peu.

n°2235269
-Riphur-
Posté le 08-08-2014 à 14:45:56  profilanswer
 

Personne ?
 
M'en fou, j'ai réussi tout seul [:ptibeur:5]
 
Sinon, après avoir trainé sur le net pour récupérer des bouts de fonction, et bricolé plusieurs heures, je réussi a faire ce que je voulais !  
 
Bon, c'est surement très sale et mal foutu, mais ca marche  
 
Voici à quoi ca ressemble, sachant que j'ai un fichier .ps1 par action sur les cores.  
Ici je coupe le core0.
 

Code :
  1. # Récupération de la valeur de l'affinité CPU de 3dsmax
  2. $CoreBak = Get-Process 3dsmax | Select-Object ProcessorAffinity
  3. $CoreBak = $CoreBak | Select-Object -First 1
  4. $CoreBak = $CoreBak -replace "@{ProcessorAffinity="
  5. $CoreBak = $CoreBak -replace "}"
  6. [int]$CoreBak = $CoreBak.tostring()
  7. # Valeur de l'affinité en binaire avec 8 caractères
  8. $CoreBin = [Convert]::ToString($Corebak, 2)
  9. $CoreN = $CoreBin | measure-object -character | select -expandproperty characters
  10. if ($CoreN -eq 7){$CoreBin=$CoreBin.insert(0,"0" )}
  11. if ($CoreN -eq 6){$CoreBin=$CoreBin.insert(0,"00" )}
  12. if ($CoreN -eq 5){$CoreBin=$CoreBin.insert(0,"000" )}
  13. if ($CoreN -eq 4){$CoreBin=$CoreBin.insert(0,"0000" )}
  14. if ($CoreN -eq 3){$CoreBin=$CoreBin.insert(0,"00000" )}
  15. if ($CoreN -eq 2){$CoreBin=$CoreBin.insert(0,"000000" )}
  16. if ($CoreN -eq 1){$CoreBin=$CoreBin.insert(0,"0000000" )}
  17. $Core00 = (0+$CoreBin[7]-48)*1
  18. $Core01 = (0+$CoreBin[6]-48)*2
  19. $Core10 = (0+$CoreBin[5]-48)*4
  20. $Core11 = (0+$CoreBin[4]-48)*8
  21. $Core20 = (0+$CoreBin[3]-48)*16
  22. $Core21 = (0+$CoreBin[2]-48)*32
  23. $Core30 = (0+$CoreBin[1]-48)*64
  24. $Core31 = (0+$CoreBin[0]-48)*128
  25. $Core00 = 0
  26. # Valeur de la nouvelle l'affinité en decimal
  27. $CoreNew = $Core00 + $Core01 + $Core10 + $Core11 + $Core20 + $Core21 + $Core30 + $Core31
  28. # Appliquer l'affinité des cores
  29. $Process = Get-Process 3dsmax ;
  30. $Process | Foreach-Object {$_.ProcessorAffinity=$CoreNew}
  31. # Nettoyage
  32. Remove-Variable CoreBak


Après tout ca est lancé depuis un .bat avec un compte à rebours de 60s puis ca réactive le core0

Code :
  1. Powershell.exe -executionpolicy remotesigned -File C:Powershellpowershell-8c-core0-off.ps1
  2. @ECHO OFF
  3. SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
  4. FOR /F %%# IN ('COPY /Z "%~dpf0" NUL') DO SET "CR=%%#"
  5. FOR /L %%# IN (60,-1,1) DO (SET/P "=Repos du Core0 pendant %%# secondes. !CR!"<NUL:
  6.     PING -n 2 127.0.0.1 >NUL:«»)
  7.    
  8. Powershell.exe -executionpolicy remotesigned -File C:Powershellpowershell-8c-core0-on.ps1


Et la même chose avec les autres core du cpu.
Le tout est déclenché par rapport à la T° du CPU depuis SpeedFan


Message édité par -Riphur- le 08-08-2014 à 14:48:43

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Powershell]Commande gestion (affinité) des cores par appli

 

Sujets relatifs
SQLPLUS rediriger sortie avec une seule commandeMettre une variable dans la commande d'un bouton
Bouton de commande/ Remplissage de formulaire[Script Shell] utilisation de la commande tar
Recherche Soft pour avoir un son sur les touches en MajusculeSUPPRESSION DE FICHIERS PAR LA COMMANDE RMDIR ET RECUVA.
executer pls commande[C#] Fréquence réelle CPU, Température et Ventilateur
lancer une commande lors d'un clic sur un boutonMCD de gestion de transport marchandises routier SVP
Plus de sujets relatifs à : [Powershell]Commande gestion (affinité) des cores par appli


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR