SlideShare a Scribd company logo
1 of 20
Sampling Profiling
Быстро ищем узкие места в коде, на живой системе в production
без overhead и головной боли ;)
Eugene Klimov aka Slach, починяю примуса в Sailplay
Что такое «sampling profiling»?
• Все просто ;)
• берем «любой процесс» (php интерпретатор, python
интерпретатор, java, golang static binary или обычный CC++
binary)
• и начинаем «довольно часто» (от 100 до 1000 раз в секунду)
«снимать» его стек
• Одинаковые «стеки» агрегируем
• Из полученных «агрегированных» данных строим FLAMEGRAPH
Кто придумал «FLAME GRAPH» и зачем?
• Все просто ;) Есть такой великий человек Brandan Gregg
• Он умеет делать вот так
Что такое «FLAME GRAPH»?
Flame graph это график на
котором:
• В первой строке «снизу» idle
или main (точки входа)
• Во второй и выше строке
«общие функции на заданном
уровне стека», чем в большем
количестве «samples» на этом
уровне встречается функции,
тем «шире» прямоугольник и
«краснее» температура
Где применять «FLAME GRAPH»?
Хорошо работает:
• Для поиска CPU и IO bottleneck в «знакомой» системе (автор кода, доступен
для пыток :)
• Если есть доступ на сервера в тот момент, когда проблема случилась и она
постоянная, а не «случайна»
• Когда мониторинга «нет» и надо разобраться что происходит здесь и сейчас
Плохо работает если:
• Очень длинный call-stack (рекурсии, абстракции, java-код)
• Код большой и процесс монолитный (один процесс делает сразу все)
• Серверов и компонентов (процессов) много
Как построить «FLAME GRAPH» из PHP?
• Все просто ;) но в PHP через боль
• Ставим в систему XHProf (pecl install xhprof)
• Прописываем в php.ini
[PHP]
auto_prepend_file=/tmp/xhprof_sampling.php
[xhprof]
extension = xhprof.so
xhprof.output_dir = /tmp/xhprof
Как построить «FLAME GRAPH» из PHP?
• Код /tmp/xhprof_sampling.php
<?php
if (extension_loaded('xhprof')) {
$uri = substr($_SERVER['REQUEST_URI'], 1);
$uri = preg_replace('/[?/]/', '-', $uri);
xhprof_sample_enable();
register_shutdown_function(function () use($uri) {
$filename = "/tmp/xhprof/{$uri}." . uniqid() . ".sample_xhprof";
file_put_contents($filename, serialize(xhprof_sample_disable()));
chmod($filename, 0777);
});
}
Как FLAME GRAPH выглядит в PHP?
На выходе так себе результат :)
Как построить FLAME GRAPH в python?
• Все просто (но могут быть нюансы в python3 ;) спасибо UBER!
sudo apt-get install software-properties-common
sudo apt-add-repository -y ppa:trevorjay/pyflame
apt-get update
sudo apt-get install -y pyflame
cd /opt
git clone https://github.com/brendangregg/FlameGraph.git
cd ~
# сортировать по CPU или iowait
htop # тут посмотрел PID процесса с python (uwsgi, gunicorn etc)
# 6294 это PID, мониторим 60 секунд
pyflame -s 60 -p 2.7.12 -o pyflame_uwsgi_django.out 6294 |
/opt/FlameGraph/flamegraph.pl > pyflame_uwsgi_django.svg
Как FLAME GRAPH выглядит в PYTHON?
На выходе гораздо лучше :)
Код который надо было пофиксить
def _generate_uniq_manager_pin(department, current_pin=None):
from skazka.stores.models import PartnerManager
exist_pins = [
pm.pin_code for pm in
PartnerManager.objects.filter(department=department)
]
if current_pin and current_pin not in exist_pins:
return current_pin
pin = None
# БАГА ТУТ ;)
while True:
pin = str(random.randint(1000, 9999))
if pin not in exist_pins:
break
return pin
Как FLAME GRAPH выглядит в PYTHON?
После bugfix, все гораздо приятнее :)
Более сложный пример FLAME GRAPH в PYTHON
Более сложный пример FLAME GRAPH в PYTHON
Пример FLAME GRAPH в PYTHON – Garbage Collector
def remove_client(self, client, quitmsg):
# ...
if self.epoll:
del self.clients[client.socket.fileno()]
gc.collect()
else:
del self.clients[client.socket]
gc.collect()
Пример FLAME GRAPH в PYTHON – GC fixed ;)
def remove_client(self, client, quitmsg):
# ...
if self.epoll:
del self.clients[client.socket.fileno()]
if random.randint(0,1000) <= 10:
gc.collect()
else:
del self.clients[client.socket]
if random.randint(0,1000) <= 10:
gc.collect()
Как построить FLAME GRAPH в golang?
• Все просто, спасибо UBER еще раз, но надо править код и
пересобирать бинарник!
package main
import (
"log"
"net/http"
_ "net/http/pprof"
)
func main() {
go func() {
err := http.ListenAndServe(":6060", nil)
if err != nil {
log.Fatalf("pprof http.ListenAndServe on port 6060 failed %v", err)
} else {
log.Println("pprof http.ListenAndServe on port 6060 done")
}
}()
}
Как выглядит FLAME GRAPH в golang?
Как все это завести у себя руками?
Стенд для docker-compose
https://github.com/Slach/howto-sample-profiling-and-flamegraph
Исходники утилит
https://github.com/uber/pyflame
https://github.com/uber/go-torch
https://github.com/brendangregg/FlameGraph
https://github.com/msonnabaum/xhprof-flamegraphs
Спасибо за внимание!
Telegram: @BloodJazMan
Email: bloodjazman@gmail.com
Задавайте ваши вопросы не стесняйтесь!
Мы ищем Python разработчиков ;)

