2015-04-01 18 views
13

Ok, quindi sto utilizzando WMI (.net/C#) per raccogliere costantemente dati su un processo specifico in esecuzione sulla macchina. Ottengo i dati attraverso la classe Win32_PerfFormattedData_PerfProc_Process. Questa classe ha un sacco di proprietà, ma quelli che ci interessa sono i seguenti:Come calcolare l'utilizzo della memoria come fa Task Manager?

uint64 PageFileBytes; 

valore, in byte, che questo processo ha utilizzato nel file di paging (s). I file di paging memorizzano le pagine di memoria utilizzate dal processo che non sono contenute in altri file. I file di paging sono condivisi da tutti i processi e la mancanza di spazio nei file di paging può impedire ad altri processi di allocare memoria.

uint32 PoolNonpagedBytes; 

valore, in byte, in piscina paging, un'area di memoria di sistema (memoria fisica utilizzata dal sistema operativo) per gli oggetti che non possono essere scritti su disco, ma deve rimanere nella memoria fisica purché sono assegnati PoolNonpagedBytes in Win32_PerfFormattedData_PerfOS_Memory viene calcolato in modo diverso rispetto alla proprietà PoolPagedBytes in Win32_PerfFormattedData_PerfProc_Process, pertanto potrebbe non corrispondere al totale di PoolPagedBytes per tutte le istanze di Win32_PerfFormattedData_PerfProc_Process. Questa proprietà mostra solo l'ultimo valore osservato; non è una media.

uint32 PoolPagedBytes; 

valore, in byte, nel pool di paging, un'area di memoria di sistema (memoria fisica utilizzata dal sistema operativo) per gli oggetti che possono essere scritti su disco quando non sono in uso. La proprietà PoolNonpagedBytes in Win32_PerfFormattedData_PerfOS_Memory viene calcolata in modo diverso rispetto alla proprietà PoolPagedBytes in Win32_PerfFormattedData_PerfProc_Process, pertanto potrebbe non corrispondere al totale di PoolPagedBytes per tutte le istanze di Win32_PerfFormattedData_PerfProc_Process. Questa proprietà mostra solo l'ultimo valore osservato; non è una media.

uint64 PrivateBytes; 

Valore corrente, in byte, assegnato a questo processo che non può essere condiviso con altri processi.

uint64 VirtualBytes; 

Dimensione corrente, in byte, dello spazio degli indirizzi virtuali utilizzato dal processo. L'uso dello spazio degli indirizzi virtuali non implica necessariamente l'uso corrispondente del disco o delle pagine di memoria principale. Lo spazio virtuale è finito e, usando troppo, il processo può limitare la sua capacità di caricare le librerie.

uint64 WorkingSet; 

Numero massimo, in byte, nel set di lavoro di questo processo in qualsiasi momento. Il working set è l'insieme di pagine di memoria toccate di recente dai thread nel processo. Se la memoria disponibile nel computer supera una soglia, le pagine vengono lasciate nel set di lavoro di un processo anche se non sono in uso. Quando la memoria libera scende al di sotto di una soglia, le pagine vengono ritagliate dai set di lavoro. Se sono richiesti, vengono quindi reimpostati di nuovo nel set di lavoro prima che lascino la memoria principale.

Attualmente sto utilizzando il campo WorkingSet per segnalare l'utilizzo della memoria del processo. Tuttavia ciò non è in linea con ciò che sta visualizzando Task Manager. Ho provato con PrivateBytes ma non è "corretto". Il processo monitorato dall'app è un processo .NET (se questo è importante) e viene segnalato dall'app per utilizzare almeno 100 MB di memoria in più rispetto a quello che Task Manager mostra contemporaneamente.

Quindi la domanda è qual è la "formula" per calcolare la migliore approssimazione dell'utilizzo della memoria del processo come mostrato dal Task Manager?

enter image description here

risposta

3

Win32_PerfFormattedData_PerfProc_Process è la classe giusta. La proprietà che tira da è WorkingSetPrivate. Nessuna formula/calcolo necessari.

Problemi correlati