понедельник, 21 декабря 2020 г.

Используем perf и FlameGraph для поиска и визуализации проблем производительности в LibreOffice

В LibreOffice бывают иногда странные случаи, когда он зависает и жрет ресурсы компьютера, как не в себя. Например, загрузка процессора достигает 100% при каких-то банальных операциях. Это ненормально, как вы понимаете. Для того, чтобы программист понял, в каком собственно месте исходного кода ошибка, есть куча инструментов.
Например, perf - это утилита для оценки производительности системы из состава ядра linux. Она на уровне ядра собирает кучу всякой информации и записывает её в файл. Этот файл можно проанализировать потом и понять, где проблемное место. Проблема в том, что вывод этой утилиты весьма слабо читаемый и нужно потратить кучу времени на то, чтобы понять, где там что. А время - деньги. 
Так что один хороший человек написал FlameGraph - это инструмент, который обрабатывает результат вывода утилиты perf и на выходе даёт график, показывающий, какой именно процесс внутри программы занимает больше всего процессорного времени.
График получается в формате SVG и выглядит так вот примерно:
Чем шире полоска, тем больше времени процессора она занимала за исследуемое время, а чем она выше в графике, тем хуже.
Как получить такой график?
1. Нам нужен установленный linux дистрибутив, у меня это Kubuntu 19.04, в котором мы и будем работать далее.
2. Нам нужен установленный пакет linux-tools-$(uname -r), который и содержит утилиту perf. 
Примечание: Обратите внимание, пакет этот должен точно соответствовать текущей версии ядра, поэтому я и команду так написал! У меня было отдельное ядро, не из дистрибутива, к которому linux-tools я конечно не нашёл, пришлось перейти на дистрибутивное ядро. 
3. Также нужен пакет linux-tools-$(uname -r)-generic.
4. Нам нужен LibreOffice, собранный с опцией --enable-symbols (для этого вам потребуется большое количество оперативной памяти, больше 8Гб точно). Опция эта позволит программисту увидеть сразу проблемное место в коде достаточно точно.
5. Нам нужен FlameGraph. Его нужно просто скачать из git автора. Там есть зелёная кнопка "Clone or Download", жмите на неё и в выпадающем меню будет надпись "Download ZIP". Скачается архив, я распаковал его в каталог ~/soft/. Это важно, поскольку влияет на команды, которые мы будем запускать.
Примечание: FlameGraph из архива имеет имя своего каталога FlameGraph-master, я этот самый мастер удалил из имени для упрощения команды.
Для запуска perf без прав root нужно дать команду
sudo sysctl -w kernel.perf_event_paranoid=1
Предварительно запускаем LibreOffice (не системный, а свою сборку!). Я запускал из отдельной вкладки терминала. 
Для начала процесса сбора данных даём команду в каталоге FrameGraph: 
perf record -F200 --call-graph dwarf,65528 --pid=`pidof soffice.bin`
Команда соберет данные из запущенного LibreOffice.
Выполняете действия, которые приводят к проблеме. Закрываете LibreOffice (или убиваете процесс, если он завис).
В терминале будет написано нечто вроде:
[ perf record: Captured and wrote 292,351 MB perf.data (4667 samples) ]
Примечание: вообще-то объем файла perf.data здорово зависит от времени работы LibreOffice и количества действий, которые вы делаете. У меня почти 4Гб данные для графика выше заняли. Так что имейте ввиду, что в том месте, откуда вы даёте команды, есть достаточно свободного места.
Далее даём следующую команду:
perf script | ~/soft/FlameGraph/stackcollapse-perf.pl | ~/soft/FlameGraph/flamegraph.pl --width 1500 > perf.svg
Она и даст нам искомый график с именем perf.svg. Процесс создания SVG может занять достаточно длительное время. Этот SVG и надо прикрепить в багрепорт в багзилле. Вот в принципе и всё.

Комментариев нет:

Отправить комментарий

Внимание! Сообщения проходят премодерацию!