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

Комментарии

Комментарии

Только авторизованные пользователи могут оставлять комментарии.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
15 августа 2018 г. 19:02
Lord Inquisitoris

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

  • Результат 57баллов,
  • Очки рейтинга-2
15 августа 2018 г. 18:58
Lord Inquisitoris

C++ - Тест 005. Структуры и Классы

  • Результат 83баллов,
  • Очки рейтинга4
15 августа 2018 г. 9:29
Леха Завистович

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

  • Результат 86баллов,
  • Очки рейтинга6
Последние комментарии
10 августа 2018 г. 13:40
Alex

Работа с триггерными функциями в PostgreSQL

Приветствую! Если вы создаете новую таблицу, почему бы просто не сделать вьюху ? Просто от одного названия "триггер" как-то не хочется его использовать, а уж кода сколько писа...
10 августа 2018 г. 11:46
Евгений Легоцкой

Bash скрипт для создания и скачивания дампа базы данных и медиа файлов с удаленного сервера

Вон оно что. Не сталкивался с таким, надо будет глянуть исходники дефолтного менеджера объектов. Возможно там кеширование просто. Пробовали добавить запись через adminer, перезапусти...
10 августа 2018 г. 11:34
Alex

Bash скрипт для создания и скачивания дампа базы данных и медиа файлов с удаленного сервера

допустим у нас есть любая таблица, созданная джангой. через админку добавляем пару записей. все ок. далее, лично в моем случае , я открываю adminer, и в эту таблицу добавляю еще одну зап...
Сейчас обсуждают на форуме
15 августа 2018 г. 14:06
Олег Корнев

Как подключить QtCharts в QML?

После некоторых манипуляций (переустановил креатор) смог запустить экземплы с использованием QtCharts, но все они работают с подключениями в файлах .pro .cpp, у меня таких файлов нет. Как...
14 августа 2018 г. 7:02
Ruslan-maniak

Переключение страниц и перевод фокуса на потомка новой страницы

Большое спасибо. Подтолкнули меня на мысль вынести обработку клавиш из PathView на всю страницу. И тогда - да, ваша подсказка работает. добавил в StackView onCurrentItemChanged: currentItem.fo...
14 августа 2018 г. 6:39
Евгений Легоцкой

Как сделать аудиовизуализацию для плеера на qt?

Добрый день. Просмотрите пример в Qt Creator, который на QML, там реализовано визуализация, возможно вам понравится использовать, QML, да и кастомные интерфейсы на нём всё-таки лучше...
11 августа 2018 г. 10:12
Евгений Легоцкой

Qt C++ vs QML

Добрый день. Если Андроид предполагается, то конечно нужно использовать QML. Я занимался разработкой арканоида на QML и ещё одной игры. Пытался реализовывать логику на QML, но это ...
11 августа 2018 г. 9:24
Евгений Легоцкой

Помогите со слоями

Проверочное сообщение

Рекомендуемые страницы