Использование памяти в высокоуровневых приложениях

В этом разделе содержатся сведения об использовании памяти в высокоуровневых приложениях. Сведения о памяти, доступной для приложений с поддержкой реального времени (RTApps), см. в статье Рекомендации по управлению памятью и задержкой .

Высокоуровневые приложения имеют доступ к следующей памяти и хранилищу:

  • 256 КиБ ОЗУ на ядре высокого уровня, полностью зарезервированный для высокоуровневого использования приложений. Для каждого общего буферного канала, через который взаимодействуют высокоуровневые приложения и RTApp, может быть выделено до 1 КиБ этого пространства.
  • 1 МиБ доступной только для чтения флэш-памяти, которая совместно используется ядрами высокого уровня и ядрами в режиме реального времени.
  • Хранилище для чтения и записи (изменяемое), которое сохраняется при перезагрузке устройства. Сведения о изменяемом хранилище см. в статье Использование хранилища в Azure Sphere.

Примечание

Многократное обновление вспышки в конечном итоге изнашивает ее и делает ее недействительной. Поэтому следует разработать код, чтобы избежать ненужных обновлений флэш-памяти. Например, если вы хотите сохранить состояние приложения перед выходом, чтобы восстановить сохраненное состояние после перезапуска, рассмотрите возможность сохранения состояния приложения до вспышки только в том случае, если состояние изменилось.

Определение использования флэш-памяти

Чтобы определить использование флэш-памяти, рассмотрите только размер файла пакета образа, который включает метаданные образа, манифест приложения и исполняемый образ. Вам не нужно учитывать хранилище, необходимое для компонентов, предоставляемых корпорацией Майкрософт, таких как ОС Azure Sphere или службы времени выполнения и общие библиотеки, которые управляют периферийными устройствами и обеспечивают подключение к Центр Интернета вещей Azure. Кроме того, вам не нужно включать размер полной резервной копии приложения или компонентов, которые обеспечивают отработку отказа или откат в случае повреждения или проблем с обновлениями по сети.

Однако во время разработки и отладки размер отладчика учитывается с ограничением. Отладчик автоматически добавляется az sphere device enable-development и удаляется [az sphere device enable-cloud-test](.. /reference/az sphere-device.md). Размер отладчика, используемого пакетом SDK, можно найти, выполнив поиск gdbserver.imagepackage в папке DebugTools каталога установки пакета SDK Microsoft Azure Sphere.

Команда az sphere device sideload возвращает ошибку, если пакет образа приложения и отладчик (если они есть) превышают общее ограничение в 1 МиБ. Команда az sphere 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. Получение общего объема использования памяти в кибибайтах. Это общее использование физической памяти приложением в системе, включая выделение ядра (например, буферы для сокетов) от имени приложения или сервера отладки, возвращаемое в виде необработанного значения (в КиБ).
  • Applications_GetUserModeMemoryUsageInKB. Получение сведений об использовании памяти в пользовательском режиме в кибибайтах. Это объем физической памяти, используемый непосредственно приложением, память, используемая любыми библиотеками от его имени (также называемая выделением anon ), и память, используемая сервером отладки, возвращаемая в качестве необработанного значения (в КиБ).
  • Applications_GetPeakUserModeMemoryUsageInKB. Получение пикового использования памяти в пользовательском режиме в кибибайтах. Это максимальный объем памяти пользователя, используемый в текущем сеансе. При тестировании использования памяти приложением следует убедиться, что это значение не превышает 256 КиБ. Это значение сбрасывается при перезапуске или повторном развертывании приложения. Используйте эту функцию, чтобы получить приблизительное представление о приближении приложения к рекомендуемым ограничениям в 256 КиБ.

Чтобы использовать эти функции в приложении высокого уровня, добавьте файл заголовка applications.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, вы можете использовать функцию профилировщика производительности для получения сведений об использовании памяти приложения. Руководство по использованию этого профилировщика см. в разделе Tutorials/MemoryUsage.

Необходимые условия

  • Комплект средств разработки Azure Sphere, подключенный к компьютеру под управлением Visual Studio с установленным пакетом SDK для Azure Sphere. См. статью Установка пакета SDK Azure Sphere для Windows.
  • Устройство, подготовленное для разработки. См . раздел az sphere device enable-development. Профилировщик производительности не вернет данные, если ваше устройство не включено для разработки.

