Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB

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

Profiling, Qt, Профилирование

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

Вы могли слышать об Анализаторе Производительности (названным “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) без дальнейшей обработки или передачи данных. Другие инструменты могут давать более точные данные. Однако для быстрого обзора использования памяти вашим приложением Анализатор Производительности часто является лучшим инструментом.

Виртуальный хостинг со скидкой 10 процентов
Виртуальный хостинг со скидкой 10 процентов
EVILEG предлагает надёжный хостинг со скидкой 10% на виртуальный хостинг и 5% на VPS

Комментарии

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

Qt - Тест 001. Сигналы и слоты

  • Результат:68баллов,
  • Очки рейтинга-1
l
24 марта 2019 г. 11:39
laxy93

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

  • Результат:86баллов,
  • Очки рейтинга6
l
24 марта 2019 г. 11:32
laxy93

Qt - Тест 001. Сигналы и слоты

  • Результат:78баллов,
  • Очки рейтинга2
Последние комментарии
22 марта 2019 г. 12:32
Евгений Легоцкой

Ну может бибилотеки не те положили? У вас сборка для MinGW, а либы для MSVC.
ВН
22 марта 2019 г. 11:08
Волчонок Над-Пропастью

Из кьюта приложение не хочет запускаться, аварийно завершается, но каких-либо ошибок не выдаёт. Оно открывается, после нажатия "старт" зависает и завершается. Если не из кьюта запускать дебаг ...
21 марта 2019 г. 15:49
Евгений Легоцкой

серьезно? Эта ошибка 404 уже даже не относится к данному вопросу. В каких-то urls в вашем проекте. Вопросы, которые не относятся непосредственно к статье, задавайте, пожалуйста на...
АБ
21 марта 2019 г. 15:00
Артем Бел

а это где? сейчас ошибка в debag такая: Page not found (404)Request Method: GETRequest URL: http://amadowshop.site/accounts/profile/
21 марта 2019 г. 12:47
Евгений Легоцкой

не вижу здесь проблемы, поменяйте url для callback в приложения oauth в социальных сетях https://amadowshop.site/auth/verify/complete/facebook/
Сейчас обсуждают на форуме
m
24 марта 2019 г. 10:36
monevich

Отвечу на свой же вопрос, может кому то это пригодится. Да, можно в функции main использовать такую конструкцию. При запуске программы из Qt передаю свой аргумент в параметрах командной строк...
22 марта 2019 г. 12:29
Дмитрий

Да, мьютекс добавил, но в том потоке, где сигнал вызывается.
ВН
22 марта 2019 г. 9:04
Волчонок Над-Пропастью

Да, на эту проблему! Зато у меня теперь новая, ругается на подключение QMediaPlayer, пишет, что не находит подобного файла или библиотеки. Пока не нашла как исправить, только вариант с переуст...
22 марта 2019 г. 8:58
Михаиллл

4) это , похоже, для создания видоизмененных страниц, для анимации. 3,5) добавить фвйл/qt/ui.qml
22 марта 2019 г. 8:04
Евгений Легоцкой

Привет. Если там std::vector , то наверное можно заранее подготовить вектор с необходимым количеством элементов и просто устанавливать значение по индексу элемента. Но в данном слу...
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы