Профилирование распределенных приложений с Linux perf: практическое руководство
Оптимизация зрелого приложения может ощущаться как поиск иголки в стоге сена. Лучший способ идентифицировать реальные узкие места производительности — позволить данным, а не интуиции, водить вашими решениями. На практике наиболее времязатратный код часто является наименее очевидным.
Когда я подозреваю, что кусок кода медленный, я сначала проверяю доказательства перед тем, как его модифицировать.
Профилирование превращает интуицию в измеримые факты. Хотя существует десятки профайлеров на рынке, выбор правильного инструмента для многонитевого или распределенного системы может быть сложным. Традиционные инструкционные профайлеры вроде Callgrind могут искажать тайминги, особенно под тяжелым mutex contention, потому что они измеряют инструкции, а не wall-clock время.
Статистические профайлеры, с другой стороны, сэмплируют работающую программу с низкими накладными расходами, делая их идеальными для сложных, конкурентных рабочих нагрузок. Linux perf — премиальный пример этого подхода.
Ниже — пошаговый воркфлоу, демонстрирующий, как использовать perf вместе с FlameGraph Брендона Грегга для выявления горячих точек в распределенном приложении. Пример таргетит сэмпл c/hello_dynamic из RTI Connext 5.3.0.
1. Установите perf
На Ubuntu выполните:
sudo apt-get install linux-tools-common linux-tools-3.13.0-107-generic
2. Клонируйте FlameGraph
Клонируйте репозиторий в удобное место (например, вашу домашнюю директорию):
git clone https://github.com/brendangregg/FlameGraph
3. Соберите пример
Перейдите в rti_workspace/examples/c и скомпилируйте с debug символами:
export DEBUG=1 make -f makefile_Hello_x64Linux3gcc4.8.2
Замените имя makefile на тот, что соответствует вашей платформе, если необходимо.
4. Запустите паблишер под профилированием
Запустите подписчика в фоне, затем запустите perf:
objs/x64Linux3gcc4.8.2/Hello sub & sudo perf record -g objs/x64Linux3gcc4.8.2/Hello pub
После короткого тестового периода нажмите Ctrl+C для остановки паблишера. perf сгенерирует perf.out.
5. Конвертируйте данные для FlameGraph
Транслируйте вывод perf в folded stack файл:
perf script -f | ~/FlameGraph/stackcollapse-perf.pl > out.perf-folded
Затем сгенерируйте визуальный flame graph:
~/FlameGraph/flamegraph.pl out.perf-folded > perf.svg
6. Исследуйте результаты
Откройте perf.svg в веб-браузере. Горизонтальная ось показывает время, потраченное в каждой функции, тогда как накопленные столбцы раскрывают стек вызовов. Клик по столбцу зуммирует в тот стек. Запуск паблишера без подписчика уберет правую часть графа, подтверждая, что DDS эмитит данные только когда существуют подписчики.
Perf предлагает множество других опций — настройка частоты сэмплирования, исключение кода ядра, фокус на конкретных CPU. Если у вас есть советы или вы обнаружили дополнительные инструменты, упрощающие профилирование, делитесь в комментариях.
Счастливого профилирования!
Интернет вещей
- Может ли молибден соединяться с другими элементами? Экспертные сведения о легировании и высокотемпературном…
- Создание гибридных блокчейн-облачных приложений с Ethereum и Google Cloud
- Создание масштабируемых бессерверных мобильных приложений с React Native и AWS
- Индуктивный датчик приближённости: схема, принцип работы и практические применения
- Аналоговые и цифровые датчики: типы, применение и практические примеры
- Microchip запускает Arm-базированные MCU для масштабируемых космических миссий — от COTS до радиационно-терпимых и зак…
- Устранение IT-узких мест с low-code платформами: упрощение цифровой трансформации
- Ovo Energy усиливает стратегию распределенной энергии через приобретение VCharge Smart Grid
- ЧПУ-деревообрабатывающий фрезер: универсальная точность для качественной мебели и не только
- ИИ в медицине: 5 проверенных реальных применений с практическими примерами