Script RAM Nutzung wird immer höher

  • Guten Abend,

    mir ist aufgefallen, dass mein Serverprogramm sich mit jedem verarbeiteten Befehl des Clients mehr Ram gönnt. Nach 1 Stunde lag die Nutzung bei ca 100mb. Wenn ich den Client gestoppt habe, ist die Nutzung nicht runter gegangen.

    Gibt es eine Möglichkeit die RAM-Nutzung zu begrenzen, bzw. den RAM zu entleeren oder liegt der Fehler im Script?

    Serverscript

    Spoiler anzeigen
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Outfile_x64=starter.exe
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

    #include <Constants.au3>
    #include <File.au3>
    #include <array.au3>

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

    ;... <Username> <ServerNo> <RAM> <Passwort>

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

    If $CmdLine[0] < 1 Then Exit

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

    $Process = Run("java -Dfile.encoding=utf-8 -Djline.terminal=jline.UnsupportedTerminal -server -Xmx" & $CmdLine[3] & "M -jar D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\minecraft_server.jar nogui -nojline", "D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
    $ticker = TimerInit()

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

    If $Process Then
    WinSetTitle("starter.exe", "", $Process)
    Else
    Exit
    EndIf

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

    Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc"), $f_COMError = False

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

    TCPStartup()
    $asocket = TCPListen("176.57.141.178", 1)
    $try = 0
    While 1
    Do
    $acceptedSocket = TCPAccept($asocket)
    Until $acceptedSocket <> -1
    $waittimer = TimerInit()
    Do
    $receivedData = TCPRecv($acceptedSocket, 1024)
    Until $receivedData <> "" Or TimerDiff($waittimer) > 60000
    $authstring = $CmdLine[1] & "|;:|" & $CmdLine[4]
    If $receivedData == $authstring And $try < 4 Then
    TCPSend($acceptedSocket, "O.K.")
    ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Authentication from " & SocketToIP($acceptedSocket) & " successful!" & @CRLF)
    Do
    $receivedData = TCPRecv($acceptedSocket, 1024)
    Until $receivedData <> "" Or TimerDiff($waittimer) > 60000
    ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Incoming Command: |" & $receivedData & "| from " & SocketToIP($acceptedSocket) & @CRLF)
    If $receivedData == "multiple" Then
    Do
    $receivedData = TCPRecv($acceptedSocket, 1024)
    If $receivedData == "list" Then
    TCPSend($acceptedSocket, GetOnlinePlayer())
    ElseIf $receivedData == "maxram" Then
    TCPSend($acceptedSocket, $CmdLine[3])
    ElseIf $receivedData == "useram" Then
    $ramarr = ProcessGetStats($Process)
    $ramarr = $ramarr[0] / 1024 / 1024
    If StringInStr($ramarr, ".") Then $ramarr = StringTrimRight($ramarr, StringLen($ramarr) - StringInStr($ramarr, ".") + 1)
    TCPSend($acceptedSocket, $ramarr)
    ElseIf $receivedData == "usecpu" Then
    $cpuarr = _ProcessListProperties($Process)
    TCPSend($acceptedSocket, StringToBinary($cpuarr[1][6] / 10))
    ElseIf $receivedData == "uptime" Then
    TCPSend($acceptedSocket, GetServerUptime())
    EndIf
    Until $receivedData == "multipleend" Or TimerDiff($waittimer) > 60000 Or $receivedData == "quit"
    If $receivedData == "quit" Or $receivedData == "multipleend" Then ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Connection to " & SocketToIP($acceptedSocket) & " has been reset!" & @CRLF)
    If TimerDiff($waittimer) > 60000 Then ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Lost connection to " & SocketToIP($acceptedSocket) & @CRLF)
    Else
    If $receivedData == "list" Then
    TCPSend($acceptedSocket, GetOnlinePlayer())
    ElseIf $receivedData == "uptime" Then
    TCPSend($acceptedSocket, GetServerUptime())
    ElseIf $receivedData == "getserverlog" Then
    $logfile = FileOpen("D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\server.log",0)
    If $logfile == -1 Then
    TCPSend($acceptedSocket,"-1")
    ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Failed to open Logfile!" & @CRLF)
    Else
    $rline = ""
    If _FileCountLines("D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\server.log") > 50 Then
    $i = _FileCountLines("D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\server.log") - 49
    Else
    $i = 1
    EndIf
    Do
    $lnread = FileReadLine($logfile,$i)
    If IsString($lnread) Then
    $rline &= $lnread&@CRLF
    $i = $i+1
    Else
    $i = _FileCountLines("D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\server.log")+1
    EndIf
    Until $i = _FileCountLines("D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\server.log")+1
    TCPSend($acceptedSocket, $rline)
    FileClose($logfile)
    $rline = ""
    ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Connection to " & SocketToIP($acceptedSocket) & " has been reset!" & @CRLF)
    EndIf
    ElseIf TimerDiff($waittimer) > 60000 Then
    ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Lost connection to " & SocketToIP($acceptedSocket) & @CRLF)
    ElseIf $receivedData == "quit" Then
    ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Connection to " & SocketToIP($acceptedSocket) & " has been reset!" & @CRLF)
    Else
    StdinWrite($Process, $receivedData & @CRLF)
    EndIf
    EndIf
    TCPCloseSocket($acceptedSocket)
    $try = 0
    ElseIf $receivedData == "quit"
    ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Connection to " & SocketToIP($acceptedSocket) & " has been reset!" & @CRLF)
    TCPCloseSocket($acceptedSocket)
    Else
    ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Authentication failed from " & SocketToIP($acceptedSocket) & @CRLF)
    TCPSend($acceptedSocket, "Wrong password or username!")
    TCPCloseSocket($acceptedSocket)
    $try = $try + 1
    If $try > 3 Then
    ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Too many failed authentications! Sleeping 2 min." & @CRLF)
    TCPCloseSocket($asocket)
    Sleep(120000)
    $try = 0
    $asocket = TCPListen("176.57.141.178", 1)
    ConsoleWrite("[" & @HOUR & ":" & @MIN & ":" & @SEC & "]: Listening..." & @CRLF)
    EndIf
    EndIf
    WEnd
    TCPShutdown()
    Exit

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

    Func GetOnlinePlayer()
    StdinWrite($Process, "list" & @CRLF)
    $logfile = FileOpen("D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\server.log", 0)
    If $logfile == -1 Then
    FileClose($logfile)
    Return "0/0"
    Else
    $atime = TimerInit()
    Do
    $text = FileReadLine($logfile, _FileCountLines("D:\Minecraft_Server" & $CmdLine[1] & "\Server_" & $CmdLine[2] & "\server.log") - 1)
    Until StringInStr($text, "There are ") <> 0 Or StringInStr($text, "Es sind ") <> 0 Or TimerDiff($atime) > 10000
    If StringInStr($text, "/INFO") == 0 Then
    $pos = StringInStr($text, "/")
    Else
    $pos = StringInStr($text, "/", 0, 2)
    EndIf
    $pos1 = StringInStr($text, " ", 0, 5)
    $pos2 = StringInStr($text, " ", 0, 6)
    $player = StringTrimRight($text, StringLen($text) - $pos2)
    $player = StringTrimLeft($player, $pos1)
    FileClose($logfile)
    $test = ""
    Return $player
    EndIf
    EndFunc

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

    Func GetServerUptime()
    $zeit = TimerDiff($ticker) / 1000
    If StringInStr($zeit, ".") > 0 Then $zeit = StringTrimRight($zeit, StringLen($zeit) - StringInStr($zeit, ".") + 1)
    If $zeit < 60 Then
    $sec = $zeit
    $min = "0"
    $std = "0"
    $day = "0"
    ElseIf $zeit < 60 * 60 Then
    If StringInStr($zeit / 60, ".") == 0 Then
    $sec = "0"
    $min = $zeit / 60
    Else
    $min = $zeit / 60
    If StringInStr($min, ".") > 0 Then $min = StringTrimRight($min, StringLen($min) - StringInStr($min, ".") + 1)
    $sec = $zeit - $min * 60
    If StringInStr($sec, ".") > 0 Then $sec = StringTrimRight($sec, StringLen($sec) - StringInStr($sec, ".") + 1)
    EndIf
    $std = "0"
    $day = "0"
    ElseIf $zeit < 60 * 60 * 24 Then
    If StringInStr($zeit / 60 / 60, ".") == 0 Then
    $sec = "0"
    $min = "0"
    $std = $zeit / 60 / 60
    Else
    $std = $zeit / 60 / 60
    If StringInStr($std, ".") > 0 Then $std = StringTrimRight($std, StringLen($std) - StringInStr($std, ".") + 1)
    $min = $zeit / 60 - $std * 60
    If StringInStr($min, ".") > 0 Then $min = StringTrimRight($min, StringLen($min) - StringInStr($min, ".") + 1)
    $sec = $zeit - $std * 60 * 60 - $min * 60
    If StringInStr($sec, ".") > 0 Then $sec = StringTrimRight($sec, StringLen($sec) - StringInStr($sec, ".") + 1)
    EndIf
    $day = "0"
    Else
    If StringInStr($zeit / 60 / 60 / 24, ".") == 0 Then
    $sec = "0"
    $min = "0"
    $std = "0"
    $day = $zeit / 60 / 60 / 24
    Else
    $day = StringTrimRight($zeit / 60 / 60 / 24, StringLen($zeit / 60 / 60 / 24) - StringInStr($zeit / 60 / 60 / 24, ".") + 1)
    $std = $zeit / 60 / 60 - $day * 24
    If StringInStr($std, ".") > 0 Then $std = StringTrimRight($std, StringLen($std) - StringInStr($std, ".") + 1)
    $min = $zeit / 60 - $std * 60 - $day * 24 * 60
    If StringInStr($min, ".") > 0 Then $min = StringTrimRight($min, StringLen($min) - StringInStr($min, ".") + 1)
    $sec = $zeit - $std * 60 * 60 - $min * 60 - $day * 24 * 60 * 60
    If StringInStr($sec, ".") > 0 Then $sec = StringTrimRight($sec, StringLen($sec) - StringInStr($sec, ".") + 1)
    EndIf
    EndIf
    If $sec < 10 Then $sec = "0" & $sec
    If $min < 10 Then $min = "0" & $min
    If $std < 10 Then $std = "0" & $std
    $ausgabe = $day & "d " & $std & ":" & $min & ":" & $sec
    Return $ausgabe
    $ausgabe = ""
    $zeit = ""
    EndFunc

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

    Func SocketToIP($SHOCKET)
    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")
    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
    "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
    If Not @error And $aRet[0] = 0 Then
    $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
    If Not @error Then $aRet = $aRet[0]
    Else
    $aRet = 0
    EndIf
    $sockaddr = 0
    Return $aRet
    EndFunc

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

    Func _ProcessListProperties($Process = "", $sComputer = ".")
    Local $sUserName, $sMsg, $sUserDomain, $avProcs, $dtmDate
    Local $avProcs[1][2] = [[0, ""]], $n = 1
    ; Convert PID if passed as string
    If StringIsInt($Process) Then $Process = Int($Process)
    ; Connect to WMI and get process objects
    $oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy, (Debug)}!" & $sComputer & "\root\cimv2")
    If IsObj($oWMI) Then
    ; Get collection processes from Win32_Process
    If $Process == "" Then
    ; Get all
    $colProcs = $oWMI.ExecQuery("select * from win32_process")
    ElseIf IsInt($Process) Then
    ; Get by PID
    $colProcs = $oWMI.ExecQuery("select * from win32_process where ProcessId = " & $Process)
    Else
    ; Get by Name
    $colProcs = $oWMI.ExecQuery("select * from win32_process where Name = '" & $Process & "'")
    EndIf
    If IsObj($colProcs) Then
    ; Return for no matches
    If $colProcs.count = 0 Then Return $avProcs
    ; Size the array
    ReDim $avProcs[$colProcs.count + 1][10]
    $avProcs[0][0] = UBound($avProcs) - 1
    ; For each process...
    For $oProc In $colProcs
    ; [n][0] = Process name
    $avProcs[$n][0] = $oProc.name
    ; [n][1] = Process PID
    $avProcs[$n][1] = $oProc.ProcessId
    ; [n][2] = Parent PID
    $avProcs[$n][2] = $oProc.ParentProcessId
    ; [n][3] = Owner
    If $oProc.GetOwner($sUserName, $sUserDomain) = 0 Then $avProcs[$n][3] = $sUserDomain & "" & $sUserName
    ; [n][4] = Priority
    $avProcs[$n][4] = $oProc.Priority
    ; [n][5] = Executable path
    $avProcs[$n][5] = $oProc.ExecutablePath
    ; [n][8] = Creation date/time
    $dtmDate = $oProc.CreationDate
    If $dtmDate <> "" Then
    ; Back referencing RegExp pattern from weaponx
    Local $sRegExpPatt = "\A(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(?:.*)"
    $dtmDate = StringRegExpReplace($dtmDate, $sRegExpPatt, "$2/$3/$1 $4:$5:$6")
    EndIf
    $avProcs[$n][8] = $dtmDate
    ; [n][9] = Command line string
    $avProcs[$n][9] = $oProc.CommandLine
    ; increment index
    $n += 1
    Next
    Else
    SetError(2); Error getting process collection from WMI
    EndIf
    ; release the collection object
    $colProcs = 0
    ; Get collection of all processes from Win32_PerfFormattedData_PerfProc_Process
    ; Have to use an SWbemRefresher to pull the collection, or all Perf data will be zeros
    Local $oRefresher = ObjCreate("WbemScripting.SWbemRefresher")
    $colProcs = $oRefresher.AddEnum($oWMI, "Win32_PerfFormattedData_PerfProc_Process").objectSet
    $oRefresher.Refresh
    ; Time delay before calling refresher
    Local $iTime = TimerInit()
    Do
    Sleep(20)
    Until TimerDiff($iTime) >= 100
    $oRefresher.Refresh
    ; Get PerfProc data
    For $oProc In $colProcs
    ; Find it in the array
    For $n = 1 To $avProcs[0][0]
    If $avProcs[$n][1] = $oProc.IDProcess Then
    ; [n][6] = CPU usage
    $avProcs[$n][6] = $oProc.PercentProcessorTime
    ; [n][7] = memory usage
    $avProcs[$n][7] = $oProc.WorkingSet
    ExitLoop
    EndIf
    Next
    Next
    Else
    SetError(1); Error connecting to WMI
    EndIf
    ; Return array
    Return $avProcs
    EndFunc

    [/autoit]

    Ich habe bereits große Strings nach der Verarbeitung entleer ($string = ""), hat aber nicht viel gebracht...

    Hat jemand eine Lösung für das Problem?


    Mit freundlichen Grüßen

    Krassus

    Einmal editiert, zuletzt von Krassus1547 (24. Dezember 2013 um 21:38) aus folgendem Grund: Fehler gefunden

    • Offizieller Beitrag