Использование памяти, доступной для высокоуровневых приложений
Внимание
Это документация по Azure Sphere (устаревшая версия). Служба Azure Sphere (устаревшая версия) выходит на пенсию 27 сентября 2027 г., и к этому времени пользователи должны перейти в Azure Sphere (интегрированная). Используйте селектор версий, расположенный над toC, чтобы просмотреть документацию по Azure Sphere (интегрированная).
В этом разделе описывается память, используемая высокоуровневыми приложениями. Дополнительные сведения о памяти, доступной для приложений, поддерживающих режим реального времени (RTApp), см. в статье Вопросы, связанные с управлением памятью и задержками.
Высокоуровневые приложения имеют доступ к следующим объемам памяти и хранилища:
- 256 КиБ ОЗУ на высокоуровневое ядро, полностью зарезервированные для использования высокоуровневым приложением. Для каждого канала общего буфера, через который передаются приложения высокого уровня и приложения RTApp, может быть выделено до 1 КиБ этого объема.
- 1 МиБ флэш-памяти только для чтения, которая распределена между высокоуровневыми ядрами и ядрами с поддержкой режима реального времени.
- Изменяемое хранилище (с поддержкой операций чтения и записи), которое сохраняется после перезагрузки устройства. Сведения об изменяемом хранилище см. в статье Использование хранилища в Azure Sphere.
Примечание.
Повторное обновление вспышки в конечном итоге носит его и делает его недействительным. Поэтому следует разработать код, чтобы избежать ненужных обновлений флэш-памяти. Например, если вы хотите сохранить состояние приложения перед выходом, чтобы можно было восстановить сохраненное состояние после перезапуска, попробуйте сохранить состояние приложения на вспышку только в том случае, если состояние изменилось.
Определение используемого объема флэш-памяти
Чтобы определить использование памяти флэш-памяти, рассмотрите только размер файла пакета образа, который включает метаданные изображения, манифест приложения и исполняемый образ. Вам не нужно учитывать хранилище, необходимое для предоставляемых корпорацией Майкрософт компонентов, таких как ОС Azure Sphere или службы времени выполнения и общие библиотеки, которые управляют периферийными устройствами и позволяют подключиться к Центр Интернета вещей Azure. Аналогичным образом, вам не нужно включать размер полной копии резервного копирования приложения или компонентов, которые обеспечивают отработку отказа или откат в случае повреждения или проблем с обновлениями по сети.
Но не забывайте, что во время разработки и отладки размер отладчика учитывается при применении этого ограничения. Отладчик автоматически добавляется и удаляется с помощью команд azsphere device enable-development и azsphere device enable-cloud-test соответственно. Размер отладчика, используемого пакетом SDK, можно найти, выполнив поиск gdbserver.imagepackage в папке DebugTools каталога установки пакета SDK Microsoft Azure Sphere.
Команда azsphere device sideload возвращает ошибку, если пакет образа приложения и отладчик (если присутствует) превышает общее ограничение 1 MiB. Команда azsphere image add --image, которая отправляет новый образ в клиент Azure Sphere, также возвращает ошибку, если пакет образа превышает 1 МиБ.
Ограничение ОЗУ 256 КиБ применяется только к приложению; Вам не нужно разрешать ОЗУ, используемую отладчиком. Дополнительная память зарезервирована для выделения ядра.
Доступные флэш-памяти и ОЗУ могут увеличиваться (но никогда не уменьшаться) для приложений, написанных для текущей микросхемы Azure Sphere (MT3620). Будущие микросхемы Azure Sphere могут иметь другие ограничения.
Условия нехватки памяти
Если приложение использует слишком много ОЗУ, ОС Azure Sphere завершает его сигналом SIGKILL. Например, в отладчике вы увидите следующее.
Child terminated with signal = 0x9 (SIGKILL)
Сигнал SIGKILL также возникает, если высокоуровневое приложение завершает работу после получения запроса SIGTERM. Дополнительные сведения см. в разделе "Жизненный цикл приложения ".
Чтобы избежать сбоев в приложении из-за отсутствия памяти, ознакомьтесь с рекомендациями по управлению использованием ОЗУ в высокоуровневых приложениях.
Определение использования ОЗУ приложения во время выполнения
Azure Sphere предоставляет несколько функций для получения сведений об использовании памяти во время выполнения. Их можно использовать для отслеживания использования памяти высокоуровневого приложения, что позволяет безопасно перезапустить приложение, если использование памяти превышает пороговое значение, указанное в пределах 256 КИБ. Доступные функции:
- Applications_GetTotalMemoryUsageInKB. Получение общего объема использования памяти в кибибайтах. Это общее использование физической памяти приложения в системе, включая выделение ядра (например, буферы для сокетов) от имени приложения или сервера отладки, возвращаемое как необработанное значение (в KiB).
- Applications_GetUserModeMemoryUsageInKB. Получение использования памяти в режиме пользователя в кибибайтах. Это объем физической памяти, используемой непосредственно приложением, память, используемая любыми библиотеками от его имени (также называемые выделениями анона ), и память, используемая сервером отладки, возвращаемая в качестве необработанного значения (в KiB).
- Applications_GetPeakUserModeMemoryUsageInKB. Получение пикового использования памяти в режиме пользователя в кибибайтах. Это максимальный объем памяти пользователя, используемой в текущем сеансе. При тестировании использования памяти приложения следует убедиться, что это значение никогда не превышает 256 КИБ. Это значение сбрасывается при перезапуске приложения или повторном развертывании. Используйте эту функцию, чтобы получить приблизительное представление о том, как близко приложение получает до рекомендуемого ограничения 256 КИБ.
Чтобы использовать эти функции в высокоуровневом приложении, включите файл заголовка application.h. Эти функции можно использовать во время разработки, чтобы получить представление об использовании общей памяти приложения, но их также можно использовать вместе с ведением журнала для сбора информации с устройств в поле. В фрагменте кода обнаружения и очистки памяти показано, как обнаруживать и корректно обрабатывать непредвиденное использование памяти.
Примечание.
Эти функции возвращают использование памяти, как показано в ОС. В настоящее время освобождение памяти приложением для выделения на кучи пользователя не сообщается этими функциями. Память будет возвращена в библиотеку malloc для дальнейшего использования, но статистика, сообщаемая ОС, остается неизменной, если память не была выделена и освобождена самой ОС. Примером будет выделение памяти для сокета. Таким образом, эти функции полезны для понимания худших сценариев, чтобы помочь приложению работать консервативно для максимальной надежности. Значения являются приблизительными и могут отличаться в разных версиях ОС.
Добавление отслеживания выделения памяти для кучи
Дополнительные сведения об использовании памяти можно получить, добавив отслеживание выделения памяти кучи, в котором показано, какие выделения пользователей и ядра выполняются статическими и динамически связанными библиотеками. Это обеспечивает более полное представление о том, где память используется приложением, чтобы помочь вам использовать ее наиболее эффективно. Эта функция, доступная с ос Azure Sphere версии 21.07 или более поздней и версиями среды выполнения приложений (ARV) 10 или более поздней, работает только на устройстве с поддержкой разработки и только в том случае, если приложение не работает под отладчиком.
Примечание.
Для правильной работы отслеживания выделения памяти кучи необходимо выполнить обе задачи конфигурации, описанные в этом разделе. Если это не удалось сделать, во время компиляции и кучи данные памяти не будут отображаться.
Чтобы включить отслеживание выделения памяти кучи, необходимо выполнить две действия.
Добавьте возможность HeapMemStats в файл app-manifest.json приложения:
"Capabilities": { "HeapMemStats": true },
Добавьте библиотеку libmalloc в пакет образа, добавив
DEBUG_LIB "libmalloc"
azsphere_target_add_image
команду в файл CMakeLists.txt приложения:azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc")
Внимание
Так как отслеживание выделения памяти кучи работает только на устройствах с поддержкой разработки, необходимо сделать следующее, чтобы удалить его из приложения, прежде чем создавать пакеты образов для развертывания:
- Удалите строку "HeapMemStats": true" из файла app-manifest.json приложения.
- Удалите
DEBUG_LIB "libmalloc"
изazsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc"
команды в файле CMakeLists.txt приложения.
Использование профилировщика производительности Visual Studio
При использовании Visual Studio можно использовать функцию профилировщика производительности для получения сведений об использовании памяти приложения. Руководство, использующее этот профилировщик, см. в разделе "Учебники/MemoryUsage".
Необходимые компоненты
- Пакет средств разработки Azure Sphere, подключенный к компьютеру под управлением Visual Studio с установленным пакетом SDK Для Azure Sphere. См. статью "Установка пакета SDK Azure Sphere для Windows".
- Устройство, подготовленное для разработки. См. статью azsphere device enable-development. Профилировщик производительности не вернет данные, если устройство не включено для разработки.
Запуск профилировщика использования памяти
Выберите "Отладить>профилировщик производительности" или нажмите клавиши ALT+F2, чтобы открыть окно запуска профилировщика производительности.
В разделе "Целевой объект анализа", если профилировщик устройств Azure Sphere не отображается, выберите "Выбрать целевой объект" и выберите "Профилировщик устройств Azure Sphere".
В разделе "Доступные средства", убедитесь, что используется память Azure Sphere, а затем нажмите кнопку "Пуск", чтобы открыть окно профилирования использования памяти и запустить профилировщик памяти.
Если вам нужно развернуть или перезапустить приложение, выберите "Начать отладку>без отладки" или нажмите клавиши CTRL+F5, чтобы развернуть приложение на устройстве.
Внимание
Чтобы получить точные сведения об использовании ОЗУ для приложения, важно [запустить приложение без отладки](buid-hl-app.md#build-and-deploy-the-application-in-visual-studio-без отладки). Запуск приложения под отладчиком приведет к задумке использования ОЗУ, так как память, потребляемая сервером отладки, будет включена в статистику использования ОЗУ.
Интерпретация данных профилировщика использования памяти
В окне профилирования использования памяти отображается следующее представление:
В центре представления граф физической памяти устройства Azure Sphere отображает три разных статистики использования ОЗУ (показана до ближайшего КИБ) в виде трех разных строк во время работы приложения:
- Всего: общее использование физической памяти приложения в системе, включая выделение ядра (например, буферы для сокетов) от имени приложения или сервера отладки.
- Пользователь: объем физической памяти, используемой непосредственно приложением, память, используемая любыми библиотеками от его имени (также называется выделением анона ), и память, используемая сервером отладки.
- Пиковый пользователь: максимальный объем памяти пользователя, используемой в текущем сеансе. При тестировании использования памяти приложения следует убедиться, что это значение никогда не превышает 256 КИБ. Дополнительная память зарезервирована для выделения ядра. Это значение сбрасывается при перезапуске приложения или повторном развертывании.
График также отображает вхождения события New Peak (представлен треугольником). Это событие происходит всякий раз, когда существует новый максимум для пикового использования памяти пользователя. Событие включено для специальных возможностей средства чтения с экрана.
Если вы включили отслеживание выделения памяти кучи и приложение не работает в отладчике, появится дополнительный график, показывающий статистику памяти кучи:
- Общая куча: общая память кучи, выделенная приложением или от имени приложения, включая статические и динамические библиотеки.
- Кучи общей библиотеки: выделение из динамически связанных библиотек, предоставляемых ОС Azure Sphere.
Над графами в представлении временной шкалы отображается время выполнения приложения, сопоставленное с данными на приведенном ниже графике. Используйте масштаб и увеличить масштаб, чтобы сосредоточиться на определенных периодах времени.
Под графами представление таблицы отображает ту же статистику и события памяти.
Совет
Чтобы скопировать данные из таблицы в буфер обмена, нажмите клавиши CTRL+A , чтобы выбрать все строки, а затем нажмите клавиши CTRL+C.
Первые два графа, показанные в этом разделе, были приняты во время выполнения этапа 1 руководства по использованию памяти, содержащего утечку памяти. Использование памяти поднимается монотонно в каждом графе, предоставляя визуальные доказательства утечки. При исправлении утечки, как и в руководстве по использованию памяти на этапе 2, граф поднимается и падает, так как память выделяется и освобождается.
Просмотр статистики по общему использованию памяти
Команда azsphere device app show-memory-stats возвращает статистику использования памяти по общему использованию памяти, использованию пользовательского режима и пикового использования пользовательского режима для приложений, работающих на подключенном устройстве. Устройство должно иметь возможность устройства appDevelopment , настроенную для выполнения этой команды.
Статистика использования ОЗУ, отображаемая во время выполнения приложения:
- Всего (ядро + режим пользователя): общее использование физической памяти приложения в системе, включая выделение ядра (например, буферы для сокетов) от имени приложения или сервера отладки.
- Режим пользователя: объем физической памяти, используемой непосредственно приложением, память, используемая любыми библиотеками от его имени (также называется выделением анона ), и память, используемая сервером отладки.
- Пиковый режим пользователя: максимальный объем памяти пользователя, используемой в текущем сеансе. При тестировании использования памяти приложения следует убедиться, что это значение никогда не превышает 256 КИБ. Дополнительная память зарезервирована для выделения ядра. Это значение сбрасывается при перезапуске приложения или повторном развертывании.
Если вы включили отслеживание выделения памяти кучи и приложение не работает в отладчике, вы увидите дополнительные строки статистики памяти кучи:
- Куча: приложения + статические библиотеки: выделение ядра и пользователей из кода и любых библиотек статической привязки к нему.
- Куча: <динамические> выделения библиотек: выделение отдельных динамически связанных библиотек, предоставляемых ОС Azure Sphere.
Непрерывный мониторинг использования памяти
Чтобы отслеживать использование памяти с течением времени, можно использовать сценарии для выполнения команды azsphere device app show-memory-stats в цикле, как описано в следующих примерах:
Командная строка Windows
С помощью блокнота или другого текстового редактора создайте файл скрипта пакетной службы memuse.bat со следующим содержимым:
@echo off
:loop
call azsphere device app show-memory-stats
choice /d y /t 1 > nul
goto loop
Запустите пакетный скрипт, введя его имя в командной строке (или полный путь к файлу, если он отсутствует в текущем каталоге):
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
-------------------------- -------------
Чтобы выйти из скрипта, введите CTRL+C в окне командной строки , а затем ответьте Y на запрос "Завершить пакетное задание?"
Windows PowerShell
while ($true) {
azsphere device app show-memory-stats
Start-Sleep -Seconds 1
}
Использование памяти и отладчик
При запуске приложения в отладчике сообщаемая статистика памяти также включает использование памяти процесса отладки сервера и другое дополнительное использование памяти, вызванное отладкой, например настройка точек останова. По этой причине при попытке сбора точной статистики памяти всегда следует запускать приложение без отладки.
Однако использование профилировщика использования памяти может оказаться полезным при запуске приложения с отладчиком. Установка точек останова и пошаговое прохождение по строкам кода при наблюдении относительных изменений в потреблении памяти может быть полезным способом выявления причин пиков использования памяти или утечки памяти.
При отладке в Visual Studio профилировщик производительности открывается автоматически, но не отображает отслеживание выделения памяти кучи.