Tool hängt sich auf - aber wo?

  • Hallo Zusammen,

    ich hoffe ihr habt eine Idee/Lösung.

    Situtation:
    Wir haben 14 Server, die 24/7 das ganze Jahr über laufen. (Außer beim Patchen)
    Da auf diesen Servern mal mehr mal weniger gerechnet wird, wollen wir die Informationen im 2 min takt loggen.
    Die Informationen wie CPU Usage, RAM Usage, CPU % Usage und angemeldete Sessions werden dann in eine Oracle Datenbank geschrieben (besser für spätere Auswertungen).

    Problem:
    Das ganze hab ich auf 3 Servern gleichzeitig ausgeführt und funktioniert auch eine Zeitlang.
    Irgendwann hängt es sich aber z.B. bei einem Server auf und es wird nichts mehr eingetragen.

    An was könnte es liegen? Wie könnte ich es ändern?
    Allgemein: was würdet ihr am Quelltext verbessern?

    Hier zu sehen(Server 9 loggt plötzlich nicht mehr. Eine Stunde später Server 8 auch nicht mehr):
    [Blockierte Grafik: http://i60.tinypic.com/2z5t6kj.jpg]

    Funktion des Tools:
    Am Anfang wird erstmal festgestellt um welchen Server es sich handelt:

    Spoiler anzeigen
    [autoit]

    Select
    Case @ComputerName = "compute02"
    $server_ID = 1
    Case @ComputerName = "compute03"
    $server_ID = 2
    Case @ComputerName = "compute04"
    $server_ID = 3
    Case @ComputerName = "compute05"
    $server_ID = 4
    Case @ComputerName = "compute06"
    $server_ID = 5
    Case @ComputerName = "compute07"
    $server_ID = 6
    Case @ComputerName = "compute08"
    $server_ID = 7
    Case @ComputerName = "compute09"
    $server_ID = 8
    Case @ComputerName = "compute10"
    $server_ID = 9
    Case @ComputerName = "compute11"
    $server_ID = 10
    Case @ComputerName = "compute12"
    $server_ID = 11
    Case @ComputerName = "compute13"
    $server_ID = 12
    Case @ComputerName = "compute14"
    $server_ID = 13
    Case @ComputerName = "COMPUTE20"
    $server_ID = 14
    EndSelect

    [/autoit]


    Dann lass ich eine Schleife 2 Minuten lang die CPU Werte in Array schreiben um später nen Durchschnitts CPU Usage Wert ausrechnen zu können.
    Dabei arbeite ich mit einem Timer, der die Schleife so lange durchlaufen lässt wie angegeben:

    Spoiler anzeigen
    [autoit]

    $timestamp = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    While TimerDiff($timestamp) <= 120000
    Call("CPUusage")
    Sleep(20)
    WEnd

    [/autoit]


    könnte es sein, dass sich beim abbrechen der Funktion sich das ganze schon aufhängt?

    Nach den 2 Minuten Timer werden dann die restlichen Funktionen nacheinander ausgeführt und in die Datenbank eingepflegt.
    Eventuell liegt der Fehler auch beim Eintragen in die Datenbank.

    Hier der komplette Quelltext:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $array[10]
    Global $meancounter = 0
    Global $callcounter
    Global $backWertcpu
    Global $backWertram
    Global $aGesamt
    Global $aAnzahl
    Global $server_ID
    Dim $oMyError

    [/autoit] [autoit][/autoit] [autoit]

    Select
    Case @ComputerName = "compute02"
    $server_ID = 1
    Case @ComputerName = "compute03"
    $server_ID = 2
    Case @ComputerName = "compute04"
    $server_ID = 3
    Case @ComputerName = "compute05"
    $server_ID = 4
    Case @ComputerName = "compute06"
    $server_ID = 5
    Case @ComputerName = "compute07"
    $server_ID = 6
    Case @ComputerName = "compute08"
    $server_ID = 7
    Case @ComputerName = "compute09"
    $server_ID = 8
    Case @ComputerName = "compute10"
    $server_ID = 9
    Case @ComputerName = "compute11"
    $server_ID = 10
    Case @ComputerName = "compute12"
    $server_ID = 11
    Case @ComputerName = "compute13"
    $server_ID = 12
    Case @ComputerName = "compute14"
    $server_ID = 13
    Case @ComputerName = "COMPUTE20"
    $server_ID = 14
    EndSelect

    [/autoit] [autoit][/autoit] [autoit]

    While 1 ;Server muss immer darauf warten, deshalb endlosschleife.

    [/autoit] [autoit][/autoit] [autoit]

    $timestamp = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    While TimerDiff($timestamp) <= 120000
    Call("CPUusage")
    Sleep(20)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _RAM() ;RAM auslesen
    _CPU() ;CPU berechnung starten und Werte versenden
    sessions()

    [/autoit] [autoit][/autoit] [autoit]

    $ado = ObjCreate("ADODB.Connection")

    [/autoit] [autoit][/autoit] [autoit]

    With $ado
    .ConnectionString = ("Provider='OraOLEDB.Oracle';Data Source='xxxxx';User Id='xxxx';Password='xxxxx';")
    .Open
    EndWith

    [/autoit] [autoit][/autoit] [autoit]

    $adors = ObjCreate("ADODB.RecordSet")

    [/autoit] [autoit][/autoit] [autoit]

    With $adors
    .ActiveConnection = $ado
    .Source = "INSERT INTO LOGS(DATUM, UHRZEIT, RAM_PROZENT, RAM_GB, CPU, USER_SESSIONS, SERVER_ID) VALUES('" & @YEAR & "." & @MON & "." & @MDAY & "','" & @HOUR & ":" & @MIN & ":" & @SEC & "'," & $aGesamt & "," & $backWertram & "," & $backWertcpu & "," & $aAnzahl & "," & $server_ID&")"
    .open
    EndWith

    [/autoit] [autoit][/autoit] [autoit]

    $adors.close
    $ado.close

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _RAM
    ; Description ...: liest die RAM Usage aus, rechnet die RAM Usage in Prozent und versendent die Werte per TCP zurück an den Absender
    ; Syntax ........: _RAM()
    ; Return values .: None
    ; Author ........: Marcel Dias Andrade
    ; ===============================================================================================================================
    Func _RAM() ;RAM auslesung
    Local $aMem = MemGetStats()

    [/autoit] [autoit][/autoit] [autoit]

    Local $aMemTot = $aMem[1] - $aMem[2] ;$aMem[1] = Gesamter physikalischer RAM, $aMem[2] = Verfügbarer physikalischer RAM, $aMemTot = RAM Usage

    [/autoit] [autoit][/autoit] [autoit]

    $aGesamt = Round(($aMemTot / $aMem[1] * 100)) ;Prozentwert berechnung

    [/autoit] [autoit][/autoit] [autoit]

    $backWertram = Round(($aMemTot / 1024) / 1024, 3) ;ausgabe der Ram werte

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_RAM

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _CPU
    ; Description ...: Rechnet aus den 10 CPU Auslastungs Werten den durchschnitt und versendent es per TCP zurück an den Absender
    ; Syntax ........: _CPU()
    ; Return values .: None
    ; Author ........: Marcel Dias Andrade
    ; ===============================================================================================================================
    Func _CPU()

    [/autoit] [autoit][/autoit] [autoit]

    $count = 0

    [/autoit] [autoit][/autoit] [autoit]

    ;Rechnet alle 10 CPU Usage Werte zusammen für die Durchschnittsrechnung
    For $ia = 0 To 9
    $backWertcpu = $backWertcpu + $array[$count]
    $count = $count + 1
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $backWertcpu = $backWertcpu / 10 ;Durchschnitt Brechnung

    [/autoit] [autoit][/autoit] [autoit]

    $backWertcpu = Round($backWertcpu)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_CPU

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: CPUusage
    ; Description ...: Liest die CPU Werte in ein Array ein
    ; Syntax ........: CPUusage()
    ; Return values .: None
    ; Author ........: Marcel Dias Andrade
    ; ===============================================================================================================================
    Func CPUusage()

    [/autoit] [autoit][/autoit] [autoit]

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"
    $objWMIService = ObjGet("winmgmts:" & $strComputer & "\root\CIMV2")

    [/autoit] [autoit][/autoit] [autoit]

    If $meancounter < 10 Then

    [/autoit] [autoit][/autoit] [autoit]

    $colItems = $objWMIService.ExecQuery("SELECT LoadPercentage FROM Win32_Processor", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($colItems) Then
    For $objItem In $colItems
    $array[$meancounter] = $objItem.LoadPercentage
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $meancounter = $meancounter + 1

    [/autoit] [autoit][/autoit] [autoit]

    Else
    $meancounter = 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>CPUusage

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: sessions
    ; Description ...: liest aus, wie viele User angemeldet sind
    ; Syntax ........: sessions()
    ; Return values .: None
    ; Author ........: Marcel Dias Andrade (PEA3-Fe)
    ; Modified ......: 04.07.2014
    ; ===============================================================================================================================
    Func sessions()
    Global $PID, $Ret = ""
    $PID = Run('"' & @ComSpec & '" /c quser', '', @SW_HIDE, 0x2)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $Ret &= StdoutRead($PID)
    If @error Then ExitLoop
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    $aAnzahl = StringSplit($Ret, @CRLF, 1) ;$aAnzahl[0]-2 = anzahl der angemeldeten User
    $aAnzahl = $aAnzahl[0] - 2

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>sessions

    [/autoit]

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.

    Einmal editiert, zuletzt von traumhaeftling (20. August 2014 um 09:47) aus folgendem Grund: gelöst

  • Für eine Serverüberwachung scheint mir aber Nagios das geeignetere Werkzeug zu sein.

  • Kommt leider nicht in Frage, da ich die Werte für ein anderes Tool benötige und es für meine Firma (bisschen größer) nicht in Frage kommt.

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.

  • Warum machst Du das ObjCreate für Oracle in der Schleife? Könnte man das nicht einmalig machen?

  • Allgemein: was würdet ihr am Quelltext verbessern?

    • Du regelst alles über globale Variablen. Warum nicht über Rückgabewerte der Funktionen?
    • Du erstellst die DB-Connection immer wieder neu - muss das sein?
    • In deiner CPUusage erzeugst du immer wieder das WMI-Objekt. Und um die Werte abzufragen immer wieder eine extra Anfrage. Stattdessen das WMI-Objekt nur einmal erzeugen und mit einem WMI-Refresher-Objekt arbeiten.
    • Deine CPU-Berechnung habe ich nicht verstanden. Im Array $array stehen die Auslastungen der einzelnen Cores. Die mittelst du später. Aber beschrieben wird es von der Funktion CPUusage(). Die Werte werden dort aber nicht drangehängt, sondern einfach überschrieben. Das heißt: Du rufst die Funktion mehrere Male innerhalb deiner 2 Minuten auf. Ins Ergebnis fließen aber nur die Werte des allerletzten Aufrufes von CPUUsage ein. Ist das so gewollt?


    Ich habe einfach mal einiges verändert - vielleicht bringt es dich ja weiter:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $d_CPU_mean
    Global $server_ID = 0
    Global $timestamp
    Global $d_CPU_mean, $a_RAM, $d_Sessions

    [/autoit] [autoit][/autoit] [autoit]

    ; ServerID dem Computer zuordnen
    For $i = 1 To 13
    If @ComputerName = StringFormat("compute%02d", $i+1) Then $server_ID = $i
    Next
    If @ComputerName = "COMPUTE20" Then $server_ID = 14
    If $server_ID = 0 Then Exit MsgBox(48, "Fehler", "Diesem Computer konnte keine Server-ID zugeordnet werden!")

    [/autoit] [autoit][/autoit] [autoit]

    ; ADODB-Verbindung aufbauen
    Global $ado = ObjCreate("ADODB.Connection")
    $ado.ConnectionString = ("Provider='OraOLEDB.Oracle';Data Source='xxxxx';User Id='xxxx';Password='xxxxx';")
    $ado.Open
    Global $adors = ObjCreate("ADODB.RecordSet")

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    ; CPU-Auslastung ermitteln
    $timestamp = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    Global $a_CPU[2] = [0,0]
    While TimerDiff($timestamp) <= 120000
    CPUusage($a_CPU)
    Sleep(20)
    WEnd
    $d_CPU_mean = Round($a_CPU[1] / $a_CPU[0])

    [/autoit] [autoit][/autoit] [autoit]

    $a_RAM = _RAM() ;RAM auslesen
    $d_Sessions = sessions() ; Anzahl Sessions

    [/autoit] [autoit][/autoit] [autoit]

    With $adors
    .ActiveConnection = $ado
    .Source = "INSERT INTO LOGS(DATUM, UHRZEIT, RAM_PROZENT, RAM_GB, CPU, USER_SESSIONS, SERVER_ID) VALUES('" & _
    @YEAR & "." & @MON & "." & @MDAY & "','" & _
    @HOUR & ":" & @MIN & ":" & @SEC & "'," & _
    $a_RAM[0] & "," & _
    $a_RAM[1] & "," & _
    $d_CPU_mean & "," & _
    $d_Sessions & "," & _
    $server_ID & ")"
    .open
    EndWith
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    $adors.close
    $ado.close

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _RAM() ;RAM auslesung - return: Array[0] = Prozent; Array[0] = Auslastung in GB
    Local $aMem = MemGetStats()
    Local $aMemTot = $aMem[1] - $aMem[2]
    Local $a_Ret[2] = [Round($aMemTot / $aMem[1] * 100), Round($aMemTot / 1048576, 3)]
    Return $a_Ret
    EndFunc ;==>_RAM

    [/autoit] [autoit][/autoit] [autoit]

    ; ermittelt die Summe der CPU-Auslastung. Byref $a_CPU[0] = Anzahl an Messungen; $a_CPU[1] = Summe der Prozentwerte
    Func CPUusage(ByRef $a_CPU)
    Local Static $o_WMI = ObjGet("winmgmts:\\.\root\cimv2")
    Local Static $o_WMIRefresher = ObjCreate("WbemScripting.Swbemrefresher")
    Local Static $o_CPULoadPercentage = $o_WMIRefresher.AddEnum ($o_WMI, "Win32_Processor").objectSet
    Local $x

    [/autoit] [autoit][/autoit] [autoit]

    $o_WMIRefresher.Refresh
    For $i in $o_CPULoadPercentage
    $x = $i.LoadPercentage
    If IsNumber($x) Then
    $a_CPU[0] += 1
    $a_CPU[1] += $x
    EndIf
    Next
    EndFunc ;==>CPUusage

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: sessions
    ; Description ...: liest aus, wie viele User angemeldet sind
    ; Syntax ........: sessions()
    ; Return values .: None
    ; Author ........: Marcel Dias Andrade (PEA3-Fe)
    ; Modified ......: 04.07.2014
    ; ===============================================================================================================================
    Func sessions()
    Local $PID, $Ret = ""
    Local $PID = Run('"' & @ComSpec & '" /c quser', '', @SW_HIDE, 0x2)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $Ret &= StdoutRead($PID)
    If @error Then ExitLoop
    WEnd
    Local $aAnzahl = StringSplit($Ret, @CRLF, 1) ;$aAnzahl[0]-2 = anzahl der angemeldeten User
    Return $aAnzahl[0] - 2
    EndFunc ;==>sessions

    [/autoit]
  • Du regelst alles über globale Variablen. Warum nicht über Rückgabewerte der Funktionen?


    Hast natürlich recht! Hab ich mal geändert.

    Du erstellst die DB-Connection immer wieder neu - muss das sein?


    Weil ich sie immer wieder geschlossen habe, damit es nicht rund um die Uhr offen ist.
    Hat das eine Auswirkung, wenn ich es immer offen lasse?

    In deiner CPUusage erzeugst du immer wieder das WMI-Objekt. Und um die Werte abzufragen immer wieder eine extra Anfrage. Stattdessen das WMI-Objekt nur einmal erzeugen und mit einem WMI-Refresher-Objekt arbeiten.


    WMI hab ich nicht ganz kapiert, mit deinem Code unten hat es wunderbar funktioniert und ich hab es verstanden. Vielen dank!

    Deine CPU-Berechnung habe ich nicht verstanden. Im Array $array stehen die Auslastungen der einzelnen Cores. Die mittelst du später. Aber beschrieben wird es von der Funktion CPUusage(). Die Werte werden dort aber nicht drangehängt, sondern einfach überschrieben. Das heißt: Du rufst die Funktion mehrere Male innerhalb deiner 2 Minuten auf. Ins Ergebnis fließen aber nur die Werte des allerletzten Aufrufes von CPUUsage ein. Ist das so gewollt?


    Ja, es war so gewollt. So hab ich nur den Mittelwert der letzten paar Sekunden. Theoretisch ist deine Lösung aber auch gut. So hab ich immer die Mittwelwerte der letzten 2 Minuten und ich rufe nicht ständig die Funktion neu auf - Top!

    Ich habe einfach mal einiges verändert - vielleicht bringt es dich ja weiter: [$code]


    Vielen Dank für deine Mühe, hat mir seh geholfen und ich hab es mal komplett angepasst! Lasse es jetzt mal laufen und schaue ob es sich noch aufhängt. Vielleicht lag es ja an einer dieser Gründe. Ich melde mich nochmal und gebe Rückmeldung.

    Auch vielen dank an Water! Mit dem Objekt hattest du natürlich auch recht.

    btw weiß jemand wie ich ermitteln kann wo und wann mein Programm sich aufgehängt hat? Dann könnte ich die genaue Stelle finden und da ansetzen. Eventuell kann ich auch nen Thema dafür erstellen, damit Leute mit dem gleichen Problem das leichter finden.

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.

    • Offizieller Beitrag

    btw weiß jemand wie ich ermitteln kann wo und wann mein Programm sich aufgehängt hat?


    Wenn du gar keinen Ansatz hast, wo der Abbruch erfolgen könnte, hilft nur das Ergebnis jeden Funktionsaufrufes zu loggen. Wichtig, auch wenn es das Skript in dem Moment langsam macht, die Logfunktion muss das Logfile nach jedem Schreibvorgang schliessen, also kein Handle auf geöffnetes Logfile übergeben, sondern den direkten Pfad. Sonst läufst du Gefahr, dass nicht alles im Log landet.
    Im Skript wertest du dann @error aus. Wenn du eigene Funktionen hast, sollten die im Fehlerfall einen Error setzen.
    Bsp.

    [autoit]

    GUICreate()
    _FileWriteLog($LogPath, 'GuiCreate: ' & @error)

    [/autoit]

    Bricht das Skript wegen eines Fehlers ab, wird dieser ja nicht mehr in das Log geschrieben, aber anhand des letzten Eintrages siehst du, was davor noch funktionierte. Der Folgebefehl erbringt dann den Absturz. ;)

    Unkompiliert kannst du in SciTE Traceline benutzen, das loggt jede Zeile in die Konsole.

  • Danke für den Tipp BugFix!

    Folgendermaßen hab ich die Fehlersuche durchgeführt:
    Nach jedem Funktionsaufruf hab ich ein FilewriteLog eingefügt.

    [autoit]

    _FileWriteLog($hFile, "RAM wurde berechnet")

    [/autoit]


    So konnte ich festellen, welche Funktion vor dem Programmabsturz funktioniert hat! Jedes mal konnte die CPU und RAM Funktion durchgeführt werden und ist danach hängen geblieben.

    [autoit]

    $d_CPU_mean = Round($a_CPU[1] / $a_CPU[0])
    _FileWriteLog($hFile, "CPU wurde berechnet")
    $a_RAM = _RAM() ; RAM auslesen
    _FileWriteLog($hFile, "RAM wurde berechnet")
    $d_sessions = sessions() ; Anzahl Sessions
    _FileWriteLog($hFile, "Sessions wurden berechnet")

    [/autoit]


    Sprich mein Skript bleibt nach einer Weile einfach in der Sessions Funktion stecken. Weshalb weiß ich noch nicht. Ich lass das alles jetzt mal testweiße ohne die Funktion laufen. Als Gegenprüfung.

    @AspirinJunkie, aber auch an alle die es vielleicht wissen.

    Mein Skript frisst jetzt extrem viel RAM und steigert sich sekündlich. Nach 2 Stunde hat es sich von 40 MB bis fast 100 MB gesteigert.
    War davor nicht so.

    An was könnte es liegen? Ich glaube es müsste entweder an dem Refresher liegen (was ich aber weniger glaub) oder daran, dass die ADO Verbindung immer offen ist.

    Was glaubt ihr?

    Danke an Alle für die klasse Unterstützung!

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.

  • Mein Skript frisst jetzt extrem viel RAM und steigert sich sekündlich. Nach 2 Stunde hat es sich von 40 MB bis fast 100 MB gesteigert.
    War davor nicht so.

    Für mich sieht es nach einem Memory-Leak aus.
    Wenn man folgendes Skript ausführt:

    [autoit]

    $oRecordSet = ObjCreate("ADODB.RecordSet")
    While 1
    $oRecordSet.close
    WEnd

    [/autoit]

    Steigt der Speicher immer weiter. Analog verhält es sich zu .open und der Kombination von beiden.
    Es ist auch irrelevant, ob man das Objekt immer wieder neu erstellt. Folgendes:

    [autoit]

    While 1
    $oRecordSet = ObjCreate("ADODB.RecordSet")
    $oRecordSet.close
    $oRecordSet = 0
    WEnd

    [/autoit]

    erbringt das selbe Ergebnis.
    Es ist aber nicht logisch, da durch das close und das Neubelegen der Werte alles zu diesem Objekt aus dem Speicher verschwinden sollte.

    Interessant ist dabei, dass es vorher bei dir nicht auftrat.
    Spontan fällt mir hierfür kein Grund ein. Ich gehe momentan von einem Bug aus - eher auf AutoIt-Seite.
    Aber eine Lösung habe ich spontan nicht.
    Mach es halt mit der Datenbankverbindung wie in deinem Skript bisher und schaue ob das Problem dann immer noch existiert.

  • Hallo Zusammen!

    Ich hab das ganze jetzt mal ein Wochende durchlaufen lassen und bin zu folgenden Ergebnissen gekommen:

    • Das Aufhängen wurde auf jeden Fall von der Sessions Funktion ausgelöst! Es ist das komplette Wochenden ohne Fehler auf 3 Servern durchgelaufen (2 Min takt, 4000 Werte)

    Eventuell benötigt es nen sleep. Arbeite noch dran.

    • Ich hab das ganze mit meinem Skript durchlaufen lassen (Sessions Funktion hab ich rausgenommen) --> RAM Werte sind stabil geblieben und bleiben im 40MB Bereich (war davor schon so und ist verkraftbar) ;)

    Heißt --> Keine Probleme wegen dem Memory Leak.

    Nun stellt sich die Frage, wieso es mit meinem Skript stabil bleibt und mit dem überarbeiteten Skript von Aspirinjunkie nicht.

    • Ich die ADO Verbindung so eingebaut wie Aspirin es gemacht hat und es funktioniert ohne steigerung der RAM Werte!

    Heißt --> Es liegt nicht an dem Recordset aufbau! Theoretisch könnte es dann nur am Refresher bzw. an der überarbeiteten CPU Funktion liegen
    Hat jemand eine Idee wieso?

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.

  • Nach dem was ich gelesen habe scheint auch ein Memory-Leak-Bug im Refresher-Objekt vorhanden zu sein.
    Ändere also die CPU-Funktion mal folgendermaßen:

    [autoit]

    Func CPUusage(ByRef $a_CPU)
    Local Static $o_WMI = ObjGet("winmgmts:\\.\root\cimv2")
    Local $x

    [/autoit][autoit][/autoit][autoit]

    For $i In $o_WMI.InstancesOf("Win32_Processor", 0x10 + 0x20)
    $x = $i.LoadPercentage
    If IsNumber($x) Then
    $a_CPU[0] += 1
    $a_CPU[1] += $x
    EndIf
    Next
    EndFunc

    [/autoit]
  • AspirinJunkie du bist mein perönlicher Held!
    Habs mal ne halbe Stunde durchlaufen lassen und es steigert sich nicht.
    Werde es jetzt komplett durchlaufen lassen bis morgen und gebe dann Rückmeldung.

    Es sieht aber gut aus ;)

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.

  • Hallo Zusammen,

    ihr seid die Besten! Es scheint jetzt alles wunderbar zu funktionieren! Hat seit dem Teststart keine Probleme mehr gegeben und es läuft gut durch. Vorallem bleibt es jetzt stabil bei 35 MB!

    Ich werde das ganze jetzt als Service einrichten, damit es vom System her immer gestartet wird und hoffe es trägt schön weiterhin alle Werte ein ;)

    Vielen Danke für die tolle Unterstützung!
    Ich setzte es jetzt mal auf gelöst.

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.