yannosch
Goto Top

Svchost auf 2k8 R1 TS saugt sich voll

Hallo zusammen,

habe folgendes Problem:

die svchost.exe saugt extrem viel RAM. Sie startet bei 500K ist aber nach 3-4 Tagen bei 5Mio KB.

Um wieder auf meine 16-17 GB Auslastung zu kommen hilf meistens nur ein Neustart. Ansonsten läuft das System gnadenlos auf 23,5 / 24 GB hoch.

Das Internetexplorer Workaround habe ich schon durchgeführt - ohne Erfolg. Virenbefall o.Ä. würde ich auch ausschließen, da die PID auf Windowsservices verweißt und mein Virenscanner auch nichts findet.

Services unter der selben PID sind folgende:

  • EventSystem
  • fdPHost
  • FontCache
  • netprofm
  • nsi
  • W32Time
  • WinHttpAutoProxySvc

Hätte jemand eine Idee was zu tun ist um den Fehler zu finden, bzw. hatte selbst schon mal ein ähnliches Problem?
Eventlogt sagen im Übrigen auch nichts verdächtiges - nur ein paar Errors die durch BackupExec auftreten - ist aber schon länger so.

Content-ID: 341072

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

Ausgedruckt am: 23.11.2024 um 13:11 Uhr

em-pie
Lösung em-pie 20.06.2017 um 09:52:53 Uhr
Goto Top
Moin,

ich meine mich entsinnen zu können, dass es mal hieß, aus Performancegründen einen TS einmal täglich automatisiert zu rebooten.
Ich weiß aber gerade nicht, ob das eine MS- oder Citrix-Empfehlung gewesen ist.

Spricht etwas gegen das Durchführen einer nächtlichen Reboots?

Wir machen es jedenfalls.

Unser Server werden des Nachts einmal alles neu gestartet (zeitversetzt)

Gruß
em-pie
Yannosch
Yannosch 20.06.2017 um 09:54:17 Uhr
Goto Top
Klingt schonmal nach einer extrem guten Idee!
Hast dus mit nem script gelöst oder wie mache ich es am besten?

Würde mich nur interessieren wie die pralle svchost zustandekommt ...

liebe Grüße
Yannosch
em-pie
em-pie 20.06.2017 aktualisiert um 10:01:28 Uhr
Goto Top
gibt ja viele Wege...
Citrix (XenApp 6.5) brinmgt da Features mit. Dort kann man Einstellen "starte um 03:00Uhr +- 60 Minuten" und alle TS', die in dieser Gruppe sind, starten dann nach einen Zufallsprinzip irgendwas zwischen 02 und 04 Uhr neu.

Das nutze ich aber nicht; hatte damals nicht sooo sauber funktioniert und hatte keine Zeit, daran rumzuforschen face-confused

Aktuell/ seit Jahren habe ich einfach eine batch via Taskplaner am Laufen:
 shutdown -r -f -t 60

das auf allen 5 TS und (manuell) im Taskplaner hinterlegt.
TS1 rebootet um 01 Uhr
TS2 rebootet um 02 Uhr
...
TS5 rebootet um 05 Uhr

User, die dann noch angemeldet sind, werden schlimmstenfalls nicht sauber abgemeldet. Hatte aber in 6 Jahren nur 2x ein Problem damit...

€dit:
man könnte sicherlich noch das Script erweitern, welches zuvor die angemeldeten User ermittelt und dann abmeldet, bevor der reboot läuft. Alles aber eine Kosten/ Nutzen (und ggf. Beqemlichkeits-) Geschichte face-wink
beidermachtvongreyscull
beidermachtvongreyscull 20.06.2017 aktualisiert um 10:01:52 Uhr
Goto Top
'------ Excel Prozess beenden ------  
'prg = "Excel.exe"  
'set wmi = getobject("winmgmts:")  
'sQuery = "select * from win32_process " &_  
'  "where name='" & prg & "'"  
'set processes = wmi.execquery(sQuery)  
'for each process in processes  
'  process.terminate  
'next  
'-----------------------------------  

strComputer = "." 'Dieser Computer  
maxUptime = 240     'max Laufzeit des Computers seit letztem Neustart in Stunden!! Bei erreichen dieses Wertes erfolgt Neustart   

