Uso de la memoria en aplicaciones de alto nivel
Importante
Esta es la documentación de Azure Sphere (heredado). Azure Sphere (heredado) se retira el 27 de septiembre de 2027 y los usuarios deben migrar a Azure Sphere (integrado) en este momento. Use el selector de versiones situado encima de la TOC para ver la documentación de Azure Sphere (integrado).
En este tema se proporcionan detalles sobre el uso de memoria en aplicaciones de alto nivel. Consulte Administración de memoria y consideraciones de latencia para obtener información acerca de la memoria disponible para las aplicaciones con respuesta en tiempo real (RTApps).
Las aplicaciones de alto nivel tienen acceso a la memoria y el almacenamiento siguientes:
- 256 KiB DE RAM en el núcleo de alto nivel, reservada completamente para el uso de aplicaciones de alto nivel. Se puede asignar hasta 1 KiB de este espacio a cada canal de búfer compartido a través del cual se comunican las aplicaciones de alto nivel y RTApps.
- Memoria flash de solo lectura de 1 MiB, que se comparte entre los núcleos de alto nivel y en tiempo real.
- Almacenamiento (mutable) de lectura y escritura, que se conserva cuando un dispositivo se reinicia. Para más información acerca de almacenamiento mutable, consulte Uso del almacenamiento en Azure Sphere.
Nota:
Al actualizar repetidamente el flash, finalmente se usa y lo hace no válido. Por lo tanto, debe diseñar el código para evitar actualizaciones innecesarias del flash. Por ejemplo, si desea guardar el estado de la aplicación antes de salir para poder recuperar el estado guardado después de un reinicio, considere la posibilidad de guardar el estado de la aplicación en el flash solo si el estado ha cambiado.
Determinación del uso de memoria flash
Para determinar el uso de memoria flash, tenga en cuenta solo el tamaño del archivo de paquete de imágenes que incluye los metadatos de la imagen, el manifiesto de aplicación y la imagen ejecutable. No es necesario tener en cuenta el almacenamiento que requieren los componentes proporcionados por Microsoft, como el sistema operativo Azure Sphere o los servicios en tiempo de ejecución y las bibliotecas compartidas que controlan periféricos y habilitan la conexión a una instancia de Azure IoT Hub. Del mismo modo, no es necesario incluir el tamaño de una copia de seguridad completa de la aplicación o los componentes que habilitan la conmutación por error o la reversión en caso de daños o problemas con actualizaciones por vía inalámbrica.
Sin embargo, durante el desarrollo y la depuración, el tamaño del depurador se tienen en cuenta en el límite. El depurador se agrega automáticamente mediante azsphere device enable-development y se quita con azsphere device enable-cloud-test. Para encontrar el tamaño del depurador usado por el SDK, busque gdbserver.imagepackage en la carpeta DepurarTools del directorio de instalación del SDK de Microsoft Azure Sphere.
El comando azsphere device sideload devuelve un error si el paquete de imagen de aplicación y el depurador (si están presentes) superan el límite total de 1 MiB. El comando azsphere image add --image que carga una nueva imagen en el inquilino de Azure Sphere también devuelve un error si el paquete de imágenes supera 1 MiB.
El límite de RAM de 256 KiB se aplica solo a la aplicación; No es necesario permitir la RAM usada por el depurador. Se reserva memoria adicional para las asignaciones de kernel.
El flash disponible y la RAM pueden aumentar (pero nunca disminuirán) para las aplicaciones escritas para el chip actual de Azure Sphere (MT3620). Los futuros chips de Azure Sphere pueden tener límites diferentes.
Condiciones de memoria insuficiente
Si la aplicación usa demasiada RAM, el sistema operativo de Azure Sphere lo termina con una señal SIGKILL. Por ejemplo, en el depurador verá lo siguiente:
Child terminated with signal = 0x9 (SIGKILL)
La señal SIGKILL también se produce si una aplicación de alto nivel no puede salir después de recibir la solicitud SIGTERM. Consulte Ciclo de vida de una aplicación para obtener más información.
Para ayudar a evitar bloqueos en la aplicación debido a una condición de memoria insuficiente, consulte los procedimientos recomendados para administrar el uso de RAM en aplicaciones de alto nivel.
Determinación del uso de RAM de la aplicación en tiempo de ejecución
Azure Sphere proporciona varias funciones para obtener información de uso de memoria en tiempo de ejecución. Puede usarlos para supervisar el uso de memoria de la aplicación de alto nivel, lo que le permite reiniciar la aplicación de forma segura si el uso de memoria supera un umbral especificado dentro del límite de 256 KiB. Las funciones disponibles son:
- Applications_GetTotalMemoryUsageInKB: obtener el uso total de memoria en kibibytes. Este es el uso total de memoria física de la aplicación en el sistema, incluidas las asignaciones de kernel (como los búferes para sockets) en nombre de la aplicación o el servidor de depuración, devueltos como un valor sin formato (en KiB).
- Applications_GetUserModeMemoryUsageInKB: obtener el uso de memoria en modo de usuario en kibibytes. Esta es la cantidad de memoria física que usa la aplicación directamente, la memoria que usan las bibliotecas en su nombre (también denominadas asignaciones anon ) y la memoria usada por el servidor de depuración, devuelta como un valor sin formato (en KiB).
- Applications_GetPeakUserModeMemoryUsageInKB: obtener el uso máximo de memoria del modo de usuario en kibibytes. Esta es la cantidad máxima de memoria de usuario usada en la sesión actual. Al probar el uso de memoria de la aplicación, debe asegurarse de que este valor nunca supera los 256 KiB. Este valor se restablece siempre que la aplicación se reinicie o se vuelva a implementar. Use esta función para obtener un vistazo aproximado a la proximidad de la aplicación al límite recomendado de 256 KiB.
Para usar estas funciones en la aplicación de alto nivel, incluya el archivo de encabezado applications.h. Puede usar estas funciones durante el desarrollo para obtener una idea del uso general de memoria de la aplicación, pero también puede usarlos junto con el registro para capturar información de los dispositivos en el campo. El fragmento de código detección y limpieza de memoria excesiva muestra cómo detectar y controlar correctamente el uso inesperado de memoria.
Nota:
Estas funciones devuelven el uso de memoria tal como lo ve el sistema operativo. Actualmente, estas funciones no notifican la liberación de memoria por parte de una aplicación para las asignaciones en el montón de usuarios. La memoria se devolverá a la biblioteca malloc para su uso futuro, pero las estadísticas notificadas por el sistema operativo permanecen sin cambios a menos que el sistema operativo haya asignado y liberado la memoria. Un ejemplo sería asignar memoria para un socket. Por lo tanto, estas funciones son útiles para comprender los escenarios de peor caso para ayudar a la aplicación a funcionar de forma conservadora para lograr la máxima confiabilidad. Los valores son aproximados y pueden variar en todas las versiones del sistema operativo.
Incorporación del seguimiento de la asignación de memoria de la pila
Puede obtener información adicional de uso de memoria agregando seguimiento de asignación de memoria del montón, que muestra qué asignaciones de usuario y kernel se realizan mediante bibliotecas estáticas y vinculadas dinámicamente. Esto proporciona una imagen más completa de dónde usa la aplicación la memoria para ayudarle a usarlo de forma más eficaz. Esta característica, disponible con el sistema operativo Azure Sphere versión 21.07 o posterior y la versión en tiempo de ejecución de la aplicación (ARV) 10 o posterior, solo funciona en un dispositivo habilitado para desarrollo y solo cuando la aplicación no se ejecuta en el depurador.
Nota:
Debe completar las tareas de configuración descritas en esta sección para que el seguimiento de asignación de memoria del montón funcione correctamente. Si no lo hace, no se mostrará una advertencia durante la compilación y no se mostrará la información de memoria del montón.
Para habilitar el seguimiento de asignación de memoria del montón, debe hacer dos cosas:
Agregue la funcionalidad HeapMemStats al archivo app-manifest.json de la aplicación:
"Capabilities": { "HeapMemStats": true },
Agregue la biblioteca libmalloc al paquete de imágenes agregando
DEBUG_LIB "libmalloc"
al comando en elazsphere_target_add_image
archivo CMakeLists.txt de la aplicación:azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc")
Importante
Dado que el seguimiento de la asignación de memoria del montón solo funciona en dispositivos habilitados para el desarrollo, debe hacer lo siguiente para quitarlo de la aplicación antes de compilar paquetes de imágenes para la implementación:
- Elimine la línea ""HeapMemStats": true" del archivo app-manifest.json de la aplicación.
- Quite
DEBUG_LIB "libmalloc"
delazsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc"
comando del archivo CMakeLists.txt de la aplicación.
Uso del generador de perfiles de rendimiento de Visual Studio
Si usa Visual Studio, puede usar su característica de generador de perfiles de rendimiento para obtener información sobre el uso de memoria de la aplicación. Para ver un tutorial que use este generador de perfiles, consulte Tutoriales/MemoryUsage.
Requisitos previos
- Un kit de desarrollo de Azure Sphere conectado al equipo que ejecuta Visual Studio con el SDK de Azure Sphere instalado. Consulte Instalación del SDK de Azure Sphere para Windows.
- Un dispositivo preparado para el desarrollo. Consulte azsphere device enable-development. El generador de perfiles de rendimiento no devolverá datos si el dispositivo no está habilitado para el desarrollo.
Iniciar el generador de perfiles de uso de memoria
Seleccione Depurar>generador de perfiles de rendimiento o presione Alt+F2 para abrir la ventana de inicio del generador de perfiles de rendimiento.
En Destino de análisis, si El generador de perfiles de dispositivo de Azure Sphere no está visible, seleccione Elegir destino y seleccione Generador de perfiles de dispositivo de Azure Sphere.
En Herramientas disponibles, asegúrese de que el uso de memoria de Azure Sphere esté activado y, después, seleccione Iniciar para abrir la ventana de generación de perfiles de uso de memoria e iniciar el generador de perfiles de memoria.
Si necesita implementar o reiniciar la aplicación, seleccione Depurar Iniciar sin depurar> o presione Ctrl+F5 para implementar la aplicación en el dispositivo.
Importante
Para obtener información precisa de uso de RAM para la aplicación, es importante que [inicie la aplicación sin depurar](buid-hl-app.md#build-and-deploy-the-application-in- visual-studio-without-debugging). La ejecución de la aplicación en el depurador dará lugar a un uso de RAM inflado, ya que la memoria consumida por el servidor de depuración se incluirá en las estadísticas de uso de RAM notificadas.
Interpretación de los datos del generador de perfiles de uso de memoria
La ventana de generación de perfiles de uso de memoria muestra una vista similar a la siguiente:
En el centro de la vista, un gráfico de memoria física del dispositivo de Azure Sphere traza tres estadísticas de uso de RAM diferentes (que se muestran en el KiB más cercano) como tres líneas diferentes mientras se ejecuta la aplicación:
- Total: el uso total de memoria física de la aplicación en el sistema, incluidas las asignaciones de kernel (como búferes para sockets) en nombre de la aplicación o el servidor de depuración.
- Usuario: la cantidad de memoria física usada directamente por la aplicación, la memoria que usan las bibliotecas en su nombre (también denominadas asignaciones anon ) y la memoria usada por el servidor de depuración.
- Usuario máximo: la cantidad máxima de memoria de usuario usada en la sesión actual. Al probar el uso de memoria de la aplicación, debe asegurarse de que este valor nunca supera los 256 KiB. Se reserva memoria adicional para las asignaciones de kernel. Este valor se restablece siempre que la aplicación se reinicie o se vuelva a implementar.
El gráfico también traza las apariciones del evento New Peak (representado por un triángulo). Este evento se produce siempre que haya un nuevo máximo para el uso máximo de memoria del usuario. El evento está habilitado para la accesibilidad del lector de pantalla.
Si ha habilitado el seguimiento de asignación de memoria del montón y la aplicación no se está ejecutando en el depurador, verá un gráfico adicional que muestra estadísticas de memoria del montón:
- Montón total: memoria total del montón asignada por o en nombre de la aplicación, incluidas las bibliotecas estáticas y dinámicas.
- Montón de bibliotecas compartidas: asignaciones de bibliotecas vinculadas dinámicamente proporcionadas por el sistema operativo Azure Sphere.
Encima de los gráficos, una vista de escala de tiempo muestra el tiempo de ejecución de la aplicación, correlacionado con los datos del gráfico siguiente. Use Acercar y alejar para centrarse en períodos de tiempo específicos.
Debajo de los gráficos, una vista de tabla muestra las mismas estadísticas y eventos de memoria.
Sugerencia
Para copiar datos de la tabla en el Portapapeles, presione Ctrl+A para seleccionar todas las filas y, a continuación, presione Ctrl+C.
Los dos primeros gráficos que se muestran en esta sección se tomaron al ejecutar la fase 1 del tutorial Uso de memoria, que contiene una pérdida de memoria. El uso de memoria sube de forma monotónica en cada gráfico, lo que proporciona evidencia visual para la pérdida. Cuando se fija la fuga, como en la fase 2 del tutorial Uso de memoria, el gráfico aumenta y cae a medida que se asigna y desasigna la memoria.
Visualización de estadísticas sobre el uso total de memoria
El comando azsphere device app show-memory-stats devuelve estadísticas de uso de memoria sobre el uso total de memoria, el uso del modo de usuario y el uso máximo del modo de usuario para las aplicaciones que se ejecutan en un dispositivo conectado. El dispositivo debe tener configurada la funcionalidad del dispositivo appDevelopment para ejecutar este comando.
Las estadísticas de uso de RAM que se muestran mientras se ejecuta la aplicación son:
- Total (Kernel + Modo de usuario): el uso total de memoria física de la aplicación en el sistema, incluidas las asignaciones de kernel (como búferes para sockets) en nombre de la aplicación o el servidor de depuración.
- Modo de usuario: la cantidad de memoria física usada directamente por la aplicación, la memoria que usan las bibliotecas en su nombre (también denominadas asignaciones anon ) y la memoria usada por el servidor de depuración.
- Modo de usuario máximo: la cantidad máxima de memoria de usuario usada en la sesión actual. Al probar el uso de memoria de la aplicación, debe asegurarse de que este valor nunca supera los 256 KiB. Se reserva memoria adicional para las asignaciones de kernel. Este valor se restablece siempre que la aplicación se reinicie o se vuelva a implementar.
Si ha habilitado el seguimiento de asignación de memoria del montón y la aplicación no se está ejecutando en el depurador, verá líneas adicionales de estadísticas de memoria del montón:
- Montón: App + Static Libraries: las asignaciones de kernel y usuario del código y las bibliotecas vinculadas estáticamente a él.
- Montón: <asignaciones de bibliotecas dinámicas: asignaciones de bibliotecas individuales vinculadas> dinámicamente proporcionadas por el sistema operativo Azure Sphere.
Supervisión continua del uso de memoria
Para supervisar el uso de memoria con el tiempo, puede usar scripts para ejecutar el comando azsphere device app show-memory-stats en un bucle, tal como se describe en los ejemplos siguientes:
Símbolo del sistema de Windows
Con el Bloc de notas u otro editor de texto, cree un archivo de script por lotes memuse.bat con el siguiente contenido:
@echo off
:loop
call azsphere device app show-memory-stats
choice /d y /t 1 > nul
goto loop
Ejecute el script por lotes escribiendo su nombre en el símbolo del sistema (o la ruta de acceso completa al archivo, si no está en el directorio actual):
C:\Users\username> memuse.bat
-------------------------- -------------
Name Usage (bytes)
========================================
Total (Kernel + User Mode) 65536
-------------------------- -------------
User Mode 36864
-------------------------- -------------
Peak User Mode 36864
-------------------------- -------------
-------------------------- -------------
Name Usage (bytes)
========================================
Total (Kernel + User Mode) 65536
-------------------------- -------------
User Mode 36864
-------------------------- -------------
Peak User Mode 36864
-------------------------- -------------
Para salir del script, escriba Ctrl+C en la ventana del símbolo del sistema y, a continuación, responda a Y al mensaje "Finalizar trabajo por lotes?" .
Windows PowerShell
while ($true) {
azsphere device app show-memory-stats
Start-Sleep -Seconds 1
}
Uso de memoria y el depurador
Al ejecutar la aplicación en el depurador, las estadísticas de memoria notificadas también incluyen el uso de memoria del proceso del servidor de depuración y otro uso de memoria adicional causado por la depuración, como establecer puntos de interrupción. Por este motivo, siempre debes ejecutar la aplicación sin depurar al intentar recopilar estadísticas de memoria precisas.
Sin embargo, el uso del generador de perfiles de uso de memoria puede ser útil si ejecuta la aplicación con el depurador. Establecer puntos de interrupción y recorrer líneas de código mientras observa cambios relativos en el consumo de memoria puede ser una técnica útil para identificar las causas de picos de uso de memoria o pérdidas de memoria.
Al depurar en Visual Studio, el Generador de perfiles de rendimiento se abre automáticamente, pero no muestra el seguimiento de asignación de memoria del montón.