Skip to content

Commit b5a7674

Browse files
arturovtalexandrtovmach
authored andcommitted
ru: translation of diagnostics-flamegraph.md (#2799)
* ru: translation of diagnostics-flamegraph.md * fix typo and pull from master
1 parent 9ba3c15 commit b5a7674

File tree

2 files changed

+125
-1
lines changed

2 files changed

+125
-1
lines changed
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
---
2+
title: Диагностика - Flame Graphs
3+
layout: docs.hbs
4+
---
5+
6+
# Flame Graphs
7+
8+
## Для чего нужен flame graph?
9+
10+
Flame graphs - это способ визуализации процессорного времени потраченного на функции. Они могут помочь вам определить, какие синхронные операции выполняются дольше всего.
11+
12+
## Как создать flame graph
13+
14+
Возможно, вы слышали о том, что в Node.js трудно создать flame graph, но это больше не так.
15+
Виртуальные машины Solaris больше не нужны для flame graph'ов!
16+
17+
Flame graph'ы генерируются из выходных данных `perf`, который не является специфичным Node.js инструментом. Хотя это наиболее эффективный способ визуализации затраченного процессорного времени, у него могут быть проблемы с оптимизацией кода JavaScript в Node.js 8 и выше. См. [проблемы вывода `perf`](#perf-output-issues) section below.
18+
19+
### Используйте предварительно упакованный инструмент
20+
21+
Если вы хотите в один ход получить flame graph, попробуйте [0x](https://www.npmjs.com/package/0x).
22+
23+
Для диагностики production deployments, читайте эти записи: [0x production servers](https://github.com/davidmarkclements/0x/blob/master/docs/production-servers.md)
24+
25+
### Создание flame graph'а с помощью системных инструментов
26+
27+
Цель это руководства - показать шаги, связанные с созданием flame graph'а и держать вас в курсе каждого шага.
28+
29+
Если вы хотите лучше понять каждый шаг, взгляните на следующие разделы, которые мы рассмотрим более подробно.
30+
31+
Теперь давайте приступим к работе.
32+
33+
1. установите `perf` (обычно доступен через пакет `linux-tools-common`, если он еще не установлен)
34+
2. попробуйте запустить `perf` - он может пожаловаться на отсутствующие модули ядра, установить их тоже
35+
3. запустите команду `node` с включенным `perf` (см. [проблемы вывода `perf`](#perf-output-issues) для подсказок, специфичных для разных версий Node.js)
36+
37+
```bash
38+
perf record -e cycles:u -g -- node --perf-basic-prof app.js
39+
```
40+
41+
4. игнорируйте предупреждения до тех пор, пока они не скажут вам, что `perf` не может быть запущен из-за отсутствия пакетов; вы также можете получить некоторые предупреждения о невозможности доступа к примерам модулей ядра, которые вам не нужны в любом случае
42+
5. запустите `perf script > perfs.out`, чтобы сгенерировать файл с данными, который вы вот-вот визуализируете. Также полезно [произвести некоторую чистку](#filtering-out-node-js-internal-functions) для того, чтобы получить более читабельный график
43+
6. установите `stackvis` если еще не установлен `npm i -g stackvis`
44+
7. запустите `stackvis perf < perfs.out > flamegraph.htm`
45+
46+
Теперь откройте файл flame graph'а в вашем любимом браузером и наблюдайте, как он горит. Он имеет цветовую кодировку, поэтому вы можете сосредоточиться на самых насыщенных оранжевых столбцах в первую очередь. Скорее всего, они отображают самые ресурсоемкие функции процессора.
47+
48+
Стоит упомянуть - если вы кликните по элементу flame graph'а, то над графиком отобразится увеличение его окружения.
49+
50+
### Использование `perf` для замерки запущенного процесса
51+
52+
Это отлично подходит для записи данных flame graph'а из уже запущенного процесса, который вы не хотите прерывать. Представьте себе продакшн процесс с трудновоспроизводимой проблемой.
53+
54+
```bash
55+
perf record -F99 -p `pgrep -n node` -g -- sleep 3
56+
```
57+
58+
Подождите, для чего нужна команда `sleep 3`? Она нужна для того, чтобы поддерживать работу `perf`. Несмотря на то, что параметр `-p` указывает на другой `pid`, команда должна быть выполнена в процессе и завершить его.
59+
`perf` выполняется столько, сколько выполняется команда, которую вы ему передаете, независимо от того, профилируете ли вы ее или нет. `sleep 3` гарантирует, что `perf` будет выполняться 3 секунды.
60+
61+
Почему параметр `-F` (частота профилирования) установлен в 99? Это по умолчанию. Вы можете настроить его как хотите.
62+
`-F99` говорит `perf` делать 99 отчетов в секунду, увеличивайте значение для большой точности. Более низкие значения должны давать меньше результатов с менее точными результатами. Точность, которая вам нужна, зависит от того, как долго выполняются ваши ресурсоемкие функции. Если вы ищете причину заметного замедления, 99 кадров в секунду должно быть более чем достаточно.
63+
64+
После того, как вы получите эту 3-секундную запись, приступайте к генерации flame graph'а, следуя двум последним пунктам сверху.
65+
66+
### Фильтрация внутренних Node.js функций
67+
68+
Обычно вы просто хотите увидеть производительность ваших собственных функций, поэтому фильтрация внутренних функций Node.js и V8 может значительно облегчить чтение графика. Вы можете почистить свой `perf` файл с помощью команды:
69+
70+
```bash
71+
sed -i \
72+
-e "/( __libc_start| LazyCompile | v8::internal::| Builtin:| Stub:| LoadIC:|\[unknown\]| LoadPolymorphicIC:)/d" \
73+
-e 's/ LazyCompile:[*~]\?/ /' \
74+
perfs.out
75+
```
76+
77+
Если вы читаете свой flame graph, и он кажется странным, как будто чего-то не хватает в ключевой функции, занимающей большую часть времени, попробуйте сгенерировать свой flame graph без фильтров - возможно, у вас возник редкий случай проблемы с самим Node.js.
78+
79+
### Опции профилирования Node.js
80+
81+
`--perf-basic-prof-only-functions` и `--perf-basic-prof` это те две опции, которые полезны для отладки вашего JavaScript кода. Другие параметры используются для профилирования самого Node.js, что выходит за рамки данного руководства.
82+
83+
Опция `--perf-basic-prof-only-functions` позволяет генерировать меньше вывода, поэтому это вариант с наименьшими издержками.
84+
85+
### Зачем они мне нужны?
86+
87+
Ну, без этих опций вы в любом случае получите flame graph, но большинство столбцов будет с надписью `v8::Function::Call`.
88+
89+
## Проблемы вывода `perf`
90+
91+
### Изменения в пайплайне Node.js 8.x V8
92+
93+
Node.js 8.x и выше поставляется с новыми оптимизациями для пайплайна компиляции JavaScript в движке V8, который иногда делает имена/ссылки на функции недоступными для `perf`. (Это называется Turbofan)
94+
95+
В результате названия ваших функций может выглядеть неправильно на flame graph'е.
96+
97+
Вы увидите что-то вроде `ByteCodeHandler:` там, где должны быть названия функций.
98+
99+
В [0x](https://www.npmjs.com/package/0x) встроены некоторые меры пресечения этого.
100+
101+
Подробнее см.:
102+
103+
* https://github.com/nodejs/benchmarking/issues/168
104+
* https://github.com/nodejs/diagnostics/issues/148#issuecomment-369348961
105+
106+
### Node.js 10+
107+
108+
Node.js 10.x решает проблему с Turbofan с помощью флага `--interpreted-frames-native-stack`.
109+
110+
Запустите `node --interpreted-frames-native-stack --perf-basic-prof-only-functions`, чтобы получить имена функций в flame graph'е независимо от того, какой пайплайн V8 использовался для компиляции вашего JavaScript кода.
111+
112+
### Неправильные подписи на flame graph'е
113+
114+
Если вы видите подписи, похожие на эту:
115+
116+
```
117+
node`_ZN2v88internal11interpreter17BytecodeGenerator15VisitStatementsEPNS0_8ZoneListIPNS0_9StatementEEE
118+
```
119+
120+
это означает, что используемая вами версия `perf` не была скомпилирована с поддержкой demangle, см. https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1396654 для примера
121+
122+
## Примеры
123+
124+
Потренируйтесь создавать flame graph'ы самостоятельно с [этим заданием](https://github.com/naugtur/node-example-flamegraph)!

locale/ru/docs/guides/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ layout: docs.hbs
1010
* [Первые шаги](/ru/docs/guides/getting-started-guide/)
1111
* [Отладка - начало работы](/ru/docs/guides/debugging-getting-started/)
1212
* [Простое профилирование Node.js приложений](/ru/docs/guides/simple-profiling/)
13-
* [Diagnostics - Flame Graphs](/en/docs/guides/diagnostics-flamegraph/)
13+
* [Диагностика - Flame Graphs](/ru/docs/guides/diagnostics-flamegraph/)
1414
* [Докеризация веб-приложения Node.js](/ru/docs/guides/nodejs-docker-webapp/)
1515
* [Migrating to safe Buffer constructors](/en/docs/guides/buffer-constructor-deprecation/)
1616

0 commit comments

Comments
 (0)