Как рассчитывается «% принятых байтов в использовании» в Perfmon?

3439
rossmcm

Я пытаюсь отследить утечку памяти на ПК с Windows 7 Embedded Panel. Используя Perfmon, я вижу, что «% зафиксированных использованных байтов» стабильно растет со скоростью 0,77% в час, когда рассматриваемое приложение работает. На Win XP (не встроенных) системах с одинаковыми условиями она вообще не растет.

Мне любопытно узнать, как рассчитывается этот показатель, чтобы добавить в приложение свой собственный код мониторинга и регистрации. Используя вызов API GlobalMemoryStatus, я могу получить несколько цифр, но никакие сложности, о которых я могу подумать, не дают такого же% результата, как у Perfmon при мониторинге счетчика «% зафиксированных байтов в использовании».

Как я могу получить этот параметр?

Обновить

Пример кода для Delphi приведен ниже. Просто создайте форму, поместите заметку и таймер на нее. Проверено под 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 ответ на вопрос

1
Jason Sherman

Check out GetPerformanceInfo(). It kicks back commit numbers.

Хмммм @ Джейсон - я не думаю, что вы могли бы указать мне, как позвонить из Delphi? Я называю это, но структура, которую я передаю, не изменяется, и после нескольких вызовов я получаю AV. rossmcm 13 лет назад 0
Разобрались - вопрос отредактирован, чтобы привести пример программы rossmcm 13 лет назад 0
Примечание. Лимит фиксации и, следовательно, процент использования основан на размере _current_ файла подкачки. Поэтому, если у вас включено расширение файла подкачки, ограничение может измениться. И, конечно же, плата за коммит может измениться (вверх или вниз) в любой момент. У программы нет особых причин запрашивать эти числа, поскольку числа могут изменяться сразу после того, как вы их запросите, но до того, как вы примете какие-либо решения на их основе. Jamie Hanrahan 7 лет назад 0

Похожие вопросы