1 of 62

Алексей Яковлев,

Frontend Community Lead, Яндекс Практикум

Профилирование Node.js, �или Как ускорить Практикум �в несколько раз

2 of 62

Кто я такой

2

  • Развиваю фронтенд и его сообщество �в Практикуме
  • Помогаю командам преодолевать препятствия

3 of 62

Яндекс Практикум

— это сервис онлайн-обучения, где можно стать профессионалом в IT

Ну а на фронтенде это 5-летний React монолит с самописным BFF, но об этом потом

Количество активных студентов, которые живут в тренажёрах

4 of 62

Яндекс Практикум

— это сервис онлайн-обучения, где можно стать профессионалом в IT

Количество активных студентов, которые живут в тренажёрах

5 of 62

О чём пойдёт речь

  • Почему мы взялись за скорость фронтенда
  • Какой была производительность�фронтенда Практикума
  • Как мы подступились к диагностике
  • Почему начали фиксить не то, что нужно
  • Какие результаты в итоге получили
  • …и чему научились

6 of 62

Очень долго загружается и глючит

Последнее время что-то долго думает

Всё очень медленно грузится

Мне нравится интерфейс. Но иногда бывает,

что медленно загружается

Долго прогружаются страницы. Именно �в Практикуме, остальные нормально

Интерфейс медлителен, тяжеловат

Есть минусы долгая загрузка

уроков и тем

Вот что говорили наши студенты

7 of 62

Очень долго происходит проверка задания со стороны платформы, настолько долго, настолько это наносит урон и так по пошатнувшейся психике учащегося, что лично я проклинаю того, по чьей вине так долго грузит платформа. �Уж простите, говорю то, что думаю.

Чтобы тот, кто написал такой плохой движок для платформы Практикума, стал фанатичным графоманом и писал в Википедии самые бесполезные и мерзкие статьи. Вот моё ему пожелание.

Вот что говорили наши студенты

Очень долго загружается и глючит

Последнее время что-то долго думает

Все очень медленно грузится

Мне нравится интерфейс. Но иногда бывает,

что медленно загружается

Долго прогружаются страницы. Именно в Практикуме, остальные нормально

Интерфейс медлителен, тяжеловат

Есть минусы долгая загрузка

уроков и тем

8 of 62

9 of 62

график ходит волнами

10 of 62

LCP > 6s очень много

график ходит волнами

11 of 62

TTFB

FCP

LCP

12 of 62

TTFB

FCP

LCP

13 of 62

TTFB

FCP

LCP

14 of 62

TTFB

FCP

LCP

15 of 62

16 of 62

Как измерить производительность API

17 of 62

график BFF

ходит волнами

18 of 62

время ответа BFF

в разы выше бэкенда

график BFF

ходит волнами

19 of 62

20 of 62

Куда ставить console.log?

30 мидлварь

30 мидлварь

Обработчик

Server Side Rendering

21 of 62

DevTools

22 of 62

Профайлер Node.js

1

2

3

4

23 of 62

Профайлер Node.js

1

2

3

4

24 of 62

Профайлер Node.js

1

2

3

4

25 of 62

Профайлер Node.js

1

2

3

4

26 of 62

27 of 62

28 of 62

29 of 62

ПОЧЕМУ?

30 of 62

  • Object.assign(Context, ContextKeeper) бесполезен, можем удалить

31 of 62

  • Object.assign(Context, ContextKeeper) бесполезен, можем удалить
  • Вычисление value тоже не нужно

32 of 62

  • 2(!) reduce�с Object Spread аккумулятора внутри

33 of 62

А почему всё тормозило?

https://www.richsnapp.com/article/2019/06-09-reduce-spread-anti-pattern

for (let i = 0; i < length; ++i) {� for (let g = 0; g < i; ++g) {

// …

}�}

reduce((acc, elem) => {

return { …acc, [elem]: elem }

}, {})

34 of 62

reduce({...spread}) => O(n^2)

35 of 62

Новый профайлинг

36 of 62

37 of 62

38 of 62

Куда ставить console.log?

30 мидлварь

30 мидлварь

Обработчик

Server Side Rendering

39 of 62

Всё-таки инструментируем логами

40 of 62

Но подсчёты не сходятся!

41 of 62

Профилировать

в тестовом окружении

Профилировать

в проде

42 of 62

Профилируем в проде

43 of 62

44 of 62

45 of 62

46 of 62

47 of 62

48 of 62

это трассировка?

console.log

ну мы

49 of 62

https://opentelemetry.io

50 of 62

51 of 62

52 of 62

✅ небольшой оверхед

✅ удобно разворачивает асинхронные вызовы

✅ автоматически инструментирует Express и HTTP-запросы

✅ в целом улучшает Observability системы

❌ нужно поднимать инфраструктуру

❌ нужно частично инструментировать вручную

53 of 62

ClinicJS

54 of 62

55 of 62

56 of 62

✅ автоматические советы «что болит и, возможно, почему»

✅ можно закопаться в детали без инструментации вручную

❌ эвристика bubbleprof не всегда упрощает работу

❌ нужно завершить работу приложения, чтобы получить результаты

❌ неудобно профилировать удалённое приложение

❌ высокий порог входа и сложный интерфейс

❌ для синхронных нужд Chrome DevTools более чем достаточно

ClinicJS

57 of 62

Инструмент

Chrome

DevTools

Трейсинг

OpenTelemetry

ClinicJS

Синхронные операции

Асинхронные операции

Память

Заметки

Быстрый старт и большой функционал

Нужна инфраструктура, но качественное улучшение обозреваемости

Сложно, неудобно, но очень подробно

58 of 62

Как найти проблему своевременно?

59 of 62

Ставьте алерты

на производительность

60 of 62

Проводите нагрузочное тестирование

61 of 62

Chrome DevTools

  • Для профилирования синхронных операций и памяти�

Трейсинг OpenTelemetry

  • Для профилирования асинхронных операций и обозреваемости

ClinicJS

  • Для профилирования асинхронных операций и когда ничего не понятно

Алерты на пользовательские метрики и тайминги API

  • Чтобы замечать замедления клиента

Нагрузочное тестирование

  • Чтобы знать свои пределы и замечать деградации

Выводы

62 of 62

Спасибо за внимание!

Алексей Яковлев,

Frontend Community Lead, Яндекс Практикум

Telegram�@alexeyjakovlev

Слайды