'~ Abrufen der letzten Boot-Time aus WMI  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")  
For Each objOS in colOperatingSystems
    dtmBootup = objOS.LastBootUpTime 'Originalwert LASTBOOTUPTIME aus WMI  
    dtmLastBootupTime = WMIDateStringToDate(dtmBootup) 'Aufruf der Funktion WMIDateStringtoDate; konvertiert in echtes Datum  
    dtmSystemUptime = DateDiff("h", dtmLastBootUpTime, Now) 'DateDiff "h" liefert Zeitunterschied in Stunden zwischen HEUTE und LASTBOOTUPTIME  
'~ Überprüfung: Laufzeit des Computers größer als eingestellte max. Zeit?  
    If dtmSystemUptime > maxUptime Then
            Set objWMIService2 = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}!\\" & _       
			    strComputer & "\root\cimv2")                                                                'JA: Dann verbinden mit WMI  
            Set colOS2 = objWMIService2.ExecQuery("Select * from Win32_OperatingSystem")                      'Objekt setzen auf laufende OS_Instanzen  
            For Each objOS2 in colOS2                                                                         'Für alle laufenden (gefundenen) Instanzen:  
	            objOS2.Reboot()                                                                              'Methode Reboot ausführen.  
            Next
        else
            '~ Wscript.Echo dtmSystemUptime  
            '~WScript.Echo "Kein Neustart erforderlich"  
            '~Wscript.Echo dtmSystemUptime  
            '~WScript.Echo maxUptime  
    End If   
Next

'~ Funktion Umwandlung des Datumstrings aus WMI in ein lesbares formatiertes Datum.  
Function WMIDateStringToDate(dtmBootup)
    WMIDateStringToDate = CDate(Mid(dtmBootup, 5, 2) & "/" & _  
        Mid(dtmBootup, 7, 2) & "/" & Left(dtmBootup, 4) _  
            & " " & Mid (dtmBootup, 9, 2) & ":" & _  
                Mid(dtmBootup, 11, 2) & ":" & Mid(dtmBootup,13, 2))  
End Function



'~ set objWMIDateTime = CreateObject("WbemScripting.SWbemDateTime")  
'~ set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
'~ set colOS = objWMI.InstancesOf("Win32_OperatingSystem")  
'~ for each objOS in colOS  
	'~ objWMIDateTime.Value = objOS.LastBootUpTime  
	'~ Wscript.Echo "Last Boot Up Time: " & objWMIDateTime.GetVarDate & vbcrlf & _  
		'~ "System Up Time: " &  TimeSpan(objWMIDateTime.GetVarDate,Now) & _  
		'~ " (hh:mm:ss)"  
'~ next  

'~ Function TimeSpan(dt1, dt2)   
	'~ ' Function to display the difference between  
	'~ ' 2 dates in hh:mm:ss format  
	'~ If (isDate(dt1) And IsDate(dt2)) = false Then   
		'~ TimeSpan = "00:00:00"   
		'~ Exit Function   
        '~ End If   
 
        '~ seconds = Abs(DateDiff("S", dt1, dt2))   
        '~ minutes = seconds \ 60   
        '~ hours = minutes \ 60   
        '~ minutes = minutes mod 60   
        '~ seconds = seconds mod 60   
 
        '~ if len(hours) = 1 then hours = "0" & hours   
 
        '~ TimeSpan = hours & ":" & _   
            '~ RIGHT("00" & minutes, 2) & ":" & _   
            '~ RIGHT("00" & seconds, 2)   
'~ End Function   

Falls Du in VBScript etwas haben wolltest.

Zu Deiner anderen Frage:
Wenn ein Windowsdienst sich aufbläht oder am liebsten alle CPU-zeit auffressen will, dann hast Du Kapazitätsdruck in RAM und/oder Rechenleistung. Da staut sich manches an.
Yannosch
Yannosch 20.06.2017 um 10:03:27 Uhr
Goto Top
Okay chillig.

Sind Server ohne Xen.
Reine Bare Metal installation.

Probiere mal das mit dem Sript im Taskplaner.
Sind hier insgestamm eh nur 15 Mitarbeiter auf dem TS
Yannosch
Yannosch 20.06.2017 um 10:29:22 Uhr
Goto Top
Zitat von @beidermachtvongreyscull:

> '------ Excel Prozess beenden ------  
> 'prg = "Excel.exe"  
> 'set wmi = getobject("winmgmts:")  
> 'sQuery = "select * from win32_process " &_  
> '  "where name='" & prg & "'"  
> 'set processes = wmi.execquery(sQuery)  
> 'for each process in processes  
> '  process.terminate  
> 'next  
> '-----------------------------------  
> 
> strComputer = "." 'Dieser Computer  
> maxUptime = 240     'max Laufzeit des Computers seit letztem Neustart in Stunden!! Bei erreichen dieses Wertes erfolgt Neustart   
> 
> '~ Abrufen der letzten Boot-Time aus WMI  
> Set objWMIService = GetObject("winmgmts:" _  
>     & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
> Set colOperatingSystems = objWMIService.ExecQuery _
>     ("Select * from Win32_OperatingSystem")  
> For Each objOS in colOperatingSystems
>     dtmBootup = objOS.LastBootUpTime 'Originalwert LASTBOOTUPTIME aus WMI  
>     dtmLastBootupTime = WMIDateStringToDate(dtmBootup) 'Aufruf der Funktion WMIDateStringtoDate; konvertiert in echtes Datum  
>     dtmSystemUptime = DateDiff("h", dtmLastBootUpTime, Now) 'DateDiff "h" liefert Zeitunterschied in Stunden zwischen HEUTE und LASTBOOTUPTIME  
> '~ Überprüfung: Laufzeit des Computers größer als eingestellte max. Zeit?  
>     If dtmSystemUptime > maxUptime Then
>             Set objWMIService2 = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}!\\" & _       
> 			    strComputer & "\root\cimv2")                                                                'JA: Dann verbinden mit WMI  
>             Set colOS2 = objWMIService2.ExecQuery("Select * from Win32_OperatingSystem")                      'Objekt setzen auf laufende OS_Instanzen  
>             For Each objOS2 in colOS2                                                                         'Für alle laufenden (gefundenen) Instanzen:  
> 	            objOS2.Reboot()                                                                              'Methode Reboot ausführen.  
>             Next
>         else
>             '~ Wscript.Echo dtmSystemUptime  
>             '~WScript.Echo "Kein Neustart erforderlich"  
>             '~Wscript.Echo dtmSystemUptime  
>             '~WScript.Echo maxUptime  
>     End If   
> Next
> 
> '~ Funktion Umwandlung des Datumstrings aus WMI in ein lesbares formatiertes Datum.  
> Function WMIDateStringToDate(dtmBootup)
>     WMIDateStringToDate = CDate(Mid(dtmBootup, 5, 2) & "/" & _  
>         Mid(dtmBootup, 7, 2) & "/" & Left(dtmBootup, 4) _  
>             & " " & Mid (dtmBootup, 9, 2) & ":" & _  
>                 Mid(dtmBootup, 11, 2) & ":" & Mid(dtmBootup,13, 2))  
> End Function
> 
> 
> 
> '~ set objWMIDateTime = CreateObject("WbemScripting.SWbemDateTime")  
> '~ set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
> '~ set colOS = objWMI.InstancesOf("Win32_OperatingSystem")  
> '~ for each objOS in colOS  
> 	'~ objWMIDateTime.Value = objOS.LastBootUpTime  
> 	'~ Wscript.Echo "Last Boot Up Time: " & objWMIDateTime.GetVarDate & vbcrlf & _  
> 		'~ "System Up Time: " &  TimeSpan(objWMIDateTime.GetVarDate,Now) & _  
> 		'~ " (hh:mm:ss)"  
> '~ next  
> 
> '~ Function TimeSpan(dt1, dt2)   
> 	'~ ' Function to display the difference between  
> 	'~ ' 2 dates in hh:mm:ss format  
> 	'~ If (isDate(dt1) And IsDate(dt2)) = false Then   
> 		'~ TimeSpan = "00:00:00"   
> 		'~ Exit Function   
>         '~ End If   
>  
>         '~ seconds = Abs(DateDiff("S", dt1, dt2))   
>         '~ minutes = seconds \ 60   
>         '~ hours = minutes \ 60   
>         '~ minutes = minutes mod 60   
>         '~ seconds = seconds mod 60   
>  
>         '~ if len(hours) = 1 then hours = "0" & hours   
>  
>         '~ TimeSpan = hours & ":" & _   
>             '~ RIGHT("00" & minutes, 2) & ":" & _   
>             '~ RIGHT("00" & seconds, 2)   
> '~ End Function   
> 

Falls Du in VBScript etwas haben wolltest.

Danke für die Mühe - aber ich machs lieber in Batch dann face-big-smile


Zu Deiner anderen Frage:
Wenn ein Windowsdienst sich aufbläht oder am liebsten alle CPU-zeit auffressen will, dann hast Du Kapazitätsdruck in RAM und/oder Rechenleistung. Da staut sich manches an.

CPU schreit so laut es geht "LANGWEILIG" während der Arbeitspeicher 4 Tage auch 50 % ruht und dann über 1-2 Tage auf 99% hochfliegt. Und dass nur wegen der svchost. Ich lass den Server jetzt einfach täglich neu starten. Mal schauen was passiert.

