Batch CPU Zuordnung für mehrere Prozesse mit gleichem Namen

Win69

Cadet 4th Year
Registriert
Okt. 2004
Beiträge
96
Guten Tag zusammen

Da ich nicht so viele Programmier-Kenntnisse habe, hoffe ich das mir hier jemand helfen kann.

Es sind oftmals viele Prozesse mit gleichem Namen im Task-Manager am laufen (explorer.exe). Möchte ich allen diesen gleichnamigen Prozessen zb. die CPU 2+3 zuweisen, so werden nicht alle abgeändert, sondern nur beim ersten Prozess (zuoberst im Task-Manager) die CPU-Zuordnung verändert.

Prozesse.jpg


Muster Batch/Code
-------------------------------------------------
C:\Windows\System32\process.exe

process -a explorer.exe 00000110
--------------------------------------------------

Kann per Batchdatei bei mehreren gleichnamigen Prozessen (explorer.exe) die CPU- Kerne Zuordnung für Alle verändert werden und falls wie?

Vielen herzlichen Dank im voraus.
 
Zuletzt bearbeitet:
Einfach als setpriority.cmd irgendwo in %PATH% ablegen.
Code:
@echo off
setlocal

rem https://superuser.com/questions/620724/changing-windows-process-priority-via-command-line

set app=%~1
set priority=%~2

if "[%app%]" == "[]" (
  goto :help
) else (
  if [%priority%] == [] (
    goto :help
  ) else (
    goto :main
  )
)

:help

echo "Usage: setpriority.cmd <Image name> <Priority = [idle (--)|below normal (-)|normal (0)|above normal (+)|high priority (++)|realtime (!)]>"

goto :exit

:main

if [%priority%] == [--] (
  set priority=idle
) else if [%priority%] == [-] (
  set priority=below normal
) else if [%priority%] == [0] (
  set priority=normal
) else if [%priority%] == [+] (
  set priority=above normal
) else if [%priority%] == [++] (
  set priority=high priority
) else if [%priority%] == [!] (
  set priority=realtime
)

wmic process where name="%app%" call setpriority "%priority%"

:exit
 
  • Gefällt mir
Reaktionen: Hayda Ministral
Danke für die Antwort.

Gemeint sind aber die Zuordnung der CPU Kerne und nicht der Priorität. Ist das möglich und wie?
 
Whoops... Machen wir nen Sammler auf bzgl. CPU-Scripts? :D

In %PATH% als Set-Affinity.ps1 o.ä. ablegen.
Code:
param(
  [Parameter(
    Mandatory = $true,
    Position = 1
  )]
  [string]$Name,
  [Parameter(
    Position = 2
  )]
  [int[]]$Affinity
)
process
{
  if( -not $PSBoundParameters.ContainsKey( "Affinity" ) )
  {
    $maxCores = (Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors
    $Affinity = 1..$maxCores
  }
  
  $intAffinity = [int64]0
  $Affinity | % {
    $intAffinity += [int64][Math]::Pow( 2, $_ - 1 )
  }
  Get-Process -Name $Name | % {
    $cores = [string]::Join( ",", $Affinity )
    Write-Host "Affinity of process '$($_.Name)' (#$($_.Id)) set to $intAffinity (CPUs $cores)"
    $_.ProcessorAffinity = $intAffinity
  }
}
Aufruf dann einfach mit der PowerShell über Set-Affinity.ps1 explorer 0,1 wenn der Explorer die ersten beiden CPUs nutzen soll oder Set-Affinity.ps1 explorer (1..8) für die ersten acht Kerne. Wenn $Affinity nicht übergeben wird, werden automatisch alle Kerne zugewiesen.
Code:
$ Set-Affinity.ps1 battle.net
Affinity of process 'Battle.net' (#12704) set to 16777215 (CPUs 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)
Affinity of process 'Battle.net' (#16252) set to 16777215 (CPUs 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)
Affinity of process 'Battle.net' (#16936) set to 16777215 (CPUs 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)
Affinity of process 'Battle.net' (#16960) set to 16777215 (CPUs 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)

$ Set-Affinity.ps1 battle.net 1,2,3,4
Affinity of process 'Battle.net' (#12704) set to 15 (CPUs 1,2,3,4)
Affinity of process 'Battle.net' (#16252) set to 15 (CPUs 1,2,3,4)
Affinity of process 'Battle.net' (#16936) set to 15 (CPUs 1,2,3,4)
Affinity of process 'Battle.net' (#16960) set to 15 (CPUs 1,2,3,4)

$ Set-Affinity.ps1 battle.net (1..8)
Affinity of process 'Battle.net' (#12704) set to 255 (CPUs 1,2,3,4,5,6,7,8)
Affinity of process 'Battle.net' (#16252) set to 255 (CPUs 1,2,3,4,5,6,7,8)
Affinity of process 'Battle.net' (#16936) set to 255 (CPUs 1,2,3,4,5,6,7,8)
Affinity of process 'Battle.net' (#16960) set to 255 (CPUs 1,2,3,4,5,6,7,8)

$ Set-Affinity.ps1 battle.net (9..12)
Affinity of process 'Battle.net' (#12704) set to 3840 (CPUs 9,10,11,12)
Affinity of process 'Battle.net' (#16252) set to 3840 (CPUs 9,10,11,12)
Affinity of process 'Battle.net' (#16936) set to 3840 (CPUs 9,10,11,12)
Affinity of process 'Battle.net' (#16960) set to 3840 (CPUs 9,10,11,12)
 
  • Gefällt mir
Reaktionen: Scientist
@Yuuri ... Vielen Dank für die Antwort.

Werde es in den nächsten Tagen versuchen. Schön wäre es wenn es ein komplett fertiges Script wäre für den Explorer.
 
Darf man fragen, was das manuelle Zuweisen bringt?
 
Win69 schrieb:
Schön wäre es wenn es ein komplett fertiges Script wäre für den Explorer.
Wie willst du das in den Explorer integrieren? Du könntest es höchstens in den Task Manager integrieren, aber da gibts keine Integrationsmöglichkeit. Wenn du Anwendungen damit starten willst, gibts das bereits mit start /AFFINITY.
 
@Yuuri
Was genau mache ich falsch? Ich kopiere das Script, setze es in ein Textfile und benenne das Textfile dann als "Muster.ps1". Führe ich es dann per Rechtsklick mit Powershell aus, kommt folgende Abfrage:
1620296990387.png
 
nerdalicious schrieb:
Darf man fragen, was das manuelle Zuweisen bringt?
Ich möchte die Frage einfach nochmal rausholen.

Ohne weiteren Kontext lehn ich mich ansonsten (nicht weit) aus dem Fenster und behaupte, entweder ist die Anforderung Unsinn, oder die angedachte Lösung paßt nicht zum Problem (cf. XY-Problem).

"Verschiedene NUMA-Knoten konsolidieren" laß ich bspw gerne gelten, aber.... wer von uns hier ist bisher jemals in die Verlegenheit gekommen, privat verschiedene NUMA-Knoten verwalten zu müssen?
 
  • Gefällt mir
Reaktionen: areiland
Zurück
Oben