Wie wird "% Committed Bytes in use" in Perfmon berechnet?

3559
rossmcm

Ich versuche, einen Speicherverlust auf einem Windows 7 Embedded Panel-PC aufzuspüren. Wenn Sie Perfmon verwenden, kann ich feststellen, dass "% Committed Bytes in use" stetig mit 0,77% pro Stunde wächst, wenn die betreffende App ausgeführt wird. Auf Win XP-Systemen (nicht eingebettet) mit denselben Bedingungen wächst es überhaupt nicht.

Ich bin neugierig zu wissen, wie diese Metrik berechnet wird, um der App meinen eigenen Überwachungs- und Protokollierungscode hinzuzufügen. Bei Verwendung des GlobalMemoryStatus-API-Aufrufs kann ich mehrere Zahlen zurückbekommen, aber keine Menge an Krämpfen, die ich mir vorstellen kann, gibt mir das gleiche% -Ergebnis wie bei Perfmon beim Überwachen des Leistungszählers "% zugesagte Bytes in Verwendung".

Wie kann ich diesen Parameter erhalten?

Aktualisieren

Beispielcode für Delphi folgt. Erstellen Sie einfach ein Formular, legen Sie ein Memo und einen Timer ab. Getestet unter Win XP.

unit Unit1;  interface  uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;  type TPerformanceInformation = packed record cb : DWORD ; CommitTotal : integer; CommitLimit : integer ; CommitPeak : Cardinal ; PhysicalTotal : Cardinal ; PhysicalAvailable : Cardinal ; SystemCache : Cardinal ; KernelTotal : Cardinal ; KernelPaged : integer ; KernelNonpaged : Cardinal ; PageSize : Cardinal ; HandleCount : DWORD ; ProcessCount : DWORD ; ThreadCount : DWORD ; end ;  TpPerformanceInformation = ^TPerformanceInformation ;  type TForm1 = class(TForm) Timer1: TTimer; Memo1: TMemo; procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end;  var Form1: TForm1 ;  function GetPerformanceInfo ( pPerformanceInformation : TpPerformanceInformation ; cb : dword) : integer ; stdcall ; external 'psapi.dll' ;  implementation  {$R *.dfm}  procedure TForm1.Timer1Timer(Sender: TObject);  var Status : TMemoryStatus; PerformanceInfo : TPerformanceInformation ;  begin Memo1.Clear ; Status.dwLength := sizeof(TMemoryStatus) ; GlobalMemoryStatus (Status) ;  Memo1.Lines.Add (Format ('Total memory used (%%) : %u',[Status.dwMemoryLoad])) ;  Memo1.Lines.Add (Format ('Physical memory used : %u',[(Status.dwTotalPhys - Status.dwAvailPhys)])) ; Memo1.Lines.Add (Format ('Physical memory left : %u',[Status.dwAvailPhys])) ; Memo1.Lines.Add (Format ('Total physical memory : %u',[Status.dwTotalPhys])) ; Memo1.Lines.Add (Format ('Total physical used (%%): %1.2f',[100.0 * (Status.dwTotalPhys - Status.dwAvailPhys) / Status.dwTotalPhys])) ;  Memo1.Lines.Add (Format ('Total page file : %u',[Status.dwTotalPageFile])) ; Memo1.Lines.Add (Format ('Page file used : %u',[(Status.dwTotalPageFile - Status.dwAvailPageFile)])) ; Memo1.Lines.Add (Format ('Page file left : %u',[Status.dwAvailPageFile])) ; Memo1.Lines.Add (Format ('Page file used (%%) : %1.2f',[100.0 * (Status.dwTotalPageFile - Status.dwAvailPageFile) / Status.dwTotalPageFile])) ;  if (GetPerformanceInfo (Addr (PerformanceInfo), Sizeof (TPerformanceInformation)) <> 0) then begin with PerformanceInfo do begin Memo1.Lines.Add (Format ('CommitTotal : %u',[CommitTotal])) ; Memo1.Lines.Add (Format ('CommitLimit : %u',[CommitLimit])) ; Memo1.Lines.Add (Format ('CommitPeak : %u',[CommitPeak])) ; Memo1.Lines.Add (Format ('PhysicalTotal : %u',[PhysicalTotal])) ; Memo1.Lines.Add (Format ('PhysicalAvailable: %u',[PhysicalAvailable])) ; Memo1.Lines.Add (Format ('SystemCache : %u',[SystemCache])) ; Memo1.Lines.Add (Format ('KernelTotal : %u',[KernelTotal])) ; Memo1.Lines.Add (Format ('KernelPaged : %u',[KernelPaged])) ; Memo1.Lines.Add (Format ('KernelNonpaged : %u',[KernelNonpaged])) ; Memo1.Lines.Add (Format ('PageSize : %u',[PageSize])) ; Memo1.Lines.Add (Format ('HandleCount : %u',[HandleCount])) ; Memo1.Lines.Add (Format ('ProcessCount : %u',[ProcessCount])) ; Memo1.Lines.Add (Format ('ThreadCount : %u',[ThreadCount])) ; end ; end ; end;  end. 
3

1 Antwort auf die Frage

1
Jason Sherman

Testen Sie GetPerformanceInfo () . Es setzt Commit-Nummern zurück.

Hmmmm @ Jason - ich denke nicht, dass Sie mich darauf hinweisen könnten, wie ich das von Delphi aus anrufen kann? Ich nenne es, aber die Struktur, die ich durchlasse, wird nicht verändert und nach ein paar weiteren Anrufen bekomme ich eine AV. rossmcm vor 13 Jahren 0
Arbeitete aus - Frage bearbeitet, um Beispielprogramm zu erstellen rossmcm vor 13 Jahren 0
Hinweis: Das Commit-Limit und damit der Prozentsatz der Verwendung basiert auf der _current_ -Pagefile-Größe. Wenn Sie also die Seitendatei-Erweiterung aktiviert haben, kann sich das Limit ändern. Und natürlich kann sich die Commit-Gebühr jederzeit ändern (nach oben oder unten). Es gibt wenig Gründe für ein Programm, diese Zahlen abzufragen, da sich die Zahlen direkt nach der Abfrage ändern können, bevor Sie jedoch auf dieser Grundlage Entscheidungen treffen. Jamie Hanrahan vor 7 Jahren 0