LG Yannosch
beidermachtvongreyscull
beidermachtvongreyscull 20.06.2017 um 10:54:46 Uhr
Goto Top
Zitat von @Yannosch:

Danke für die Mühe - aber ich machs lieber in Batch dann face-big-smile

Gerngeschehen. War keine. Ich habe nur in meiner KB gekramt. Dieses Script stellt bei mir sicher, dass egal wann der Taskplaner beliebt es zu starten, eine gewisse Zeit zwischen jetzt und dem letzten Neustart vertsrichen sein muss.

Ich hatte es schon öfters, dass der TP mal hängen blieb und Scripte dann hinterher geschossen hat. face-big-smile
Aus Fehlern lernt man.

CPU schreit so laut es geht "LANGWEILIG" während der Arbeitspeicher 4 Tage auch 50 % ruht und dann über 1-2 Tage auf 99% hochfliegt. Und dass nur wegen der svchost. Ich lass den Server jetzt einfach täglich neu starten. Mal schauen was passiert.

Ja mach mal. Ich würde vielleicht auch noch in ruhigen Stunden ein "sfc /scannow" empfehlen.
Vielleicht liegt es an verbosselten Systemdateien. Oder aber Windows ist eben nicht Linux!. face-smile
Yannosch
Yannosch 23.06.2017 um 10:09:31 Uhr
Goto Top
@beidermachtvongreyscull : Läuft dieses Script zuverlässig auf einem TS bei dir?

Würde das Script dann gerne einmal testen...

Lässt du das Script dann trotzdem über den Task-Planer starten?

Gut zu wissen wäre dann noch dass auf meinem TS - Server unser ERP + Backup Exec läuft - sollte ja keine Schwierigkeiten geben dann denke ich.

liebe Grüße & schonmal ein schönes Wochenende face-smile

Gruß
Yannosch
beidermachtvongreyscull
beidermachtvongreyscull 23.06.2017 um 11:57:41 Uhr
Goto Top
Zitat von @Yannosch:

@beidermachtvongreyscull : Läuft dieses Script zuverlässig auf einem TS bei dir?

Ich hatte bisher keinerlei Probleme feststellen können. Es läuft bei mir im Kontext NT-System.
VBS ist zwar schon ein Opi aber es liegt mir einfach mehr als Powershell. Die ist nicht mein Ding.

Würde das Script dann gerne einmal testen...

Lässt du das Script dann trotzdem über den Task-Planer starten?
Irgendetwas muss es ja triggern.

Gut zu wissen wäre dann noch dass auf meinem TS - Server unser ERP + Backup Exec läuft - sollte ja keine Schwierigkeiten geben dann denke ich.

Der Shutdown geht ja vom Kernel aus. Die Dienste werden normalerweise benachrichtigt.
Aber es ließen sich auch entsprechende Abschnitte im Code einfügen, so dass entsprechende Dienste vorher herunterfahren.

Ich wüsste jetzt nur nicht, ob es eine Möglichkeit gibt, von außen festzustellen ob BackupExec Jobs gerade laufen oder in Wartestellung sind.
Obwohl...
BackupExec erlaubt das Ausführen eines Scripts zu Beginn eines Jobs und am Ende.
Wenn Du nen Einzeiler definierst, der als Startscript eine bestimmte Datei irgendwo anlegt und als Endscript diese Datei wieder entfernt, brauchst Du nur den Code um eine "Datei existiert"-Prüfung zu erweitern und das wäre es.

Viele Grüße,

bdmvg



liebe Grüße & schonmal ein schönes Wochenende face-smile

Gruß
Yannosch
Yannosch
Yannosch 27.06.2017 um 13:08:36 Uhr
Goto Top
Zitat von @beidermachtvongreyscull:

