Como calcular o uso de memória como o Gerenciador de Tarefas?
Ok, então estou usando o WMI (.net / C #) para coletar constantemente dados sobre um processo específico que está sendo executado na máquina. Recebo os dadosWin32_PerfFormattedData_PerfProc_Process classe. Essa classe tem muitas propriedades, mas as que nos interessam são as seguintes:
uint64 PageFileBytes;
Valor, em bytes, que esse processo usou no (s) arquivo (s) de paginação. Os arquivos de paginação armazenam páginas de memória usadas pelo processo que não estão contidas em outros arquivos. Os arquivos de paginação são compartilhados por todos os processos e a falta de espaço nos arquivos de paginação pode impedir que outros processos aloquem memória.
uint32 PoolNonpagedBytes;
Valor, em bytes, no pool não paginado, uma área da memória do sistema (memória física usada pelo sistema operacional) para objetos que não podem ser gravados no disco, mas devem permanecer na memória física enquanto estiverem alocados. O PoolNonpagedBytes no Win32_PerfFormattedData_PerfOS_Memory é calculado de maneira diferente da propriedade PoolPagedBytes no Win32_PerfFormattedData_PerfProc_Process, portanto, pode não ser igual ao total de PoolPagedBytes para todas as instâncias do Win32_PerfFormattedData_Perf. Esta propriedade exibe apenas o último valor observado; não é uma média.
uint32 PoolPagedBytes;
Valor, em bytes, no pool paginado, uma área da memória do sistema (memória física usada pelo sistema operacional) para objetos que podem ser gravados no disco quando não estão sendo usados. A propriedade PoolNonpagedBytes em Win32_PerfFormattedData_PerfOS_Memory é calculada de maneira diferente da propriedade PoolPagedBytes em Win32_PerfFormattedData_PerfProc_Process, portanto, pode não ser igual ao total de PoolPagedBytes para todas as instâncias de Win32_PerfFormattedData_Pocess. Esta propriedade exibe apenas o último valor observado; não é uma média.
uint64 PrivateBytes;
Valor atual, em bytes, que esse processo alocou e que não pode ser compartilhado com outros processos.
uint64 VirtualBytes;
Tamanho atual, em bytes, do espaço de endereço virtual que o processo está usando. O uso do espaço de endereço virtual não implica necessariamente o uso correspondente das páginas de disco ou de memória principal. O espaço virtual é finito e, usando muito, o processo pode limitar sua capacidade de carregar bibliotecas.
uint64 WorkingSet;
Número máximo, em bytes, no conjunto de trabalho desse processo a qualquer momento. O conjunto de trabalho é o conjunto de páginas de memória recentemente tocadas pelos threads no processo. Se a memória livre do computador estiver acima de um limite, as páginas serão deixadas no conjunto de trabalho de um processo, mesmo que não estejam em uso. Quando a memória livre cai abaixo de um limite, as páginas são cortadas dos conjuntos de trabalho. Se necessário, eles retornam ao software com falha de funcionamento antes de deixar a memória principal.
Atualmente, estou usando oWorkingSet
campo para relatar o uso da memória do processo. No entanto, isso não está alinhado com o que o Gerenciador de tarefas está mostrando. Eu tentei comPrivateBytes
mas isso também não é "correto". O processo que o aplicativo monitora é um processo .NET (se é que isso importa) e é relatado pelo aplicativo para usar pelo menos 100 MBs a mais de memória do que o Gerenciador de Tarefas está mostrando ao mesmo tempo.
Portanto, a pergunta é qual é a "fórmula" para calcular a melhor aproximação do uso da memória do processo, conforme mostrado pelo Gerenciador de Tarefas?