¿Cómo calcular el uso de memoria como lo hace el Administrador de tareas?
Ok, estoy usando WMI (.net / C #) para recopilar constantemente datos sobre un proceso específico que se ejecuta en la máquina. Obtengo los datos a través deWin32_PerfFormattedData_PerfProc_Process clase. Esa clase tiene muchas propiedades, pero las que nos interesan son las siguientes:
uint64 PageFileBytes;
Valor, en bytes, que este proceso ha utilizado en los archivos de paginación. Los archivos de paginación almacenan páginas de memoria utilizadas por el proceso que no están contenidas en otros archivos. Todos los procesos comparten los archivos de paginación y la falta de espacio en los archivos de paginación puede evitar que otros procesos asignen memoria.
uint32 PoolNonpagedBytes;
Valor, en bytes, en el grupo no paginado, un área de memoria del sistema (memoria física utilizada por el sistema operativo) para objetos que no se pueden escribir en el disco, pero que deben permanecer en la memoria física mientras estén asignados. PoolNonpagedBytes en Win32_PerfFormattedData_PerfOS_Memory se calcula de manera diferente que la propiedad PoolPagedBytes en Win32_PerfFormattedData_PerfProc_Process, por lo que podría no ser igual al total de PoolPagedBytes para todas las instancias de Win32_PerfFormatProDac_PerfFormattedData_. Esta propiedad muestra solo el último valor observado; No es un promedio.
uint32 PoolPagedBytes;
Valor, en bytes, en el grupo paginado, un área de la memoria del sistema (memoria física utilizada por el sistema operativo) para los objetos que se pueden escribir en el disco cuando no se están utilizando. La propiedad PoolNonpagedBytes en Win32_PerfFormattedData_PerfOS_Memory se calcula de manera diferente que la propiedad PoolPagedBytes en Win32_PerfFormattedData_PerfProc_Process, por lo que podría no ser igual al total de PoolPagedBytes para todas las instancias de Win32_PerfFormatProc.Data. Esta propiedad muestra solo el último valor observado; No es un promedio.
uint64 PrivateBytes;
Valor actual, en bytes, que este proceso ha asignado que no se puede compartir con otros procesos.
uint64 VirtualBytes;
Tamaño actual, en bytes, del espacio de direcciones virtuales que utiliza el proceso. El uso del espacio de direcciones virtuales no implica necesariamente el uso correspondiente de las páginas del disco o de la memoria principal. El espacio virtual es finito y, al usar demasiado, el proceso puede limitar su capacidad de cargar bibliotecas.
uint64 WorkingSet;
Número máximo, en bytes, en el conjunto de trabajo de este proceso en cualquier momento. El conjunto de trabajo es el conjunto de páginas de memoria tocadas recientemente por los hilos en el proceso. Si la memoria libre en la computadora está por encima de un umbral, las páginas se dejan en el conjunto de trabajo de un proceso, incluso si no están en uso. Cuando la memoria libre cae por debajo de un umbral, las páginas se recortan de los conjuntos de trabajo. Si son necesarios, se vuelven a colocar en la falla suave en el conjunto de trabajo antes de dejar la memoria principal.
Actualmente estoy usando elWorkingSet
campo para informar el uso de memoria del proceso. Sin embargo, eso no se alinea con lo que muestra el Administrador de tareas. Lo intenté conPrivateBytes
pero eso tampoco es "correcto". El proceso que la aplicación monitorea es un proceso .NET (si eso es importante) y la aplicación informa que usa al menos 100 MB de memoria más de lo que muestra el Administrador de tareas al mismo tiempo.
Entonces, la pregunta es ¿cuál es la "fórmula" para calcular la mejor aproximación del uso de memoria del proceso como lo muestra el Administrador de tareas?