> '------ Excel Prozess beenden ------  
> 'prg = "Excel.exe"  
> 'set wmi = getobject("winmgmts:")  
> 'sQuery = "select * from win32_process " &_  
> '  "where name='" & prg & "'"  
> 'set processes = wmi.execquery(sQuery)  
> 'for each process in processes  
> '  process.terminate  
> 'next  
> '-----------------------------------  
> 
> strComputer = "." 'Dieser Computer  
> maxUptime = 240     'max Laufzeit des Computers seit letztem Neustart in Stunden!! Bei erreichen dieses Wertes erfolgt Neustart   
> 
> '~ Abrufen der letzten Boot-Time aus WMI  
> Set objWMIService = GetObject("winmgmts:" _  
>     & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
> Set colOperatingSystems = objWMIService.ExecQuery _
>     ("Select * from Win32_OperatingSystem")  
> For Each objOS in colOperatingSystems
>     dtmBootup = objOS.LastBootUpTime 'Originalwert LASTBOOTUPTIME aus WMI  
>     dtmLastBootupTime = WMIDateStringToDate(dtmBootup) 'Aufruf der Funktion WMIDateStringtoDate; konvertiert in echtes Datum  
>     dtmSystemUptime = DateDiff("h", dtmLastBootUpTime, Now) 'DateDiff "h" liefert Zeitunterschied in Stunden zwischen HEUTE und LASTBOOTUPTIME  
> '~ Überprüfung: Laufzeit des Computers größer als eingestellte max. Zeit?  
>     If dtmSystemUptime > maxUptime Then
>             Set objWMIService2 = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}!\\" & _       
> 			    strComputer & "\root\cimv2")                                                                'JA: Dann verbinden mit WMI  
>             Set colOS2 = objWMIService2.ExecQuery("Select * from Win32_OperatingSystem")                      'Objekt setzen auf laufende OS_Instanzen  
>             For Each objOS2 in colOS2                                                                         'Für alle laufenden (gefundenen) Instanzen:  
> 	            objOS2.Reboot()                                                                              'Methode Reboot ausführen.  
>             Next
>         else
>             '~ Wscript.Echo dtmSystemUptime  
>             '~WScript.Echo "Kein Neustart erforderlich"  
>             '~Wscript.Echo dtmSystemUptime  
>             '~WScript.Echo maxUptime  
>     End If   
> Next
> 
> '~ Funktion Umwandlung des Datumstrings aus WMI in ein lesbares formatiertes Datum.  
> Function WMIDateStringToDate(dtmBootup)
>     WMIDateStringToDate = CDate(Mid(dtmBootup, 5, 2) & "/" & _  
>         Mid(dtmBootup, 7, 2) & "/" & Left(dtmBootup, 4) _  
>             & " " & Mid (dtmBootup, 9, 2) & ":" & _  
>                 Mid(dtmBootup, 11, 2) & ":" & Mid(dtmBootup,13, 2))  
> End Function
> 
> 
> 
> '~ set objWMIDateTime = CreateObject("WbemScripting.SWbemDateTime")  
> '~ set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
> '~ set colOS = objWMI.InstancesOf("Win32_OperatingSystem")  
> '~ for each objOS in colOS  
> 	'~ objWMIDateTime.Value = objOS.LastBootUpTime  
> 	'~ Wscript.Echo "Last Boot Up Time: " & objWMIDateTime.GetVarDate & vbcrlf & _  
> 		'~ "System Up Time: " &  TimeSpan(objWMIDateTime.GetVarDate,Now) & _  
> 		'~ " (hh:mm:ss)"  
> '~ next  
> 
> '~ Function TimeSpan(dt1, dt2)   
> 	'~ ' Function to display the difference between  
> 	'~ ' 2 dates in hh:mm:ss format  
> 	'~ If (isDate(dt1) And IsDate(dt2)) = false Then   
> 		'~ TimeSpan = "00:00:00"   
> 		'~ Exit Function   
>         '~ End If   
>  
>         '~ seconds = Abs(DateDiff("S", dt1, dt2))   
>         '~ minutes = seconds \ 60   
>         '~ hours = minutes \ 60   
>         '~ minutes = minutes mod 60   
>         '~ seconds = seconds mod 60   
>  
>         '~ if len(hours) = 1 then hours = "0" & hours   
>  
>         '~ TimeSpan = hours & ":" & _   
>             '~ RIGHT("00" & minutes, 2) & ":" & _   
>             '~ RIGHT("00" & seconds, 2)   
> '~ End Function   
> 

Falls Du in VBScript etwas haben wolltest.

Zu Deiner anderen Frage:
Wenn ein Windowsdienst sich aufbläht oder am liebsten alle CPU-zeit auffressen will, dann hast Du Kapazitätsdruck in RAM und/oder Rechenleistung. Da staut sich manches an.

Ist die Variable wirklich die Zeit in Stunden?? weil die steht bei deinem Sript ja auf 240 .... nicht auf 24 ....

LG Yannosch
beidermachtvongreyscull
beidermachtvongreyscull 27.06.2017 um 14:07:32 Uhr
Goto Top
Ja.
Alle 10 Tage einen Neustart.
Ich empfand das bisher immer als ausreichend.