Process Stats: Comprendiendo el consumo de RAM de tu app

process stats

Android 4.4 KitKat introdujo un nuevo servicio llamado procstats que ofrece una mejor ayuda en cuanto a entender la manera en que una aplicación usa los recursos RAM de un equipo. Procstats hace posible ver cómo se comporta tu aplicación de manera paulatina, incluyendo la cantidad de tiempo que corre bajo nivel y la cantidad de memoria que usa durante el mismo. Te ayuda a encontrar rápidamente ineficiencias y mal comportamientos en tu aplicación que afecten el modo en que funciona, especialmente cuando corra en equipos de bajo nivel de RAM.

Puedes acceder a procstats usando el commando “adb shell”, pero por mera conveniencia existe además una nueva herramienta de desarrollo llamada Process Stats que provee una interfaz gráfica con los mismos datos. Puedes encontrar Process Stats en Configuración > Herramientas de desarrollo > Process Stats.

En este post vamos a ver la herramienta gráfica Process Stats, luego vamos a profundizar los detalles de datos de memoria detrás de ello, cómo se obtiene, y por qué es tan importante para ti que analices tu aplicación.

 

Observando todo el uso de la memoria del sistema y los procesos

process stats capturaCuando abres Process Stats, verás un sumario de condiciones y detalles de todo el sistema acerca de cómo los diferentes procesos usan memoria sobre el tiempo. La imagen de la derecha te muestra un ejemplo de lo que puedes ver en un equipo común.

En la cima de la pantalla podemos ver que:

  • Vemos los datos obtenidos entre las últimas ~3.5 horas.
  • Actualmente la RAM del equipo está en buena forma (“Device memory is currently normal”).
  • Durante todo ese tiempo el estado de la memoria ha estado en buenas condiciones (esto se muestra en la barra verde). Si de casualidad la memoria del equipo estuviese consumida, verías regiones en amarillo y/o en rojo en la parte izquierda de la barra representando la cantidad total de tiempo junto con la memoria baja.

 

Debajo de la barra verde, podemos ver una muestra de diferentes procesos corriendo bajo nivel, se muestra además la carga de memoria que le conllevan al sistema:

  • Los porcentajes en la derecha indican la cantidad de tiempo que cada proceso ha consumido corriendo durante la duración total.
  • Las barras azules indican la carga relativa de memoria de cada proceso (la carga de memoria es runtime*avg_pss, de la cual trataremos más adelante).
  • Algunas aplicaciones pueden ser listadas múltiples veces debido a que algunas usan más de un proceso (como es el caso de Google Play, que usa dos). La carga de memoria de estas aplicaciones es la suma de la carga de sus procesos individuales.

 

Analizando la memoria en procesos específicos.

El siguiente ejemplo muestra algunos datos interesantes: tenemos una aplicación de Reloj con un consumo de memoria mayor que Google Keyboard (Teclado) a pesar de llevar corriendo menos de la mitad del tiempo. Podemos ver más detalles de éstos procesos con tan solo tocarlos:

captura.55

Los detalles de estos dos procesos revelan que:

  • La razón por la que el proceso del Reloj ha estado corriendo durante todo ese tiempo es porque ha estado siendo usado como salva-pantallas cuando el equipo está en inactivo.
  • Aunque dicho proceso ha corrido por la mitad del tiempo que el Teclado, su uso de RAM fue significativamente más largo (casi 3 veces más), por lo cual sus números generales pesan más.

Esencialmente, procstats provee una medida de uso de memoria que se asimila a la de Almacenamiento o a la de Datos, mostrando cuánta RAM están usando las aplicaciones en el nivel bajo.  A diferencia del Almacenamiento o al de Datos, el uso de memoria es mucho más difícil de cuantificar y medir, y procstats tiene algunos trucos bajo la manga. Para ilustrar la complejidad de la medida del uso de memoria, documéntate acerca de task managers (administradores de tareas).

 

Entendiendo los administradores de tareas y su información de memoria.

Android tiene una larga historia con los administradores de tareas. Siempre ha soportado profundamente el multitasking (multi tarea), lo cual quiere decir que los más geeks van a querer tener alguna especie de interfaz de usuario para verlo y controlarlo a través de interfaces a las que nos acostumbramos con nuestra PCs. SIn embargo, el multitasking en Android es algo más complicado y fundamentalmente diferente respecto a los sistemas operativos de escritorio tradicionales. Esto impacta profundamente la manera en que se le pueda mostrar al usuario.

Gestión de procesos continuos y multitasking.

Para tener una noción de cuán diferente es el mantenimiento de procesos en Android, puedes observar la salida de un importantísimo servicio de sistema, el gestor de actividad (activity manager), con adb shell dumpsys activity. El siguiente ejemplo muestra una captura de los procesos actuales de la aplicación en Android 4.4, listándolos a partir del más importante al menos:

Hay algunos grupos de procesos importantes aquí -procesos persistentes del sistema, procesos en primer plano, procesos de segundo plano, y finalmente procesos de cache- donde la categoría de un proceso es extremadamente importante para poder conocer su impacto en el sistema.

Al mismo tiempo, los procesos en esta lista cambian todo el tiempo. Por ejemplo, en la captura de arriba podemos ver que “com.google.android.gm” es actualmente un proceso importante, ello se debe a que está haciendo una sincronización a bajo nivel, algo de lo que el usuario generalmente no se percataría o querría administrar.

 

Capturando el uso de RAM por proceso.

El uso tradicional de un administrador de tarea está cercanamente atado al uso de la RAM, y Android provee una herramienta llamada meminfo para observar una captura del uso de la RAM por proceso. Puedes acceder a éste con el comando adb shell dumpsys meminfo. A continuación tienes un ejemplo de dicha salida:

Ahora estamos mirando los mismos procesos de antes, una vez más organizados por importancia, sin embargo ahora están mostrados respecto al impacto de su uso de RAM.

Usualmente cuando se mide el uso de RAM en Android se hace con el indicador de Linux PSS (Proportional Set Size). Esta es la cantidad de RAM que se mapea actualmente dentro del proceso, calculada por la cantidad que comparte a través de los otros procesos. De manera tal que si tenemos una página de 4K de RAM mapeada en dos procesos, su importe PSS para cada proceso sería de 2K.

Lo bueno de usar PSS es que puedes agregar valores alrededor de todos los procesos para determinar el actual uso total de RAM. Esta característica se usa al final del reporte de meminfo para computar cuánta RAM está en uso (la cual viene en parte de todos los procesos no cacheados), contra cuánta queda “libre” (lo cual incluye procesos cacheados).

 

Interfaz del administrador de tareas basada en una captura de PSS

process stats app listDada la información que tenemos hasta ahora, podemos imaginar varías vías para presentar esto en alguna especie de interfaz de usuario de administrador de tareas. De hecho la interfaz que ves en Configuración > Aplicaciones > En Ejecución se deriva precisamente de esta información. Muestra todos los procesos de funcionamiento de los servicios (ajuste “svc” en la lista LRU) y en nombre del sistema (los procesos con una dependencia “<=Proc{489:system/1000}”), computando la RAM PSS para cada uno de éstos y muchos otros procesos que tengan dependencias.

El problema con la visualización del uso de la memoria en esta forma es que te da el estado instantáneo de las aplicaciones, sin contexto en el tiempo. En Android, los usuarios no controlan directamente la creación y eliminación de los procesos de aplicaciones -que se pueden mantener para uso futuro, eliminándose cuando el sistema decida, o que ejecuten en segundo plano sin que el usuario las inicie explícitamente. Así que mirando sólo al estado instantáneo de un uso de memoria, te estarías perdiendo una información importante acerca de lo que realmente está sucediendo en el tiempo.

Por ejemplo, en nuestro primer vistazo al estado del proceso, vemos el proceso com.google.android.apps.magazines corriendo por una sincronización, pero cuando miramos el uso de memoria RAM después de la sincronización, dejó de correr en segundo plano para comenzar a correr como un proceso en caché.

Para abordar este problema, la nueva herramienta procstats supervisa continuamente el estado de todos los procesos de aplicación en el tiempo, agregando esa información y recogiendo muestras PSS de esos procesos mientras tanto. Puedes ver los datos en bruto siendo recogidos por procstats con el comando adb shell dumpsys procstats.

 

Observando uso de memoria en el tiempo con procstats.

Ahora vamos a volver a procstats y echar un vistazo al contexto que proporciona al mostrar el uso de memoria en el tiempo. Podemos usar el comando adb shell dumpsys procstats –hours 3 para sacar información de memoria recogida en las últimas 3 horas.. Se trata de los mismos datos representados gráficamente en el primer ejemplo de Process Stats.

El resultado muestra todos los procesos que se han ejecutado en las últimas 3 horas, ordenados con los que se ejecutaron mayormente de primeros. Al igual que la representación gráfica inicial, ahora vemos claramente un gran grupo de procesos que se ejecutan todo el tiempo, y algunos que corren ocasionalmente – esto incluye el proceso de Revistas (Magazines), que podemos ver corriendo el 3,6% de las veces en las últimas 3 horas.

Los porcentajes indican cómo gran parte del tiempo total de cada proceso ha pasado en varios estados. Los números de la memoria te informan acerca de las muestras de memoria en dichos estados, tal y como se ve en minPss-avgPss-maxPss / minUss-avgUss-maxUss. La herramienta procstats posee además un número de opciones de líneas de comando para controlas su salida -usa adb shell dumpsys procstats -h para ver un listado de las opciones disponibles.

Comparando estos datos de procstats con la visualización de sus datos que anteriormente vimos, podemos ver que se está mostrando sólo los datos de proceso con capacidad de un subconjunto de estados: Imp. FG, Imp. bg, Service, Service Rs, y Receiver. Estas son las situaciones en las que el proceso se está ejecutando de forma activa en el fondo durante el tiempo que necesite para completar el trabajo que está haciendo. En términos de uso de memoria del dispositivo, estos son los estados de los procesos que tienden a causar más problemas: aplicaciones en ejecución en segundo plano cogiendo RAM de otras cosas.

 

Comenzando con procstats.

Como hemos podido ver, procstats es una herramienta invaluable para comprender mejor el comportamiento general de la memoria en los sistemas Android. En la medida en que desarrolles tus propias aplicaciones, asegúrate de usar procstats y las otras herramientas aquí mencionadas para ayudarte a entender mejor el comportamiento de tu aplicación, especialmente todo lo que hace en segundo plano y cuanta RAM usa durante ese período de tiempo.

Dejar un comentario

Your email address will not be published. Required fields are marked *