More Related Content

What's hot

Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...
Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...
Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...Unigine Corp.
 
Flask как хорошее решение для веб проекта
Flask как хорошее решение для веб проектаFlask как хорошее решение для веб проекта
Flask как хорошее решение для веб проектаPython Meetup
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времениTatyanazaxarova
 
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...it-people
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirCodeFest
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)Ontico
 
Ян Габис - RobotFramework: автоматизированое тестирование для всех
Ян Габис - RobotFramework: автоматизированое тестирование для всех Ян Габис - RobotFramework: автоматизированое тестирование для всех
Ян Габис - RobotFramework: автоматизированое тестирование для всех Minsk Linux User Group
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++Andrey Karpov
 
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The GrinderИлья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The GrinderSQALab
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Sergey Platonov
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Контроль качества и сопровождение программ в реальном времени
Контроль качества и сопровождение программ в реальном времениКонтроль качества и сопровождение программ в реальном времени
Контроль качества и сопровождение программ в реальном времениSQALab
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1m2rus
 

What's hot (18)

Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...
Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...
Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...
 
Flask как хорошее решение для веб проекта
Flask как хорошее решение для веб проектаFlask как хорошее решение для веб проекта
Flask как хорошее решение для веб проекта
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времени
 
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
 
Ян Габис - RobotFramework: автоматизированое тестирование для всех
Ян Габис - RobotFramework: автоматизированое тестирование для всех Ян Габис - RobotFramework: автоматизированое тестирование для всех
Ян Габис - RobotFramework: автоматизированое тестирование для всех
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++
 
Ngs 1 2
Ngs 1 2Ngs 1 2
Ngs 1 2
 
Отладка в Python: 2016 edition
Отладка в Python: 2016 editionОтладка в Python: 2016 edition
Отладка в Python: 2016 edition
 
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The GrinderИлья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Контроль качества и сопровождение программ в реальном времени
Контроль качества и сопровождение программ в реальном времениКонтроль качества и сопровождение программ в реальном времени
Контроль качества и сопровождение программ в реальном времени
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 

Similar to Sampling profiling

Инструменты профайлинга С++ кода
Инструменты профайлинга С++ кодаИнструменты профайлинга С++ кода
Инструменты профайлинга С++ кодаcorehard_by
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20DefconRussia
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...corehard_by
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPythonAnton Patrushev
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5Technopark
 
SymfonyConf IV.2016 - Реанимация проектов на Symfony
SymfonyConf IV.2016 - Реанимация проектов на SymfonySymfonyConf IV.2016 - Реанимация проектов на Symfony
SymfonyConf IV.2016 - Реанимация проектов на SymfonySerge Velikanov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp VaultКак перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp VaultOleg Mykolaichenko
 
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...DevGAMM Conference
 
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Moscow.pm
 
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...Fwdays
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотомRoman Grebennikov
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 

