Добро пожаловать в Tencent Cloud + Community, чтобы получить большую масштабную техническую практику Tencent сухими товарами ~.
Автор: Чжао Кун | Закулисный инженер-разработчик Tencent Demon King Studio
При разработке проектов часто встречаются такие проблемы, как длительное время запуска программы и высокая загрузка ЦП, поэтому в настоящее время нам необходимо полагаться на инструменты анализа производительности для определения точек потребления производительности. Эта статья знакомит вас с начальным уровнем использования и графическими методами трех часто используемых инструментов.
В этой статье представлены три инструмента анализа производительности: Perf, gprof и Valgrind, а также метод графического анализа результатов, цель которого — помочь всем быстрее приступить к работе с этими инструментами. Из-за нехватки места в этой статье не будет подробного ознакомления с параметрами использования и анализом результатов каждого инструмента, а будут только инструкции начального уровня.
Введение каждого инструмента будет разделено на три части: введение, инструкции по использованию и графические методы.
Результаты каждого инструмента будут основаны на следующем коде:
#include <unistd.h>using namespace std;#define NUM 500000void init(int* int_array){
for(int i=0;i<NUM;i++){
int_array[i]=i;
}}void accu(int* int_array,long& sum ){
for(int i=0;i<NUM;i++){
sum+=int_array[i];
usleep(3);
}}int main(){
int int_array[NUM];
init(int_array);
long sum=0;
accu(int_array,sum);}
Этот код выполняется в течение 31 секунды на обычном ПК с максимальной загрузкой ЦП 8,3%.
Введение в Perf1.1
Perf — это инструмент профилирования, встроенный в дерево исходных текстов ядра Linux. Он основан на принципе выборки событий и событиях производительности и часто используется для поиска узких мест в производительности и локализации горячего кода.
1.2 Использование
Использование perf можно разделить на два способа:
Запустите службу напрямую, используя perf
Подключиться к запущенному процессу
Первый способ не требует корневых привилегий, второй способ требует корневых разрешений
Основываясь на предпосылке использования начального уровня, давайте непосредственно представим, как его использовать:
perf record -e cpu-clock -g ./run
或者
perf record -e cpu-clock -g -p 4522
Используйте ctrl+c, чтобы прервать процесс perf, или после завершения выполнения программы будет сгенерирован файл perf.data, используйте
perf report
произведет анализ результатов, как показано на рис.
1.3 Графический метод
Результат perf может генерировать график пламени. Для создания графиков пламени требуется помощь Flame Graph.
Проект Flame Graph находится на GitHub:
https://github.com/brendangregg/FlameGraph
Клонировать код или загрузите сжатый пакет непосредственно на сервер. Принимая сжатый пакет в качестве примера, это файл с именем: flamegraph-master.zip, предполагая, что распакованный каталог: / data
На основе перф.данных, сгенерированных в версии 1.2, следующие шаги следующие:
1、使用perf script工具对perf.data进行解析perf script -i perf.data &> perf.unfold
2、将perf.unfold中的符号进行折叠:/data/stackcollapse-perf.pl perf.unfold &> perf.folded
3、最后生成svg图:/data/flamegraph.pl perf.folded > perf.svg
В результате график пламени выглядит следующим образом:
В Интернете есть много статей о значении и анализе флейм-графов, поэтому я не буду их здесь повторять.
Введение в Gprof2.1
gprof используется для отслеживания времени выполнения и количества вызовов каждого метода в программе, чтобы найти наиболее трудоемкую функцию в программе. После нормального завершения работы программы будет сгенерирован файл gmon.out, проанализирован этот файл и сгенерирован визуальный отчет.
2.2 Использование
С помощью GPROF нужно компилироваться, присоединяем опцию -pg
Кроме того, gmon.out будет сгенерирован только после нормального завершения работы программы, а метод уничтожения процесса не может сгенерировать gmon.out. Для служб, потоки которых будут выполняться все время, необходимо модифицировать код, чтобы программа останавливалась в определенный момент времени.
После перекомпиляции запустите программу в обычном режиме, после завершения работы программы будет сгенерирован файл gmon.out
Используйте следующую команду для создания регистрационного файла (где run — это имя двоичного файла):
gprof -b run gmon.out >>report.txt
report.txt открывается, как показано ниже:
2.3 Графический метод
Файл результата GPROF должен быть отображен с помощью GPROF2dot.py и graphviz
Используйте gprof2dot.py для создания точечных файлов.
python gprof2dot.py report.txt >report.dot
Следует отметить, что на сервере должен быть установлен python, а gprof2dot.py должен соответствовать установленной версии python. Соответствуют ли эти два - это вопрос удачи и скучно решать. На моем сервере установлен python 2.6.6, а gprof2dot-2017.9.19, впервые загруженный из Интернета, не соответствует версии python. неправильный. Используемая в настоящее время версия совместима с 2.6.6, при необходимости свяжитесь со мной.
Для открытия точки требуется инструмент graphviz.Я установил graphviz под окнами.Скачать этот инструмент очень просто. После загрузки используйте gvedit.ext, чтобы открыть файл report.dot, созданный на предыдущем шаге.
Эта картинка немного милая, потому что наша программа относительно проста в написании, для общего дела эта картинка будет посложнее.
Введение в Valgrind3.1
Valgrind не является родным инструментом Linux и требует самостоятельной установки. Сам Valgrind содержит несколько инструментов:
Memcheck: используется для проверки утечки памяти.
Callgrind: для анализа производительности собирает время выполнения программы и взаимосвязь вызовов.
И Кэшгринд, Хелгринд и т.д.
Здесь мы в основном используем инструмент Callgrind
3.2 Как использовать
Сначала вам нужно установить valgrind:
http://valgrind.org/downloads/valgrind-3.12.0.tar.bz2
После распаковки установочного пакета выполните: ./configue, make, make install последовательно.
Чтобы профилировать производительность с помощью valgrind, вы должны использовать valgrind для запуска программы:
valgrind --tool=callgrind --separate-threads=yes ./run
--separate-threads означает, нужно ли считать отдельно по потокам, если нет, то результаты всех потоков будут напечатаны в один файл, в противном случае они будут распечатаны в разные файлы по потокам.
После выполнения программы будет сгенерирован файл вида: callgrind.out.4263-01. Этот файл довольно сложно анализировать напрямую, и его необходимо просматривать графически.
3.3 Графический метод
Для графики valgrind нужно использовать kcachegrind.exe, вы можете скачать его самостоятельно, а после скачивания запустить на windows. Вот результат открытия callgrind.out.4263-01:
4 Сравнение инструментов
Для наших нужд: найти функцию с наибольшим временем выполнения и наибольшей загрузкой ЦП, эти три инструмента могут достичь цели. Но между ними все же есть определенный разрыв:
4.1 Метод запуска
Perf Can, монтируют процессы, но требуют корневых привилегий. При нормальных привилегиях Perf и Valgrind должны использовать метод запуска префикса для запуска программы, что в некоторой степени повлияет на производительность программы. В процессе тестирования стресса мы обнаружили, что при использовании VALGRIND начать, общее количество онлайн-пользователей, которые можно поддерживать, намного меньше, чем выполнение программы напрямую.
4.2 Внедрение программы
Ни Perf, ни Valgrind не должны модифицировать Makefile или программу, но gprof должен перекомпилировать файл, а для службы, которую поток выполняет все время, код должен быть изменен, чтобы позволить ему завершиться естественным образом, что вторгается в программу в определенных случаях. программы. Но с точки зрения влияния на производительность, gprof может максимально сохранить производительность исходной программы.
4.3 Отображение результатов
Результат GPROF - это перевернутое дерево, которое показывает потребление времени всех узлов из корня до листа; результат Perf представляет собой пирамиду, которая имеет одинаковую цель, что и GPROF; результат VALGRIND является односторонним Указав, что потребление времени на определенном пути вызова не является глобальным дисплеем.
4.4 Принцип контроля
Это очень профессиональная тема.В настоящее время принцип мониторинга тройки до конца не изучен, поэтому временно пуст. Все желающие могут провести исследование.
вопросы и ответы
Алгоритм планирования Linux в реальном времени?
Связанное Чтение
Введение в общие инструменты повышения производительности Linux
Общие команды и инструменты настройки Linux
Оптимизация производительности: разумная конфигурация больших страниц памяти в среде Linux.
Эта статья была разрешена автором для публикации в сообществе Tencent Cloud +, пожалуйста, укажите, если она перепечатана.Источник статьи
Исходная ссылка: https://cloud.tencent.com/developer/article/1063652