tray-park
Goto Top

PowerShell - Sehr hohe CPU Auslastung

Windows Server 2008 R2
X7550 2,0 Ghz
8GB RAM

Hi,

ich habe ein kleines Skript geschrieben, welches xml Dateien in einem Ordner rekursiv nach Inhalten durchsucht.

Ich bekomme 6 xml Dateien geliefert. Eine davon heißt "x.xml" in dieser suche ich nach einem String.

Wird der String dieser in xml Dateien gefunden, wird diese Datei in "x.ok" umbenannt und die restlichen xml Dateien in einen Unterordner verschoben.

Wird der String nicht gefunden, wird die Datei in "x.error" umbenannt und eine E-Mail an mich gesendet.

Diese Überprüfung geschieht im Minuten-Takt.

Der Aufruf erfolgt druch einen geplanten Task, welcher eine Batchdatei ruft. Die Batchdatei öffnet dann das PowerShell-Skript.

Sobald das PowerShell-Skript ausgeführt wird, erhöht sich die CPU Auslastung auf 100%, bis das Skript alles abgearbeitet hat.

Leider kann ich das Skript nicht nutzen, wenn minütlich der Rechner ca. 30 Sekunden auf 100% steht.

Gibt es eine Möglichkeit diese Auslastung zu reduzieren?

Weiß hier jemand rat?

Freue mich über jede Rückmeldung.

Liebe Grüße


Tray

Content-ID: 159897

Url: https://administrator.de/forum/powershell-sehr-hohe-cpu-auslastung-159897.html

Ausgedruckt am: 22.12.2024 um 23:12 Uhr

90776
90776 01.02.2011 um 16:58:05 Uhr
Goto Top
hallo tray-park

kannst du mal die batch und das powershell script posten?

aber so auf anhin würd ich dir raten im batch ein start /(Basispriorität) also z.b. start /low

Grüsse
Switcher
tray-park
tray-park 01.02.2011 um 17:21:31 Uhr
Goto Top
Hi,

zuerst mal die Batch
C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe E:\Check\PShell\CheckSkript.ps1

Kann ich durch die Prioritätsparameter tatsächlich die CPU Auslastung veringern?
90776
90776 01.02.2011 um 17:45:04 Uhr
Goto Top
ja, kommt es darauf an, wie lange das skript braucht?

setzt mal

start /low C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe E:\Check\PShell\CheckSkript.ps1

und überprüfe mal die auslastung

Grüsse
Switcher
tray-park
tray-park 02.02.2011 um 09:01:37 Uhr
Goto Top
Das funktioniert leider nicht.

Auslastung ist immer noch auf 100%. Ich hab das Skript die Nacht laufen lassen und heute morgen war der Server weg.

Ich poste gleich mal das Skript.
tray-park
tray-park 02.02.2011 um 09:07:57 Uhr
Goto Top
# Allgemeine Variablen
    # Hostname
        $Server = "Server1"  
    # SMTP Server IP
        $SMTPHostIP = "192.168.1.20"  
    # Absender E-Mail Adresse
        $Absender = "Server1@test.de"  
    # Empfänder E-Mail Adresse
        $Empfaenger = "ich@test.de"  
# Allgemeine Variablen

function SendOkay($Error, $Einlesen)
{
	$ConDatumFunc = get-date -uformat "%Y.%m.%d - %H:%M"  
	
		$SmtpClient = new-object system.net.mail.smtpClient
	    $MailMessage = new-Object system.net.mail.mailmessage
		#$att = new-object Net.Mail.Attachment($Einlesen)
        $SmtpClient.Host = $SMTPHostIP
        $mailmessage.from = $Absender
        $mailmessage.To.add($Empfaenger)
        $mailmessage.Subject = “$ConDatumFunc $Server Download Fehler Requester Stadt Frankfurt”
        $mailmessage.IsBodyHtml = $true
        $mailmessage.Body = ""  
		#$mailmessage.Attachments.Add($att)
        $smtpclient.Send($mailmessage)
}

cd\
d:
cd "XMLCheck\Ergebnisse\download"  

$ConErgebnissePfad 	= "k:\XMLCheck\Ergebnisse\download"  
$ConStringOK 		= '<status="ok">'  
$ConDatum = get-date -uformat %Y%m%d-%H%M

if (Test-Path $ConErgebnissePfad\*_r.xml)
{
	foreach ($Einlesen in get-ChildItem $ConErgebnissePfad -Include *"_r.xml" -Recurse)  
	{
		if ($Pruefen = get-content $Einlesen | Select-String $ConStringOK)
			{
			write-host "Funktion Okay"  
			Get-ChildItem $Einlesen | Rename-Item -NewName $ConDatum"_XML.ok"  
			}
		
		 else
			{	
			write-host "Sende Error-Message"  
			SendOkay $Error $Einlesen
			Get-ChildItem $Einlesen | Rename-Item -NewName $ConDatum"_XML.error"  
			}
	}
}
else
{	
write-host "Sende Error-Message"  
SendOkay $Error $Einlesen
}	
Move-Item -path $ConErgebnissePfad\*.xml -destination $ConErgebnissePfad\Cache\
90776
90776 02.02.2011 um 15:42:10 Uhr
Goto Top
sorry aber beim Powershell Skript kann ich dir leider nicht weiterhelfen