Similar to Sampling profiling (20)

Инструменты профайлинга С++ кода
Инструменты профайлинга С++ кодаИнструменты профайлинга С++ кода
Инструменты профайлинга С++ кода
 
Use Grunt Luke
Use Grunt LukeUse Grunt Luke
Use Grunt Luke
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
About Python
About PythonAbout Python
About Python
 
Continuous monitoring
Continuous monitoringContinuous monitoring
Continuous monitoring
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPython
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
 
SymfonyConf IV.2016 - Реанимация проектов на Symfony
SymfonyConf IV.2016 - Реанимация проектов на SymfonySymfonyConf IV.2016 - Реанимация проектов на Symfony
SymfonyConf IV.2016 - Реанимация проектов на Symfony
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp VaultКак перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
 
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
 
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
 
Gen server
Gen serverGen server
Gen server
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 

More from Slach

Open source субд глазами обычного программиста
Open source субд глазами обычного программистаOpen source субд глазами обычного программиста
Open source субд глазами обычного программистаSlach
 
мониторинг производительности Web приложений на python
мониторинг производительности Web приложений на pythonмониторинг производительности Web приложений на python
мониторинг производительности Web приложений на pythonSlach
 
мониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBAмониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBASlach
 
phpConf 2010 Классификация систем хранения
phpConf 2010 Классификация систем храненияphpConf 2010 Классификация систем хранения
phpConf 2010 Классификация систем храненияSlach
 
XML Native Database на примере SednaXML
XML Native Database на примере SednaXMLXML Native Database на примере SednaXML
XML Native Database на примере SednaXMLSlach
 
Php Conf2007 Mapscript
Php Conf2007 MapscriptPhp Conf2007 Mapscript
Php Conf2007 MapscriptSlach
 

More from Slach (6)

Open source субд глазами обычного программиста
Open source субд глазами обычного программистаOpen source субд глазами обычного программиста
Open source субд глазами обычного программиста
 
мониторинг производительности Web приложений на python
мониторинг производительности Web приложений на pythonмониторинг производительности Web приложений на python
мониторинг производительности Web приложений на python
 
мониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBAмониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBA
 
phpConf 2010 Классификация систем хранения
phpConf 2010 Классификация систем храненияphpConf 2010 Классификация систем хранения
phpConf 2010 Классификация систем хранения
 
XML Native Database на примере SednaXML
XML Native Database на примере SednaXMLXML Native Database на примере SednaXML
XML Native Database на примере SednaXML
 
Php Conf2007 Mapscript
Php Conf2007 MapscriptPhp Conf2007 Mapscript
Php Conf2007 Mapscript
 

