Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial Internet of Things >> Интернет вещей

Профилирование распределенных приложений с помощью Perf

Я, как и многие разработчики, был в ситуациях, когда мне нужно было взять существующее приложение и сделать его быстрее - в основном за счет удаления медленного кода и замены его быстрым кодом. Теперь я знаю, что при оптимизации кода нужно следовать одному простому правилу:

Какой бы код, по моему мнению, не замедлял работу приложения, мне следует искать в последнюю очередь.

Профилирование - это торговля, которая заставляет вас очень быстро соглашаться с ограничениями вашей интуиции. Я рано понял, что мне нужны холодные, жесткие измерения, чтобы сказать мне, какие части моего кода нуждаются в оптимизации. К счастью, существует множество доступных инструментов профилирования, которые могут измерить практически все, что связано с тем, как работает ваш код.

Однако инструменты не обязательно упрощают профилирование. Интерпретация результатов измерений может быть сложной задачей, и при проведении экспериментов необходимо строго контролировать переменные. В частности, сложно профилировать многопоточные и распределенные приложения.

Любой, кому когда-либо приходилось отлаживать состояние гонки, знает, насколько чувствительно ко времени поведение многопоточных приложений. Профилирование многопоточных приложений сталкивается с аналогичными проблемами, поскольку время становится важным фактором при измерении.

Профилировщики, такие как callgrind, значительно замедляют вашу программу и, следовательно, влияют на время. Примером, показывающим ограничение таких профилировщиков, является конфликт мьютексов. Ваше приложение может работать медленно, потому что мьютекс интенсивно используется, в результате чего ваш код тратит много времени на функции блокировки. Такой инструмент, как callgrind, не обнаружит этого, поскольку он считает инструкции а не время.

Есть еще один класс профилировщиков, которые выполняют «статистическое профилирование». Эти профилировщики позволяют запускать вашу программу, как обычно, при этом периодически делая снимки того, где приложение проводит свое время. Эти профилировщики должны работать в течение некоторого времени для получения точных результатов, но могут делать это с минимальным влиянием на время. Благодаря этому они отлично подходят для профилирования многопоточных и / или распределенных приложений!

Я хотел поделиться рабочим процессом профилирования с помощью инструмента Perfomance Linux, который оказался особенно полезным, поскольку он позволяет мне быстро определять «горячие точки» производительности. Я буду использовать пример c / hello_dynamic из RTI Connext 5.3.0 в качестве цели для измерения производительности.

Во-первых, убедитесь, что на вашем Linux-компьютере установлен perf. В Ubuntu мне пришлось запустить эту команду, чтобы установить perf на моем компьютере:

 sudo apt-get install linux-tools-common linux-tools-3.13.0-107-generic 

Затем вам нужно загрузить проект GitHub, который может преобразовать вывод из perf в так называемый «FlameGraph», который является визуальным представлением собранных данных профилирования. Выполните эту команду из удобного места (например, из домашнего каталога):

 git clone https://github.com/brendangregg/FlameGraph 

Теперь перейдите к примеру hello_dynamic в папке rti_workspace / examples / c. Создайте код с помощью этих команд (убедитесь, что NDDSHOME настроен на установку RTI Connext):

 экспорт DEBUG =1 
make -f makefile_Hello_x64Linux3gcc4.8.2

Платформа в имени make-файла может отличаться от вашей платформы. Обратите внимание, как мы устанавливаем переменную среды DEBUG. Мы делаем это для того, чтобы в двоичном файле были символы отладки, которые позволят нам видеть имена функций в стеках вызовов, которые выводит perf.

Теперь мы можем запустить perf для нашего кода. Выполните следующие команды:

 objs / x64Linux3gcc4.8.2 / Hello sub &
sudo perf record -g objs / x64Linux3gcc4.8.2 / Hello pub

Через некоторое время нажмите Ctrl-C, чтобы выйти из издателя. Perf создаст файл с именем «perf.out». Теперь нам нужно преобразовать этот файл во что-то, что понимает инструмент FlameGraph, используя скрипт из репозитория FlameGraph:

 сценарий perf -f | ~ / FlameGraph / stackcollapse-perf.pl> out.perf-folded 

Отсюда мы можем сгенерировать изображение FlameGraph:

 ~ / FlameGraph / flamegraph.pl out.perf-folded> perf.svg 

Когда вы открываете файл perf.svg в веб-браузере, он должен выглядеть примерно так:


Горизонтальная ось представляет время, затраченное на определенную функцию, тогда как столбцы с накоплением представляют стек вызовов вашего приложения. Вы можете щелкнуть по каждой панели, чтобы увеличить ее до конкретной стопки.

Попробуйте перезапустить издателя, но без подписчика. Вы заметите, что правая часть флеймографа исчезнет, ​​так как DDS не отправляет никаких данных, когда нет подписчиков!

Инструмент perf может намного больше, чем описано в этом блоге. Если вам известны другие настройки или инструменты, которые упростили вашу жизнь при профилировании, дайте нам знать!

Удачного профилирования!


Интернет вещей

  1. Будет ли молибден сочетаться с другими элементами?
  2. Создание гибридных блокчейн / облачных приложений с Ethereum и Google
  3. Создание бессерверных мобильных приложений с помощью React Native и AWS
  4. Простая схема датчика приближения и работа с приложениями
  5. Типы аналоговых и цифровых датчиков с приложениями
  6. Microchip:масштабирование космических приложений с помощью COTS-устойчивых к радиации микроконтроллеров с ядром
  7. Простое устранение узких мест в ИТ:платформы с низким кодом содержат ключ
  8. Ovo расширяет свою игру с распределенной энергией с помощью интеллектуальной сети VCharge купить
  9. Фрезерно-фрезерный станок с ЧПУ по дереву - с потрясающими приложениями
  10. 5 реальных приложений ИИ в медицине (с примерами)