Evgenii Legotckoi
Evgenii Legotckoi3 августа 2018 г. 4:05

Профилирование использования памяти в Linux с помощью Qt Creator 4.7

Анализатор производительности

Вы могли слышать об Анализаторе Производительности (названным “CPU Usage Analyzer” (Анализатор использования центрального процессора (ЦП)) в Qt Creator 4.6 и ранее). Речь идет о профилировании приложений с использованием превосходного инструмента «perf» в Linux. Вы можете использовать его локально в Linux – базовой настольной системе или на разных встраиваемых устройствах. «perf» может записывать различные события, которые возникают в вашем приложении. К ним относятся ошибки (потери) в кеше, загрузки памяти, переключатели контекста или одно из самых распространенных, циклы CPU, которые периодически записывают образец стека после прохождения ряда циклов CPU. Полученный профиль показывает, какие функции в вашем приложении занимают большинство циклов процессора (CPU). Это самый видный пример использования Анализатора Производительности, во всяком случае, до сих пор.


Создание точек трассировки

С Qt Creator 4.7 вы также можете записывать события для точек трассировки, и если ваши точки трассировки соответствуют определенному условию присвоения имен, Qt Creator будет знать, что они означают распределение ресурсов или освобождения этих ресурсов. Поэтому, устанавливая точки трассировки на malloc, free и friends, вы можете отслеживать ваши приложения множеством способов. Чтобы помочь вам настроить точки трассировки для этого варианта использования, Qt Creator упаковывает скрипт оболочки (сценарий командного процессора), который вы можете выполнить, и запрашивает его запуск. Сначала откройте свой проект и выберите конфигурацию запуска, которую вы хотите изучить. Затем просто выберите кнопку «Создать точки трассировки ...» в строке заголовка анализатора, и вы получите:

Как это работает?

Для того чтобы непривилегированные пользователи могли использовать точки трассировки, скрипт должен сделать ядро отладки и трассировки файловых систем доступными для всех пользователей системы. Вы должны делать это только в контролируемых средах. Скрипт обычно работает для 32-битных ARM-систем и 64-битных x86-систем. 64-битные ARM-системы могут принимать точки трассировки, только если вы используете ядро Linux версии 4.10 или выше. Чтобы установить точки трассировки на 32-битных системах x86, вам нужно иметь символы отладки для вашей стандартной С библиотеки. Скрипт попытается создать точки трассировки для любого двоичного (бинарного) кода, который называется libc.so.6, находящегося в /lib. Если у вас установлена 64-разрядная система с дополнительными 32-разрядными библиотеками, она попытается создать точки трассировки для обеих подструктур. Это может быть успешным только для одной из них. Это не проблема, если ваше приложение нацелено на подструктуру, для которой скрипту удалось установить точки трассировки.

Поиск и устранение неполадок

Если скрипт трассировки точек выходит завершается с ошибкой, вы можете проверить, что ваше ядро было скомпилировано с включенной опцией CONFIG_UPROBE_EVENT. Без этой опции ядро не поддерживает точки трассировки пользователя. Все 32-битные ARM-изображения, поставляемые с Qt для создания устройств (Device Creation), имеют эту опцию с версии 5.11. В большинстве дистрибутивов Linux, предназначенных для использования на настольных компьютерах, по умолчанию используется CONFIG_UPROBE_EVENT.

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

После создания точек трассировки вам требуется сообщить Qt Creator’у использовать их для профилирования. Для этого в настройках анализатора производительности есть удобная клавишная комбинация. Вы можете получить доступ к настройкам либо для своего конкретного проекта в настройках «Запуск» в режиме «Проекты», либо в глобальном масштабе из «Параметры» в меню «Инструменты». Просто выберите «Использовать точки трассировки». Затем Qt Creator заменит вашу текущую настройку событий на любые точки трассировки, которые она обнаружит в целевой системе, и обязательно записывайте образец каждый раз, когда попадается точка трассировки.

После этого вам нужно нажать кнопку «Пуск» на панели инструментов профилировщика, чтобы профилировать приложение. После завершения приложения Qt Creator собирает данные профиля и отображает его.

Интерпретирование данных

Самый простой способ вычислить, какие фрагменты кода расходуют много памяти, - это посмотреть на flame график. Чтобы получить наиболее значимые результаты, выберите режим “Peak Usage” в правом верхнем углу. Это покажет вам данный график, отсортированный по накопленному объему памяти, выделенному этими цепочками вызовов. Рассмотрим этот пример

Выводы

Как вы видите здесь - это профиль Qt Creator, загружающий большую QML-трассировку в QML Profiler. Профайлер QML использует много памяти, когда отображает большие трассировки. Этот профиль рассказывает нам некоторые подробности об использовании. Между прочим, этот пламенный график говорит нам, что:

  • Модели для графиков Timeline, Statistics и Flame потребляют около 43% пиковой памяти. TimelineTraceManager::appendEvent(...) отправляет события в различные модели и вызывает выделение.
  • Из них самая большая часть - 18,9% для моделей диапазона Timeline. Категории JavaScript, Bindings и Signal Handling - это модели диапазона. Они сохраняют вектор дополнительных данных с записью для каждого такого диапазона. Вы можете увидеть QArrayData::allocate(...), который выделяет память для этих векторов.
  • Рендеринг Timeline потребляет большую часть памяти, не выделенной для базовых моделей. В частности, Timeline::NodeUpdater::run() отображается во всех остальных трассировках стека. Эта функция отвечает за заполнение геометрии, используемой для отображения категорий временной шкалы (Timeline). Поэтому QSGGeometry::allocate(...) является тем, что мы видим, как прямую причину для распределений. Это также говорит нам, почему QML профилирует графическую карту с несколькими гигабайтами памяти для отображения таких трассировок.

Возможные оптимизации

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

Накладные расходы трассировки

Профилирование каждого вызова malloc () и free () в приложении приведет к значительным потерям. Ядро, скорее всего, не сможет идти в ногу со временем и, следовательно, отбросит некоторые образцы. Тем не менее, в зависимости от вашей конкретной рабочей нагрузки результирующий профиль все же может дать вам важную информацию. Другими словами: если ваше приложение выделяет огромное количество памяти только в нескольких вызовах для malloc(), одновременно выделяя и отпуская небольшое количество на высокой частоте, вы можете пропустить интересующие вас вызовы malloc(), поскольку ядро может отбросить их. Однако, если проблемные вызовы malloc() составляют больший процент от общего количества вызовов, вы, вероятно, поймаете, хотя бы некоторые из них. В любом случае Qt Creator представит вам абсолютные числа для распределения, выпуска и использования максимальной памяти. Эти цифры относятся к образцам perf, которые фактически сообщаются, и, следовательно, не совсем точны. Другие инструменты будут сообщать о разных цифрах.

Специальные функции выделения памяти

Кроме того, есть функции распределения памяти, которые вы не можете использовать для профилирования таким образом. В частности posix_memalign() не возвращает результирующий показатель в стек или в регистр. Поэтому мы не можем записать его с точкой трассировки. Кроме того, пользовательские распределители памяти, которые вы можете использовать для своего приложения, не обрабатываются точками трассировки по умолчанию. Например, распределитель хип («куча») JavaScript, используемый QML, не будет отображаться в профиле. Хотя для этого конкретного случая вы можете использовать QML Profiler. Также существуют различные замены для стандартных функций распределения C, например jemalloc или tcmalloc. Если вы хотите отслеживать их, вам необходимо определить пользовательские точки трассировки

Заключение

Профилирование использования памяти с помощью Анализатора Производительности Qt Creator - это простой и быстрый способ получить важные сведения об использовании памяти вашим приложением. Он работает в ящике для любых целей Linux, поддерживаемых Qt Creator. Вы можете сразу просмотреть полученные данные профиля в общедоступном графическом интерфейсе (GUI) без дальнейшей обработки или передачи данных. Другие инструменты могут давать более точные данные. Однако для быстрого обзора использования памяти вашим приложением Анализатор Производительности часто является лучшим инструментом.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
m
  • molni99
  • 26 октября 2024 г. 1:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
m
  • molni99
  • 26 октября 2024 г. 1:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
ИМ
Игорь Максимов22 ноября 2024 г. 11:51
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 октября 2024 г. 14:37
Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 октября 2024 г. 8:19
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5 октября 2024 г. 7:51
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55 июля 2024 г. 11:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
m
moogo22 ноября 2024 г. 7:17
Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
Evgenii Legotckoi
Evgenii Legotckoi24 июня 2024 г. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 ноября 2024 г. 6:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject4 июня 2022 г. 3:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

Следите за нами в социальных сетях