Sampling profiling

  • 1. Sampling Profiling Быстро ищем узкие места в коде, на живой системе в production без overhead и головной боли ;) Eugene Klimov aka Slach, починяю примуса в Sailplay
  • 2. Что такое «sampling profiling»? • Все просто ;) • берем «любой процесс» (php интерпретатор, python интерпретатор, java, golang static binary или обычный CC++ binary) • и начинаем «довольно часто» (от 100 до 1000 раз в секунду) «снимать» его стек • Одинаковые «стеки» агрегируем • Из полученных «агрегированных» данных строим FLAMEGRAPH
  • 3. Кто придумал «FLAME GRAPH» и зачем? • Все просто ;) Есть такой великий человек Brandan Gregg • Он умеет делать вот так
  • 4. Что такое «FLAME GRAPH»? Flame graph это график на котором: • В первой строке «снизу» idle или main (точки входа) • Во второй и выше строке «общие функции на заданном уровне стека», чем в большем количестве «samples» на этом уровне встречается функции, тем «шире» прямоугольник и «краснее» температура
  • 5. Где применять «FLAME GRAPH»? Хорошо работает: • Для поиска CPU и IO bottleneck в «знакомой» системе (автор кода, доступен для пыток :) • Если есть доступ на сервера в тот момент, когда проблема случилась и она постоянная, а не «случайна» • Когда мониторинга «нет» и надо разобраться что происходит здесь и сейчас Плохо работает если: • Очень длинный call-stack (рекурсии, абстракции, java-код) • Код большой и процесс монолитный (один процесс делает сразу все) • Серверов и компонентов (процессов) много
  • 6. Как построить «FLAME GRAPH» из PHP? • Все просто ;) но в PHP через боль • Ставим в систему XHProf (pecl install xhprof) • Прописываем в php.ini [PHP] auto_prepend_file=/tmp/xhprof_sampling.php [xhprof] extension = xhprof.so xhprof.output_dir = /tmp/xhprof
  • 7. Как построить «FLAME GRAPH» из PHP? • Код /tmp/xhprof_sampling.php <?php if (extension_loaded('xhprof')) { $uri = substr($_SERVER['REQUEST_URI'], 1); $uri = preg_replace('/[?/]/', '-', $uri); xhprof_sample_enable(); register_shutdown_function(function () use($uri) { $filename = "/tmp/xhprof/{$uri}." . uniqid() . ".sample_xhprof"; file_put_contents($filename, serialize(xhprof_sample_disable())); chmod($filename, 0777); }); }
  • 8. Как FLAME GRAPH выглядит в PHP? На выходе так себе результат :)
  • 9. Как построить FLAME GRAPH в python? • Все просто (но могут быть нюансы в python3 ;) спасибо UBER! sudo apt-get install software-properties-common sudo apt-add-repository -y ppa:trevorjay/pyflame apt-get update sudo apt-get install -y pyflame cd /opt git clone https://github.com/brendangregg/FlameGraph.git cd ~ # сортировать по CPU или iowait htop # тут посмотрел PID процесса с python (uwsgi, gunicorn etc) # 6294 это PID, мониторим 60 секунд pyflame -s 60 -p 2.7.12 -o pyflame_uwsgi_django.out 6294 | /opt/FlameGraph/flamegraph.pl > pyflame_uwsgi_django.svg
  • 10. Как FLAME GRAPH выглядит в PYTHON? На выходе гораздо лучше :)
  • 11. Код который надо было пофиксить def _generate_uniq_manager_pin(department, current_pin=None): from skazka.stores.models import PartnerManager exist_pins = [ pm.pin_code for pm in PartnerManager.objects.filter(department=department) ] if current_pin and current_pin not in exist_pins: return current_pin pin = None # БАГА ТУТ ;) while True: pin = str(random.randint(1000, 9999)) if pin not in exist_pins: break return pin
  • 12. Как FLAME GRAPH выглядит в PYTHON? После bugfix, все гораздо приятнее :)
  • 13. Более сложный пример FLAME GRAPH в PYTHON
  • 14. Более сложный пример FLAME GRAPH в PYTHON
  • 15. Пример FLAME GRAPH в PYTHON – Garbage Collector def remove_client(self, client, quitmsg): # ... if self.epoll: del self.clients[client.socket.fileno()] gc.collect() else: del self.clients[client.socket] gc.collect()
  • 16. Пример FLAME GRAPH в PYTHON – GC fixed ;) def remove_client(self, client, quitmsg): # ... if self.epoll: del self.clients[client.socket.fileno()] if random.randint(0,1000) <= 10: gc.collect() else: del self.clients[client.socket] if random.randint(0,1000) <= 10: gc.collect()
  • 17. Как построить FLAME GRAPH в golang? • Все просто, спасибо UBER еще раз, но надо править код и пересобирать бинарник! package main import ( "log" "net/http" _ "net/http/pprof" ) func main() { go func() { err := http.ListenAndServe(":6060", nil) if err != nil { log.Fatalf("pprof http.ListenAndServe on port 6060 failed %v", err) } else { log.Println("pprof http.ListenAndServe on port 6060 done") } }() }
  • 18. Как выглядит FLAME GRAPH в golang?
  • 19. Как все это завести у себя руками? Стенд для docker-compose https://github.com/Slach/howto-sample-profiling-and-flamegraph Исходники утилит https://github.com/uber/pyflame https://github.com/uber/go-torch https://github.com/brendangregg/FlameGraph https://github.com/msonnabaum/xhprof-flamegraphs
  • 20. Спасибо за внимание! Telegram: @BloodJazMan Email: bloodjazman@gmail.com Задавайте ваши вопросы не стесняйтесь! Мы ищем Python разработчиков ;)