Bagaimana "% byte berkomitmen digunakan" dalam Perfmon dihitung?

3

Saya mencoba melacak kebocoran memori pada Windows 7 Embedded Panel PC. Menggunakan Perfmon, saya dapat melihat bahwa "% byte yang digunakan sedang digunakan" tumbuh mantap pada tingkat 0,77% per jam ketika aplikasi tersebut sedang berjalan. Pada Win XP (tidak tertanam) sistem dengan kondisi yang sama tidak tumbuh sama sekali.

Saya ingin tahu bagaimana metrik ini dihitung, dengan maksud untuk menambahkan kode pemantauan dan pencatatan saya sendiri ke aplikasi. Menggunakan panggilan GlobalMemoryStatus API saya bisa mendapatkan kembali beberapa nomor, tetapi tidak ada jumlah yang saya bisa pikirkan memberikan saya hasil% yang sama seperti Perfmon ketika memonitor counter "% byte yang digunakan dalam penggunaan".

Bagaimana saya bisa mendapatkan parameter ini?

Memperbarui

Kode contoh untuk Delphi berikut. Cukup buat formulir, masukkan memo dan timer ke atasnya. Diuji di bawah 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.
rossmcm
sumber

Jawaban:

1

Lihat GetPerformanceInfo () . Itu menendang kembali angka komit.

Jason Sherman
sumber
Hmmmm @Jason - Saya kira Anda tidak bisa menunjukkan kepada saya bagaimana menyebutnya dari Delphi? Saya menyebutnya tetapi struktur yang saya berikan tidak dapat dimodifikasi dan setelah beberapa panggilan lagi saya mendapatkan AV.
rossmcm
Berhasil - pertanyaan diedit untuk memberikan contoh program
rossmcm
Catatan: Batas Komit dan oleh karena itu persentase penggunaan didasarkan pada ukuran file halaman saat ini . Jadi, jika Anda memiliki ekspansi pagefile diaktifkan batasnya dapat berubah. Dan tentu saja biaya komit dapat berubah (naik atau turun) setiap saat. Ada sedikit alasan bagi sebuah program untuk menanyakan angka-angka ini karena angka-angka tersebut dapat berubah tepat setelah Anda menanyakannya, tetapi sebelum Anda membuat keputusan berdasarkan pada angka-angka itu.
Jamie Hanrahan