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

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

i
  • 8 ноября 2024 г. 1:04

generic priligy online What have you got there

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
m
  • molni99
  • 25 октября 2024 г. 22:37

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

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

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

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

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

  • Результат:42баллов,
  • Очки рейтинга-8
Последние комментарии
i
innorwall7 ноября 2024 г. 23:45
QML - Урок 002. Custom Button in QML Android 2007; 14 2 270 83 priligy dapoxetine 60mg Testicular imaging is sort of a unique niche right now, Гў
i
innorwall7 ноября 2024 г. 22:32
C++ - Ускоряет ли сборку #pragma once? It could cause harm to the unborn baby buy generic priligy
i
innorwall7 ноября 2024 г. 21:50
EVILEG-CORE. Использование Google reCAPTCHA buy priligy 60 urea in 50 patients treated by urea for mild hyponatremia developed it in the intensive care unit mean age 71 20 years
Сейчас обсуждают на форуме
i
innorwall7 ноября 2024 г. 21:48
добавить qlineseries в функции Uncommon but potentially severe adverse events include profound electrolyte and water loss, dehydration leading to hypotension and syncope, electrolyte depletion with hypokalemia, hypomagnesemia…
9
9Anonim25 октября 2024 г. 6:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Игорь Максимов3 октября 2024 г. 1:05
Реализация навигации по разделам Спасибо Евгений!
F
Fynjy22 июля 2024 г. 1:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

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