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 хостинг.

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
e
  • ehot
  • 31 марта 2024 г. 14:29

C++ - Тест 003. Условия и циклы

  • Результат:78баллов,
  • Очки рейтинга2
B

C++ - Тест 002. Константы

  • Результат:16баллов,
  • Очки рейтинга-10
B

C++ - Тест 001. Первая программа и типы данных

  • Результат:46баллов,
  • Очки рейтинга-6
Последние комментарии
k
kmssr8 февраля 2024 г. 18:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко5 февраля 2024 г. 1:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 10:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 8:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik18 декабря 2023 г. 21:01
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
a
a_vlasov14 апреля 2024 г. 6:41
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев
Павел Дорофеев14 апреля 2024 г. 2:35
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrex4 апреля 2024 г. 4:47
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
P
Pisych27 февраля 2023 г. 4:04
Как получить в массив значения из связанной модели? Спасибо, разобрался:))
AC
Alexandru Codreanu19 января 2024 г. 11:57
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

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