Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Monitor Speicherverbrauch (https://www.delphipraxis.net/206727-monitor-speicherverbrauch.html)

user69 23. Jan 2021 09:34

Monitor Speicherverbrauch
 
Ich suche nach einer einfachen Möglichkeit den Speicherverbrauch meins Programms zu loggen. Dies soll nur während der Entwicklung sein, nicht beim Kunden.
Dabei gibt es ein paar Hürden: Multithreading und auch der Aufruf einen externen Programms, was Teilberechnungen ausführt (auch Multithreading mit weiteren Unterprogrammaufrufen). Das externe Programm kann ich im code nicht ändern, es muss aber in Speicherverbrauch berücksichtigt werden.

Ich brauch nur die Summe des der Speichernutzung. Im Windows Taskmanager kann ich es zwar teils beobachten, aber das ist mir viel zu aufwendig und am ende hab ich kein logging über lange Zeit.

Andere Memory Manager, die dies analysieren sind wohl zu kompliziert, da auch die Subprozesse in C geschrieben sind, wo ich gar nicht rankomme.

Ich stellte mir eine kleines Prog vor, was im Hintergrund läuft, nach meinen Prozess per Namen sucht und dessen Speicherverbrauch dann alle 10 sek loggt.

Habt ihr da Ideen? Am Besten Delphi source, damit ich mir das anpassen kann.

JohannesK 23. Jan 2021 17:02

AW: Monitor Speicherverbrauch
 
Versuche es mal damit (habe ich vor einiger Zeit auch hier in der Delphipraxis gefunden).

Delphi-Quellcode:
function getMyMemoryUsageInByte : integer;
var
  pmc: PPROCESS_MEMORY_COUNTERS;
  cb: Integer;
begin
 cb := SizeOf(_PROCESS_MEMORY_COUNTERS);
 GetMem(pmc, cb);
 pmc^.cb := cb;
 if(GetProcessMemoryInfo(GetCurrentProcess, pmc, cb))then
   result := pmc^.WorkingSetSize
 else
   result := -1;
 FreeMem(pmc);
end;
Das Ergebnis kannst Du dann in ein Memofeld oder eine Stringlist schreiben für die langfristige Beobachtung.

user69 9. Feb 2021 21:54

AW: Monitor Speicherverbrauch
 
Ja, GetProcessMemoryInfo ist wohl genau der Weg...

Nun bin ich nach einiger Internetsuche nicht ganz schlüssig, welchen Wert von pmc: PPROCESS_MEMORY_COUNTERS ich nehmen soll: pmc.WorkingSetSize oder pmc.PagefileUsage ?
Ich möchte den komplett angeforderten Speicher wissen, also RAM + Auslagerung.

Laut Internet gilt wohl folgendes:
pmc.WorkingSetSize: gibt mir wohl die Speichernutzung an. Da fehlt mir aber scheinbar alles was ausgelagert wird.
pmc.PagefileUsage: Das sollte laut Internet den komplett angeforderten Speicher zurückgeben (also inklusive Auslagerung).

Liege ich da richtig mit pmc.PagefileUsage für den komplett angeforderten Speicher?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz