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

Commande gestion (affinité) des cores par appli [Powershell] - Shell/Batch - Programmation

Marsh Posté le 04-08-2014 à 19:42:04    

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
Reply

Marsh Posté le 04-08-2014 à 19:42:04   

Reply

Marsh Posté le 06-08-2014 à 11:02:43    

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:

Reply

Marsh Posté le 06-08-2014 à 17:07:43    

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
Reply

Marsh Posté le 06-08-2014 à 19:06:05    

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.

Reply

Marsh Posté le 08-08-2014 à 14:45:56    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed