2009-08-06 10 views
3

Ich möchte den Prozentsatz der CPU-Zeit, die von einem PowerShell-Prozess verwendet wird, auf eine bestimmte Anzahl beschränken. Lassen Sie uns der Argumentation halber 13% angeben.Wie können Sie in Windows PowerShell die maximale CPU% für das Skript festlegen?

Andere Optionen, die nicht genau das sind, was ich brauche: 1) Priorität einstellen. 2) Einstellen der CPU-Affinität.

Grundsätzlich haben wir Überwachungssoftware, die sich beschwert, wenn die CPU-Auslastung insgesamt zu hoch wird. Wir haben einen täglichen Prozess, der dies ausschaltet - meist harmlos, aber zu viele falsche Positive in einem Überwachungssystem und Menschen werden zu Warnungen/Fehlern verleitet, wenn wir das nicht wünschen.

Der Prozess selbst bekommt lsass.exe sehr aufgeregt, wie es läuft, und andere Prozesse passieren auch.

Ich weiß nicht Powershell und versuche, Somebody Else Powershell zu reparieren. Offensichtlich wäre eine grundlegende Neuschreibung zu einem späteren Zeitpunkt schön, aber im Moment klingeln und lärmen Leute.

+1

Wäre es nicht "eine echte" Lösung, es mit einer niedrigeren Priorität auszuführen und dem CPU-Nutzungs-Monitor zu sagen, Prozesse mit niedriger Priorität zu ignorieren? –

+0

Ich hatte den Eindruck, dass dies eine manuelle Aufgabe ist, die Sie über den Task-Manager erledigen würden. Wenn dieses Powershell-Skript als Teil eines Jobs ausgelöst wird, ist es unrealistisch, dass jemand dort sitzt und den Task-Manager überwacht und die Affinität während der Ausführung festlegt. –

Antwort

3

Was Sie verlangen, ist nicht wirklich möglich. Der Windows-Kernel ist verantwortlich für die Planung der CPU - und das zu Recht. (Ich für meinen Teil möchte nicht zum Real-Mode-DOS zurückkehren).

Das Beste, was Sie tun können, ist ein langes Sleep() zwischen jede Zeile des Skripts einzufügen. Es gibt jedoch keine Garantie dafür, dass ein bestimmtes Powershell-Cmdlet/function/etc sich so drosselt, wie Sie es möchten. Die Windows-API-Aufrufe, die schließlich die Drecksarbeit jeder Anweisung ausführen, werden dies sicher nicht tun.

Ironischerweise berührt Raymond zu diesem Thema gerade vor ein paar Tagen: http://blogs.msdn.com/oldnewthing/archive/2009/07/27/9849503.aspx

Mein richtiger Vorschlag ist, das Skript zu ändern, so dass es wie folgt aussieht:

try { 
    Stop-CpuMonitor 

    # ...the current script contents... 
} 
finally { 
    Start-CpuMonitor 
}     
0

Während ich von keiner Weise wissen tatsächlich Beschränken Sie die Verwendung von jedem Prozess auf eine bestimmte Menge an CPU-Verbrauch prozentual, ich dachte, vielleicht könnte man die Priorität des PowerShell-Thread ändern. Also schrieb ich ein schnelles Skript und führte einen Test durch.

Das Ergebnis war, dass sowohl in "Normal" als auch in "Niedrigster" die Zeit etwa gleich war. Betrachtet man das CPU-Meter-Widget, betrug die CPU-Auslastung ungefähr 27%, aber ich lief auf einer Quad-Core-Box, das ist nicht überraschend. In beiden Fällen wurde nur eine CPU benötigt. Meine Maschine hat zu der Zeit nicht viel anderes gemacht, also waren das die anderen 2%, denke ich.

Vielleicht werden die Ergebnisse auf einer beschäftigteren Maschine variieren.

Hier ist das Skript:

function Spin 
{ 
    param($iterations) 

    for($i = 0; $i -lt $iterations; ++$i) 
    { 
     # Do nothing 
    } 
} 

$thread = [System.Threading.Thread]::CurrentThread 

Write-Host $thread.Priority 
$start = [DateTime]::Now 
Write-Host "[$start] Start" 

Spin 10000000 

$end = [DateTime]::Now 
Write-Host "[$end] End" 
$span = $end - $start 
Write-Host "Time: $span" 

$thread.Priority = "Lowest" 
Write-Host $thread.Priority 
$start = [DateTime]::Now 
Write-Host "[$start] Start" 

Spin 10000000 

$end = [DateTime]::Now 
Write-Host "[$end] End" 
$span = $end - $start 
Write-Host "Time: $span" 

$thread.Priority = "Normal" 

Und hier ist das Ergebnis:

Normal 
[08/06/2009 08:12:38] Start 
[08/06/2009 08:12:55] End 
Time: 00:00:16.7760000 
Lowest 
[08/06/2009 08:12:55] Start 
[08/06/2009 08:13:11] End 
Time: 00:00:16.8570000 

Beachten Sie, dass auch in der Dokumentation zu Thread.Priority heißt es:

Betriebssysteme nicht erforderlich Ehre die Priorität eines Threads.

1

Aus meiner Erfahrung gibt es keine Möglichkeit festzulegen, wie viel Prozent der CPU Powershell verwendet werden soll.Ich denke, die beste Vorgehensweise wäre, die Priorität von Powershell auf Niedrig zu setzen, damit andere Aufgaben/Programme zuerst ausgeführt werden können. Ich denke, der erste Beitrag hat einen anständigen Vorschlag, die Pausen zu nutzen (ich würde upvoten, aber ich bin unter den 15 Reputationspunkten, um das zu tun), und das ist etwas, was du dir ansehen solltest, aber ich glaube nicht, dass es dir geben wird die Kontrolle, die du suchst. Entschuldigung, meine Antwort ist eher ein Vorschlag als eine Lösung.

/matt

1

ich aufrichtig bezweifle, dass es eine besonders einfache Art und Weise zu erreichen ist, was Sie fordern. Wenn CPU-Probleme eine große Sache sind, würde ich ein paar Taktiken kombinieren und den Scheduler um den Rest kümmern lassen - es ist eigentlich ziemlich gut darin, die Last zu verwalten. Der Vorschlag, ThreadPriority zu verwenden, ist ein wenig problematisch, da PowerShell jeden neuen Befehl in einem neuen Thread erzeugt, den Sie umgehen können, indem Sie alles in einer einzelnen Zeile, einem Cmdlet oder einer Funktion verkapseln. Besser den gesamten Powershell-Prozess senden in dem Leerlauf:

Get-Process -name powershell | foreach { $_.PriorityClass = "Idle" } 

Hinweis: dass alle Powershell-Instanzen in dem Ruhezustand schicken, die nicht die gewünschte Wirkung sein kann. Und sicherlich hindert ein Skript nicht daran, seine eigene Priorität zu erhöhen.

Wie bereits erwähnt, kann das Überfüllen Ihres Codes mit Schlafbefehlen ein effizienter Weg sein, um sicherzustellen, dass andere Prozesse genügend CPU-Zeit haben, um ihren Code zu verarbeiten. Sogar 50-100ms sind für einen Prozessor fast eine Ewigkeit.

[System.Threading.Thread]::Sleep(50) 

Zwischen diesen beiden Taktiken Ihr Skript wird ausgeführt, wenn es verfügbar ist, und gnädig zu anderen CPU-Anforderungen beugen, wie sie entstehen.

-1

Eine Möglichkeit kann process lasso sein. Ich habe nur positive Ergebnisse über die automatische Drosselung von Prozessen erhalten, die von mir nicht ausgeschlossen wurden, wenn die CPU-Auslastung einen bestimmten Prozentsatz übersteigt.

Denken Sie daran, dass es eine ziemlich begrenzte kostenlose Version gibt, die Sie zum Testen verwenden können, wenn es für Sie funktioniert.

PS: Ich arbeite nicht für irgendjemand. Ich biete nur ein Programm an, das in der Vergangenheit für mich funktioniert hat.

Verwandte Themen