Question
Gestion de l'affinité cpu d'un processus
- Riphur
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 2
- Remerciements reçus 0
il y a 11 ans 7 mois #17907
par Riphur
Gestion de l'affinité cpu d'un processus a été créé par Riphur
Bonjour à tous,
Je suis nouveau, infographiste 3D, et on vient de me faire découvrir PowerShell.
Alors, pourquoi m'intéresser à Powershell ?
L'été étant synonyme de chaleur, mes pauvres machines de rendus en réseau souffre péniblement quand la T° ambiante s'envolent. Je n'ai pas de clim et comme les calculs peuvent tourner au boulot jour et nuit pendant plus jours / semaine, les T° CPU peuvent arriver à des niveaux critiques.
C'est là que Powershell, accompagné de SpeedFan me permettent de gérer la situation.
Speedfan, logiciel de monitoring, permet d'avoir la T° de chaque core du CPU. Lorsque que l'un des cores dépassent une certaine T°, je peux lancer un beep / un mail / un programme.
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[/code:1]
13 étant 0001101 en binaire, donc les cores 1 - 3 - 4 sont actifs pour 3dsmax.
Jusque là, ca va.
Mes questions
- 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.<br><br>Message édité par: Riphur, à: 6/08/14 19:03
Je suis nouveau, infographiste 3D, et on vient de me faire découvrir PowerShell.
Alors, pourquoi m'intéresser à Powershell ?
L'été étant synonyme de chaleur, mes pauvres machines de rendus en réseau souffre péniblement quand la T° ambiante s'envolent. Je n'ai pas de clim et comme les calculs peuvent tourner au boulot jour et nuit pendant plus jours / semaine, les T° CPU peuvent arriver à des niveaux critiques.
C'est là que Powershell, accompagné de SpeedFan me permettent de gérer la situation.
Speedfan, logiciel de monitoring, permet d'avoir la T° de chaque core du CPU. Lorsque que l'un des cores dépassent une certaine T°, je peux lancer un beep / un mail / un programme.
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[/code:1]
13 étant 0001101 en binaire, donc les cores 1 - 3 - 4 sont actifs pour 3dsmax.
Jusque là, ca va.
Mes questions
- 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.<br><br>Message édité par: Riphur, à: 6/08/14 19:03
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 11 ans 7 mois #17908
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Gestion de l'affinité cpu d'un processus
Salut,
Riphur écrit:
Si tu as plusieurs process, Get-Process renvoi un tableau d'objets.
Tu dois avoir la version de 2 de PS (cf. $PSVersiontable), dans ce cas il faut itérer sur le tableau :
[code:1]
$Process|
Foreach-Object {$_.ProcessorAffinity=13}
[/code:1]
Pour le second pb, tu ne sais pas comment convertir /tester l'état d'un bit avec PS ?
Riphur écrit:
Pense à indiquer le message d'erreur renvoyé par PS.- 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.
Si tu as plusieurs process, Get-Process renvoi un tableau d'objets.
Tu dois avoir la version de 2 de PS (cf. $PSVersiontable), dans ce cas il faut itérer sur le tableau :
[code:1]
$Process|
Foreach-Object {$_.ProcessorAffinity=13}
[/code:1]
Pour le second pb, tu ne sais pas comment convertir /tester l'état d'un bit avec PS ?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Riphur
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 2
- Remerciements reçus 0
il y a 11 ans 7 mois #17921
par Riphur
Réponse de Riphur sur le sujet Re:Gestion de l'affinité cpu d'un processus
Désolé du délai,
Merci pour ton aide, ca me permet bien de cibler tous les processus du même nom.
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
$CoreBak = Get-Process 3dsmax | Select-Object ProcessorAffinity
$CoreBak = $CoreBak | Select-Object -First 1
$CoreBak = $CoreBak -replace \"@{ProcessorAffinity=\"
$CoreBak = $CoreBak -replace \"}\"
[int]$CoreBak = $CoreBak.tostring()
# Valeur de l'affinité en binaire avec 8 caractères
$CoreBin = [Convert]::ToString($Corebak, 2)
$CoreN = $CoreBin | measure-object -character | select -expandproperty characters
if ($CoreN -eq 7){$CoreBin=$CoreBin.insert(0,\"0\"«»)}
if ($CoreN -eq 6){$CoreBin=$CoreBin.insert(0,\"00\"«»)}
if ($CoreN -eq 5){$CoreBin=$CoreBin.insert(0,\"000\"«»)}
if ($CoreN -eq 4){$CoreBin=$CoreBin.insert(0,\"0000\"«»)}
if ($CoreN -eq 3){$CoreBin=$CoreBin.insert(0,\"00000\"«»)}
if ($CoreN -eq 2){$CoreBin=$CoreBin.insert(0,\"000000\"«»)}
if ($CoreN -eq 1){$CoreBin=$CoreBin.insert(0,\"0000000\"«»)}
$Core00 = (0+$CoreBin[7]-48)*1
$Core01 = (0+$CoreBin[6]-48)*2
$Core10 = (0+$CoreBin[5]-48)*4
$Core11 = (0+$CoreBin[4]-48)*8
$Core20 = (0+$CoreBin[3]-48)*16
$Core21 = (0+$CoreBin[2]-48)*32
$Core30 = (0+$CoreBin[1]-48)*64
$Core31 = (0+$CoreBin[0]-48)*128
$Core00 = 0
# Valeur de la nouvelle l'affinité en decimal
$CoreNew = $Core00 + $Core01 + $Core10 + $Core11 + $Core20 + $Core21 + $Core30 + $Core31
# Appliquer l'affinité des cores
$Process = Get-Process 3dsmax ;
$Process | Foreach-Object {$_.ProcessorAffinity=$CoreNew}
# Nettoyage
Remove-Variable CoreBak
[/code:1]
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:\Powershell\powershell-8c-core0-off.ps1
@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
FOR /F %%# IN ('COPY /Z \"%~dpf0\" NUL') DO SET \"CR=%%#\"
FOR /L %%# IN (60,-1,1) DO (SET/P \"=Repos du Core0 pendant %%# secondes. !CR!\"<NUL:
PING -n 2 127.0.0.1 >NUL:«»)
Powershell.exe -executionpolicy remotesigned -File C:\Powershell\powershell-8c-core0-on.ps1
[/code:1]
Et la même chose avec les autres core du cpu.
Le tout est déclenché par rapport à la T° du CPU depuis SpeedFan<br><br>Message édité par: Riphur, à: 8/08/14 14:41
Merci pour ton aide, ca me permet bien de cibler tous les processus du même nom.
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
$CoreBak = Get-Process 3dsmax | Select-Object ProcessorAffinity
$CoreBak = $CoreBak | Select-Object -First 1
$CoreBak = $CoreBak -replace \"@{ProcessorAffinity=\"
$CoreBak = $CoreBak -replace \"}\"
[int]$CoreBak = $CoreBak.tostring()
# Valeur de l'affinité en binaire avec 8 caractères
$CoreBin = [Convert]::ToString($Corebak, 2)
$CoreN = $CoreBin | measure-object -character | select -expandproperty characters
if ($CoreN -eq 7){$CoreBin=$CoreBin.insert(0,\"0\"«»)}
if ($CoreN -eq 6){$CoreBin=$CoreBin.insert(0,\"00\"«»)}
if ($CoreN -eq 5){$CoreBin=$CoreBin.insert(0,\"000\"«»)}
if ($CoreN -eq 4){$CoreBin=$CoreBin.insert(0,\"0000\"«»)}
if ($CoreN -eq 3){$CoreBin=$CoreBin.insert(0,\"00000\"«»)}
if ($CoreN -eq 2){$CoreBin=$CoreBin.insert(0,\"000000\"«»)}
if ($CoreN -eq 1){$CoreBin=$CoreBin.insert(0,\"0000000\"«»)}
$Core00 = (0+$CoreBin[7]-48)*1
$Core01 = (0+$CoreBin[6]-48)*2
$Core10 = (0+$CoreBin[5]-48)*4
$Core11 = (0+$CoreBin[4]-48)*8
$Core20 = (0+$CoreBin[3]-48)*16
$Core21 = (0+$CoreBin[2]-48)*32
$Core30 = (0+$CoreBin[1]-48)*64
$Core31 = (0+$CoreBin[0]-48)*128
$Core00 = 0
# Valeur de la nouvelle l'affinité en decimal
$CoreNew = $Core00 + $Core01 + $Core10 + $Core11 + $Core20 + $Core21 + $Core30 + $Core31
# Appliquer l'affinité des cores
$Process = Get-Process 3dsmax ;
$Process | Foreach-Object {$_.ProcessorAffinity=$CoreNew}
# Nettoyage
Remove-Variable CoreBak
[/code:1]
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:\Powershell\powershell-8c-core0-off.ps1
@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
FOR /F %%# IN ('COPY /Z \"%~dpf0\" NUL') DO SET \"CR=%%#\"
FOR /L %%# IN (60,-1,1) DO (SET/P \"=Repos du Core0 pendant %%# secondes. !CR!\"<NUL:
PING -n 2 127.0.0.1 >NUL:«»)
Powershell.exe -executionpolicy remotesigned -File C:\Powershell\powershell-8c-core0-on.ps1
[/code:1]
Et la même chose avec les autres core du cpu.
Le tout est déclenché par rapport à la T° du CPU depuis SpeedFan<br><br>Message édité par: Riphur, à: 8/08/14 14:41
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 11 ans 7 mois #17924
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Gestion de l'affinité cpu d'un processus
Je pense que tu peux simplifier ceci :
[code:1]if ($CoreN -eq 7){$CoreBin=$CoreBin.insert(0,\"0\"«»)}[/code:1]
en
[code:1]
CoreBin = [Convert]::ToString($Corebak, 2).PadLeft(8, '0')[/code:1]
Il existe aussi l'opérateur binaire -Band :
[code:1]
if (15 -band 16) {\"ok\"} else {'Nok'}
if (16 -band 16) {\"ok\"} else {'Nok'}
[/code:1]
[code:1]if ($CoreN -eq 7){$CoreBin=$CoreBin.insert(0,\"0\"«»)}[/code:1]
en
[code:1]
CoreBin = [Convert]::ToString($Corebak, 2).PadLeft(8, '0')[/code:1]
Il existe aussi l'opérateur binaire -Band :
[code:1]
if (15 -band 16) {\"ok\"} else {'Nok'}
if (16 -band 16) {\"ok\"} else {'Nok'}
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.045 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Gestion de l'affinité cpu d'un processus