versuchs mal so... lass das script laufen und geh in den taskmanager, dort dann manuell die priorität auf niedrig stellen, vielleicht gehts so

Grüsse
Switcher

PS: wie ist das? leuft das PS-Skript in einer schlaufe oder wird es jedes mal neu gestartet?
tray-park
tray-park 02.02.2011 um 16:32:30 Uhr
Goto Top
Im Taskmanager die Prio zu ändern nützt nichts, da das Skript durchgängig läuft.

Dann müsste ich ja jeden Aufruf der PowerShell abfangen und verändern.
90776
90776 02.02.2011 um 20:08:18 Uhr
Goto Top
schon klar aber versuch es mal ob es überhaupt mit der priorität fubnktioniert

sonst weiss ich auch nit was du machen könntest

Grüsse
Switcher
Miyamoto
Miyamoto 06.02.2011 um 21:46:22 Uhr
Goto Top
Hi,
was wir jetzt mal machen ist den Skript, Stück für Stück testen, hier bei musst du immer die CPU-Auslastung beobachten.

  1. Ruf das Skript mal so auf (ohne Task) und lass es lauen.
  2. Lass das Skript mal auf einen Ordner los wo du zu 100% weist das keine Datei deinen gesuchten String enthält.
  3. Lass das Skript mal auf einen Ordner los wo du zu 100% weist das eine Datei deinen gesuchten String enthält.
  4. Wiederhole alle Test, aber kommentiere die Mail-Funktion mal aus.
  5. Überprüfe mal wie viele Datei er so pro Durchlauf überprüfen muss (6 Stück???), poste mal die Anzahl und wie viele Zeilen das so ca. sind pro Datei.

Wenn du fertig bist Teile uns mal das Ergebnis mit.

Gruß Miyamoto
tray-park
tray-park 10.02.2011 um 09:45:35 Uhr
Goto Top
Hi,

ich hab das mal mit 50 xml Dateien in dem Ordner versucht

1 & 2 81% Auslastung
3. 17% Auslastung
4. Wenn eine Datei den String enthällt 28% Auslastung. Wenn keine Datei den String enthällt 30%
5. Es sind 6 Dateien pro Lieferung. Wenn ich die Datei im iEx oder FF öffne sind es pro XML Datei ca 20 Zeilen. Mit Notepad++ wird alles in einer Zeile angezeigt.
Ich bekomme diese 6 Dateien minütlich geliefert und werte sie minütlich aus. Somit erhöht sich die Dateianzahl natürlich auf 24*60*6 Dateien am Ende des Tages, bis ein weiteres Skript dann alle in eine zip Datei packt.

Alles in Kombination 100% weiterhin.

Grüße
Miyamoto
Miyamoto 10.02.2011 um 10:56:00 Uhr
Goto Top
Hi,

eine weitere Frage:
Auf was für ein System läuft das Skript??
  • CPU (MHz)= ???
  • Arbeitsspeicher = ???
  • CPU Last wenn das Skript nicht lauft (Durchschnitt) = ???

Gruß Miyamoto
tray-park
tray-park 10.02.2011 um 11:46:45 Uhr
Goto Top
Hi,

Windows Server 2008 R2
X7550 2,0 Ghz
8GB RAM

Die Last im Leerlauf liegt durchschnittlich bei 2%
Miyamoto
Miyamoto 10.02.2011 um 13:08:59 Uhr
Goto Top
Hi,

Ok, der Rechner sollte das locker schaffen face-smile

Meine Vermutung ist, das es an der Mail Funktion liegt.

Gruß Miyamoto
tray-park
tray-park 10.02.2011 um 14:13:17 Uhr
Goto Top
Hi,

die wird aber gar nicht erst gerufen, wenn der String nicht gefunden wird.

Ich glaube eher, dass es am Verschieben der Dateien liegt.

Ich glaube ja nicht, dass man die PowerShell so rufen kann, dass Sie weniger CPU-Last verbraucht?
Miyamoto
Miyamoto 10.02.2011 um 20:51:35 Uhr
Goto Top
Hi,
bei dem Test den du durchgeführt hast (Test2), war der gesuchte String nicht in deinen Daten vorhanden und du hattest eine CPU von 81%.
Als du die mal Funktion auskommentiert hast, bei dem selben Test, hattest du nur eine CPU Last von 30%.

Oder habe ich was falsch verstanden????

Wenn du glaubst das es an dem Verschieben liegt, den kommentiere es doch einfach mal aus und teste es.


Gruß Miyamoto
tray-park
tray-park 19.04.2011 um 12:57:15 Uhr
Goto Top
Hi,

die hohe Auslastung wurde tatsächlich durch das Verschieben der XML Dateien verursacht.

Ich habe nun den Teil des Skripts rausgenommen der die XML Files verschiebt. Die Files werden direkt nach dem Check gelöscht.

Danke für eure Hilfe. Hat mir wie immer sehr geholfen.

Liebe Grüße

Tray