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
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
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
$timestamp = TimerInit()
[/autoit] [autoit][/autoit] [autoit]While TimerDiff($timestamp) <= 120000
Call("CPUusage")
Sleep(20)
WEnd
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
#include <GUIConstants.au3>
#include <File.au3>
Global $array[10]
Global $meancounter = 0
Global $callcounter
Global $backWertcpu
Global $backWertram
Global $aGesamt
Global $aAnzahl
Global $server_ID
Dim $oMyError
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
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
_RAM() ;RAM auslesen
_CPU() ;CPU berechnung starten und Werte versenden
sessions()
$ado = ObjCreate("ADODB.Connection")
[/autoit] [autoit][/autoit] [autoit]With $ado
.ConnectionString = ("Provider='OraOLEDB.Oracle';Data Source='xxxxx';User Id='xxxx';Password='xxxxx';")
.Open
EndWith
$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
$adors.close
$ado.close
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()
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()
$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
$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()
$wbemFlagReturnImmediately = 0x10
$wbemFlagForwardOnly = 0x20
$colItems = ""
$strComputer = "localhost"
$objWMIService = ObjGet("winmgmts:" & $strComputer & "\root\CIMV2")
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
$meancounter = $meancounter + 1
[/autoit] [autoit][/autoit] [autoit]Else
$meancounter = 0
EndIf
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)
While 1
$Ret &= StdoutRead($PID)
If @error Then ExitLoop
WEnd
$aAnzahl = StringSplit($Ret, @CRLF, 1) ;$aAnzahl[0]-2 = anzahl der angemeldeten User
$aAnzahl = $aAnzahl[0] - 2
EndFunc ;==>sessions
[/autoit]