Nachprüfen wie viel Speicher (Arbeitsspeicher & Auslagerungsdatei) ein Prozess gerade verwendet

  • Ja meine Thread-Überschrift ist eigentlich schon meine frage :) ich will nachprüfen wie viel Speicher (Arbeitsspeicher & Auslagerungsdatei) ein Prozess gerade verwendet und wenn er dann über 1,2 MB verbraucht soll er einfach beendet und neu gestartet werden aber wie das geht weiss ich :P nur wie ich die Speicherauslastung auslese hab ich leider nicht gefunden :)

    Wär schön wenn mir einer helfen könnte :)

    MFG FireFlyer

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

    Einmal editiert, zuletzt von FireFlyer (12. Januar 2008 um 17:08)

  • öhhm ProcessGetStats... find ich net wirklich ich find nur _ProcessGetPriority und _ProcessGetName is das noch ne UDF die ich includen muss oder so?

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • ne is bei mir in der neusten Version (v3.2.10.0) dabei.

  • oO dann muss ich wohl mal updaten 8|

    kk THX @ all hab jetzt mal die neue version :) jetzt isses kein problem mehr

    Grüßle :)

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • sry dochnochmal ne frage:
    die memory stats beziehen sich also auf den arbeitsspeicher und peak ist das höchste was er gebraucht hat? peak = gipfel ^^ (physical-memory)
    aber kann ich auch irgendwo den speicherplatz den er in der auslagerungsdatei braucht auslesen? (virtual-memory)

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • ok es handelt sich hierbei um einen Prozess der eine Logdatei schreibt... (TSM Sicherungsserver) allerdings macht dieser aus unerklärlichen gründen fehler sobald er über 1,2 MB speicher verbraucht (physischen+virtuellen). Dieses ganze Programm hat HP geschrieben die haben dazu aber im moment leider keine Lösung aber so alle 8:00 Stunden passiert das eben dazu muss man im moment noch den prozess manuell neustarten dann geht er wieder perfekt :( ...
    @pee reicht diese begründung?

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • ja das problem ist die zeiten sind sehr unterschiedlich +- 3 std aber was glaubst du was da alles passiert wenn er eine fehlerhafte log von über 2000 benutzern schreibt... deswegen möcht ich ja genau die auslastung überwachen

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • weil das natürlich jedes mal lücken in der log gibt und die wollen wir natürlich vermeiden pro sekunde werden ca. 50-100 zeilen geschrieben, wie gesagt der loggt die ganzen aktionen die die Angestellten machen und das sind über 2000

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Spontan hätte ich gesagt das du einfach die Speicherauslastung via WMI ausliest.
    So könnte ich mir das vorstellen:

    Spoiler anzeigen
    [autoit]

    $ProcessID = "lsass.exe" ;Hier Prozessname oder ProzessID eintragen
    $PMemory = _ProcessGetMemoryInfo($ProcessID)
    If Not @error Then
    MsgBox(0, "FireFox.exe", "WorkingSetSize: " & $PMemory[0] / 1048576 & ' MB' & @CRLF & _
    "VirtualSize: " & $PMemory[1] / 1048576 & ' MB' & @CRLF & _
    "PeakWorkingSetSize: " & $PMemory[2] / 1048576 & ' MB' & @CRLF & _
    "PeakVirtualSize: " & $PMemory[3] / 1048576 & ' MB')
    EndIf

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

    Func _ProcessGetMemoryInfo($PID)
    If IsString($PID) Then $PID = ProcessExists($PID)
    Local $Where, $ReturnArray[4]
    Local $WMIObject = ObjGet("winmgmts:\\localhost\root\CIMV2")
    If @error Then Return SetError(2,2,$ReturnArray)
    For $o In $WMIObject.ExecQuery("SELECT VirtualSize, WorkingSetSize, PeakVirtualSize, PeakWorkingSetSize FROM Win32_Process WHERE ProcessID=" & $PID, "WQL", 48)
    $ReturnArray[0] = $o.WorkingSetSize
    $ReturnArray[1] = $o.VirtualSize
    $ReturnArray[2] = $o.PeakWorkingSetSize
    $ReturnArray[3] = $o.PeakVirtualSize
    Return $ReturnArray
    Next
    Return SetError(1, 1, $ReturnArray)
    EndFunc

    [/autoit]
  • Ja, geht auch. Ich würde das WMI-Objekt aber nur 1x erzeugen und dann immer das gleiche nehmen. Es gab da doch einen Fehler mit ansteigender Speicherauslastung.

    Spoiler anzeigen
    [autoit]

    $ProcessID = "lsass.exe" ;Hier Prozessname oder ProzessID eintragen
    Global $WMIObject = ObjGet("winmgmts:\\localhost\root\CIMV2")
    While 1
    $PMemory = _ProcessGetMemoryInfo($ProcessID)
    If Not @error Then
    MsgBox(0, "FireFox.exe", "WorkingSetSize: " & $PMemory[0] / 1048576 & ' MB' & @CRLF & _
    "VirtualSize: " & $PMemory[1] / 1048576 & ' MB' & @CRLF & _
    "PeakWorkingSetSize: " & $PMemory[2] / 1048576 & ' MB' & @CRLF & _
    "PeakVirtualSize: " & $PMemory[3] / 1048576 & ' MB')
    If ($PMemory[2]/1024) > 1220 Then ExitLoop
    EndIf
    WEnd
    MsgBox(0,"","Speicherauslastung größer 1220 KB!")

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

    Func _ProcessGetMemoryInfo($PID)
    If IsString($PID) Then $PID = ProcessExists($PID)
    Local $Where, $ReturnArray[4]
    If @error Then Return SetError(2,2,$ReturnArray)
    For $o In $WMIObject.ExecQuery("SELECT VirtualSize, WorkingSetSize, PeakVirtualSize, PeakWorkingSetSize FROM Win32_Process WHERE ProcessID=" & $PID, "WQL", 48)
    $ReturnArray[0] = $o.WorkingSetSize
    $ReturnArray[1] = $o.VirtualSize
    $ReturnArray[2] = $o.PeakWorkingSetSize
    $ReturnArray[3] = $o.PeakVirtualSize
    Return $ReturnArray
    Next
    Return SetError(1, 1, $ReturnArray)
    EndFunc

    [/autoit]
  • @pee taskmanager kann leider keine einzelnen speicherauslastungen auslesen bzw. nur die physikalische
    Aber das is ne gute idee mit dem ProcessExplorer ich benutze den ja schon ewig und der kann des :) muss ich nur mal abklären ob ich den da installieren darf... die haben da sehr sehr strenge sicherheitsmaßnamen... is en kanadischer konzern und seit dem 11. sept wird alles 10mal geprüft :( ... sogar ich werde immer durchsucht ^^
    DANESCHÖN :)


    @aspirin-junkie deines ist natürlich perfekt... aber was genau liest der denn da aus und hat das die windoof server edition auch?... ich schätze schon ^^
    auch dir VIEEEEELEN DANK :)

    @propagandy ja das problem ist eine erhöte speicherauslastung und zwar genau dann wenn
    physikalische Speicherauslastung + virtuelle Speicherauslastung > 1,2 MB
    ist... keiner weiß warum, ist halt so ^^

    Aber das schreib ich mir dann schon selbst zurecht... jetzt da ich ja weiss woher ich die daten bekomme ist das kein problem mehr... wahrscheinlich sind da auch noch andere sachen beteiligt (Prozesse, Dienste) oder so... aber das find ich auch noch raus :D

    Nochmal THX @ All :)

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

    Einmal editiert, zuletzt von FireFlyer (12. Januar 2008 um 17:15)

  • @progandy
    Stimmt.
    Weiß zufällig jemand ob das von den AutoIt Developern mal in Angriff genommen wurde?
    Der Fehler ist ja schon ziemlich lange bekannt und wirklich tierich nervig.
    Sind ja nicht nur WMI-Objekte.

    FireFlyer
    Es wird auf die WMI (Windows Management Instrumentation) zugegriffen.
    Das ist eine Schnittstelle zu fast allen Systemeinstellungen eines Windows-Betriebssystems.
    So ziemlich alles lässt sich damit auslesen.
    Im englischen Forum gibt es das Tool "Scriptomatic ".
    Wenn du dich mit WMI beschäftigen willst empfehle ich dir erstmal mit dem Tool bisschen rumzuspielen, da wird das Konzept etwas klarer.

    Edit:
    FireFlyer
    Progandy meint nicht die Erhöhung der Speicherauslastung von deinem zu überwachenden Tool sondern vom AutoIt-Skript selbst.
    Das ist ein bisher nicht behobener Bug von AutoIt.
    Es ist also zu empfehlen, wie in Progandy´s Skript, das WMI-Objekt global zu definieren so das nicht immer wieder ein neues erstellt wird.

  • ok, nur was daran komisch ist.. der server hätte ja noch massenhaft speicher und so... das is ja das lustigste daran xD der is geclustert usw... hat massenhaft recourcen aber der prozess kackt trotzdem immer da rum
    @aspirin-junkie vllt kannst du HP ja mal erklären wie man sowas macht ^^
    & thx nochmal für den tipp mit dem Scriptomatic... werd ich mir anschauen scheint was allgemein nützliches zu sein... also wenn ich dich richtig verstanden habe greifen alle anwendungen (Taskmanager, ProcessExplorer usw.) auf die WMI zurück und machen halt dazu eine schöne Ausgabe oder?

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Ich denke, Taskmanager & Co greifen auf die gleichen Infos wie WMI zu, aber nicht auf WMI selbst. Das ist nur eine Schnittstelle, um einfacher an die Informationen zu kommen