Запуск профилировщика использования памяти

  1. Выберите Отладка>профилировщика производительности или нажмите клавиши ALT+F2 , чтобы открыть окно запуска профилировщика производительности.

    Окно профилировщика производительности Visual Studio

  2. В разделе Целевой объект анализа, если Профилировщик устройств Azure Sphere не отображается, выберите Выбрать целевой объект и выберите Azure Sphere Device Profiler.

  3. В разделе Доступные инструменты убедитесь, что установлен флажок Использование памяти Azure Sphere , а затем нажмите кнопку Пуск , чтобы открыть окно профилирования использования памяти и запустить профилировщик памяти.

  4. Если необходимо развернуть или перезапустить приложение, выберите Отладка>Начать без отладки или нажмите клавиши CTRL+F5 , чтобы развернуть приложение на устройстве.

    Важно

    Чтобы получить точные сведения об использовании ОЗУ для приложения, важно [запустить приложение без отладки](buid-hl-app.md#build-and-deploy-the-application-in-visual-studio-without-debugging). Запуск приложения в отладчике приведет к завышению использования ОЗУ, так как память, потребляемая сервером отладки, будет включена в сообщаемую статистику использования ОЗУ.

Интерпретация данных профилировщика использования памяти

В окне профилирования использования памяти отображается следующее представление:

Окно профилировщика использования памяти Visual Studio

В центре представления граф физической памяти устройства Azure Sphere отображает три разных статистики использования ОЗУ (показанные в ближайшем КиБ) в виде трех разных строк во время работы приложения:

  • Общая: Общий объем использования физической памяти приложением в системе, включая выделение ядра (например, буферы для сокетов) от имени приложения или сервера отладки.
  • Пользователя: Объем физической памяти, используемой непосредственно приложением, память, используемая любыми библиотеками от его имени (также называется выделением anon ), и память, используемая сервером отладки.
  • Пиковый пользователь: Максимальный объем памяти пользователя, используемый в текущем сеансе. При тестировании использования памяти приложением следует убедиться, что это значение не превышает 256 КиБ. Дополнительная память зарезервирована для выделения ядра. Это значение сбрасывается при перезапуске или повторном развертывании приложения.

На графе также отображаются вхождения события New Peak (представленного треугольником). Это событие возникает всякий раз, когда существует новый максимум для пикового использования памяти пользователем. Это событие включено для специальных возможностей средства чтения с экрана.

Если вы включили отслеживание выделения памяти кучи и приложение не работает в отладчике, вы увидите дополнительный график со статистикой памяти кучи:

  • Общая куча: общий объем памяти кучи, выделенный приложением или от имени приложения, в том числе из статических и динамических библиотек.
  • Куча общей библиотеки: выделения из динамически связанных библиотек, предоставляемых ОС Azure Sphere.

Использование памяти кучи Visual Studio

Над графиками в представлении временная шкала отображается время выполнения приложения, сопоставленное с данными на приведенном ниже графике. Используйте функцию Увеличения и Уменьшения масштаба , чтобы сосредоточиться на определенных периодах времени.

Под графиками в табличном представлении отображаются одна и та же статистика памяти и события.

Совет

Чтобы скопировать данные из таблицы в буфер обмена, нажмите клавиши CTRL+A , чтобы выделить все строки, а затем нажмите клавиши CTRL+C.

Первые две диаграммы, показанные в этом разделе, были взяты во время выполнения этапа 1 руководства по использованию памяти, который содержит утечку памяти. Использование памяти монотонно поднимается на каждом графе, предоставляя визуальное свидетельство утечки. Когда утечка устранена, как на этапе 2 руководства по использованию памяти, граф увеличивается и падает по мере выделения и освобождения памяти.

Использование памяти кучи Visual Studio без утечки памяти

Просмотр статистики по общему использованию памяти

Команда az sphere device app show-memory-stats возвращает статистику использования памяти по общему объему использования памяти, использованию пользовательского режима и пиковой нагрузке в пользовательском режиме для приложений, работающих на подключенном устройстве. На устройстве должна быть настроена возможность устройства appDevelopment для выполнения этой команды.

Статистика использования ОЗУ, отображаемая во время работы приложения:

  • Всего (ядро + режим пользователя) — общее использование физической памяти приложением в системе, включая выделение ядра (например, буферов для сокетов) от имени приложения или сервера отладки.
  • Пользовательский режим. Объем физической памяти, используемой непосредственно приложением, память, используемая любыми библиотеками от его имени (также называется выделением anon ), и память, используемая сервером отладки.
  • Пиковой режим пользователя. Максимальный объем памяти пользователя, используемый в текущем сеансе. При тестировании использования памяти приложением следует убедиться, что это значение не превышает 256 КиБ. Дополнительная память зарезервирована для выделения ядра. Это значение сбрасывается при перезапуске или повторном развертывании приложения.

Если вы включили отслеживание выделения памяти кучи и приложение не работает в отладчике, вы увидите дополнительные строки статистики памяти кучи:

  • Куча: приложения + статические библиотеки: выделение ядра и пользователей из кода и любых библиотек, статически связанных с ним.
  • Куча: <динамическое> выделение библиотек. Выделения из отдельных динамически связанных библиотек, предоставляемых ОС Azure Sphere.

Непрерывный мониторинг использования памяти

Для отслеживания использования памяти с течением времени можно использовать скрипты для запуска [az sphere device app show-memory-stats](.. Команда /reference/az sphere-device.md) в цикле, как описано в следующих примерах:

Командная строка Windows

С помощью Блокнота или другого текстового редактора создайте пакетный файл скрипта memuse.bat со следующим содержимым:

@echo off

:loop
call az sphere 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) {
    az sphere device app show-memory-stats
    Start-Sleep -Seconds 1
}

Использование памяти и отладчик

При запуске приложения в отладчике сообщаемая статистика памяти также включает использование памяти серверным процессом отладки и другое дополнительное использование памяти, вызванное отладкой, например задание точек останова. По этой причине всегда следует запускать приложение без отладки при попытке собрать точную статистику памяти.

Однако использование профилировщика использования памяти может быть полезно, если вы запускаете приложение с помощью отладчика. Установка точек останова и пошаговое выполнение строк кода при наблюдении относительных изменений в потреблении памяти может быть полезным методом для выявления причин пиков использования памяти или утечек памяти.

При отладке в Visual Studio профилировщик производительности открывается автоматически, но не отображает отслеживание выделения памяти кучи.