psutil - python memory usage
Acceso al uso de CPU/RAM(como con el Administrador de tareas, pero a través de API). (3)
En lugar de llamar directamente a la API de Windows, puede usar la biblioteca psutil
, que es una biblioteca multiplataforma que proporciona mucha información sobre los procesos. Funciona en Windows, Linux, Mac OS, BSD y Sun Solaris, y funciona con python de 2.4 a 3.4 tanto en 32 como en 64 bits.
En particular, su clase Process
tiene los siguientes métodos interesantes:
-
cpu_times
: tiempos de usuario y sistema pasados por el proceso desde su inicio. -
cpu_percent
: porcentaje de utilización de la CPU desde la última llamada o en el intervalo dado -
memory_info
: información sobre Ram y el uso de la memoria virtual. NOTA : la documentación establece explícitamente que estos son los que muestrataskmgr.exe
por lo que se ve exactamente lo que quiere. -
memory_info_ex
: información de memoria extendida. -
memory_percent
: porcentaje de memoria utilizada por el proceso.
Para iterar sobre todos los procesos (para encontrar la mayor cantidad de CPU / memoria hambrienta, por ejemplo), puede simplemente iterar sobre process_iter
.
Aquí hay una implementación simple de lo que quería lograr:
import psutil
def most_intensive_process():
return max(psutil.process_iter(), key=lambda x: x.cpu_percent(0))
def most_RAM_usage():
return max(psutil.process_iter(), key=lambda x: x.memory_info()[0])
x = most_intensive_process()
y = most_RAM_usage()
print(x.name)
print(y.name)
Ejecución de muestra en mi sistema:
In [23]: def most_intensive_process():
...: # psutil < 2.x has get_something style methods...
...: return max(psutil.process_iter(), key=lambda x: x.get_cpu_percent(0))
...:
...: def most_RAM_usage():
...: return max(psutil.process_iter(), key=lambda x: x.get_memory_info()[0])
In [24]: x = most_intensive_process()
...: y = most_RAM_usage()
...:
In [25]: print(x.name, y.name)
firefox firefox
¿Hay alguna forma específica de acceder a la información del "administrador de tareas" con la API de Windows? He investigado un poco sobre el tema, pero parece que no puedo encontrar una llamada API que me diga:
- El uso de CPU / RAM de un proceso determinado
- El proceso que usa la mayor cantidad de CPU / RAM
¿Hay alguna manera de acceder a esa información a través de Python o C ++ (básicamente, a través de la API de Windows)?
Esto es lo que esencialmente trato de hacer (en pseudo código):
app x = winapi.most_intensive_process
app y = winapi.most_RAM_usage
print x.name
print y.name
Puede recuperar información sobre el uso de RAM con las funciones de PSAPI, especialmente EnumProcesses
para encontrar todos los procesos en el sistema, y GetProcessMemoryInfo
para obtener información sobre el uso de la memoria de cada proceso.
Puede recuperar el uso de CPU para cada proceso con GetProcessTimes
. Esto no siempre es perfectamente exacto, pero creo que el Administrador de tareas produce resultados que son inexactos de la misma manera bajo las mismas circunstancias.
En caso de que lo desee, la información sobre el uso de la memoria por parte del sistema en su conjunto está disponible a través de GetPerformanceInfo
.
Puede usar la siguiente API de Windows para recuperar varios contadores de proceso en el programa C / C ++ .
Recupera información sobre el uso de la memoria del proceso especificado.
BOOL WINAPI GetProcessMemoryInfo(
_In_ HANDLE Process,
_Out_ PPROCESS_MEMORY_COUNTERS ppsmemCounters,
_In_ DWORD cb
);
Hay un ejemplo completo en MSDN, que explica cómo se puede usar para recuperar dicha información para su proceso.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682050%28v=vs.85%29.aspx
Usted ha mencionado que desea obtener la información de forma continua (con un intervalo de tiempo como lo hace el administrador de tareas). Para lograr esto, es posible que desee escribir la lógica completa (mencionada en MSDN) dentro de una función y llamarla después de un retraso ( Sleep (1 segundo)) . De esta forma, debería poder obtener toda esta información de su programa hasta que se ejecute .