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-Key: 159897

Url: https://administrator.de/contentid/159897

Printed on: April 16, 2024 at 19:04 o'clock

Mitglied: 90776
90776 Feb 01, 2011 at 15:58:05 (UTC)
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
Member: tray-park
tray-park Feb 01, 2011 at 16:21:31 (UTC)
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?
Mitglied: 90776
90776 Feb 01, 2011 at 16:45:04 (UTC)
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
Member: tray-park
tray-park Feb 02, 2011 at 08:01:37 (UTC)
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.
Member: tray-park
tray-park Feb 02, 2011 at 08:07:57 (UTC)
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\
Mitglied: 90776
90776 Feb 02, 2011 at 14:42:10 (UTC)
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?
Member: tray-park
tray-park Feb 02, 2011 at 15:32:30 (UTC)
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.
Mitglied: 90776
90776 Feb 02, 2011 at 19:08:18 (UTC)
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
Member: Miyamoto
Miyamoto Feb 06, 2011 at 20:46:22 (UTC)
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
Member: tray-park
tray-park Feb 10, 2011 at 08:45:35 (UTC)
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
Member: Miyamoto
Miyamoto Feb 10, 2011 at 09:56:00 (UTC)
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
Member: tray-park
tray-park Feb 10, 2011 at 10:46:45 (UTC)
Goto Top
Hi,

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

Die Last im Leerlauf liegt durchschnittlich bei 2%
Member: Miyamoto
Miyamoto Feb 10, 2011 at 12:08:59 (UTC)
Goto Top
Hi,

Ok, der Rechner sollte das locker schaffen face-smile

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

Gruß Miyamoto
Member: tray-park
tray-park Feb 10, 2011 at 13:13:17 (UTC)
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?
Member: Miyamoto
Miyamoto Feb 10, 2011 at 19:51:35 (UTC)
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
Member: tray-park
tray-park Apr 19, 2011 at 10:57:15 (UTC)
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