diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e2de380 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +#Jetbrains Tools +.idea/ diff --git a/case-study.md b/case-study.md new file mode 100644 index 0000000..6b9268d --- /dev/null +++ b/case-study.md @@ -0,0 +1,81 @@ +# О проекте + +Проект - _**админка**_, совмещенная с _**личным кабинетом**_ (_**ЛК**_) пользователей. + +Основной задачей _**ЛК**_ является предоставление пользователям возможности купить подписку на софт компании, +управлять этими подписками и прочее. + +_**Админка**_ же создана для хранения информации о пользователях, их подписках, счетах, платежах и так далее. + +Разрабатывается это все примерно года с 2013, большинство ужасного легаси кода уже выпилено, +но некоторые его отголоски доносятся до сих пор. + +Префоманс, в принципе, всех устраивает: +в _**ЛК**_ пользователи заходят не так часто, +в _**админке**_ сидит не больше 50 человек. +Отдельные страницы (например, с какими-то тяжелыми отчетами) могут открываться достаточно долго, +но они не слишком востребованы в работе (от силы несколько раз в неделю-месяц открываются), так что проблемой это не является. + +До прохождения курса были прикручены некоторые стандартные графики для `Grafana` и `NewRelic`. +Во время прохождения курса я также добавил `PgHero` и `rack-mini-profiler` для прода, +но это скорее не из необходимости оптимизации, а с заделом на будущее (ну и ради интереса). + +Работаю на проекте ~ 9 месяцев. + +# Оптимизация + +Но доколе оптимизировать что-то нужно, воспользуемся имеющимися средставами. + +## PgHero + +Начать я решил с `PgHero`. +За полтора месяца работы он успел пособирать статистику по проекту, потому воспользуюсь ей. + +_Suggested Indexes_ рекомендует добавить 3 индекса для запросов, которые вызывались 50-100 раз +(не совсем понимаю, за какой промежуток времени, но даже если за день - это очень мало) и выполнялись в среднем 20-50 мс. +Такая оптимизация не будет стоить ни времени, ни занятого места в БД под эти индексы, так что добавлять я их не буду. + +А вот в _Queries_ в топе висит очень жирный запрос - среднее время выполнения 8 секунд, +занимает 22% дневного времени загрузки. Правда, он выполняется асинхронно через `Cron`, +но такое в любом случае стоит оптимизировать. + +![Screenshot](reports/pghero_slow_query_before.jpg?raw=true) + +Добавил индекс, подождал выполнения `Cron` джобы, и вуаля: + +![Screenshot](reports/pghero_slow_query_after.jpg?raw=true) + +Один индекс изменил время выполнения запроса с 8_500 до 200 мс - очень хороший результат. + +## Тесты + +С коллегой решили задаться также оптимизацией test suite для улучшения DX и уменьшения времени CI. +Прикрутили разные полезности из предыдущей лекции, по-быстрому заменили что в глаза бросалось +и получился такой результат прогона CI: + +До оптимизации: + +![Screenshot](reports/ci_before.jpg?raw=true) + +После оптимизации: + +![Screenshot](reports/ci_after.jpg?raw=true) + +Пранируем в будущем добавить отправку времени прогона CI в InfluxDB, чтобы следить за деградацией. + +## Бонус + +Переписывал недавно одну из страниц проекта с React на Stimulus, заодно выкинув его целиком вместе с рядом зависимостей, +т.к. больше оно нигде не использовалось. +Получилось так, что билд с прекомпиляцией ассетов стал проходить на минуту-полторы быстрее, +да и эта страница стала грузиться по ощущениям несколько быстрее (но метрики с этого я не брал, так что не понятно насколько именно). +Цели оптимизировать не было, но результат оказался неплохим. +Порой просто удаление ненужных вещей из проекта может существенно увеличить производительность в каком-нибудь месте. + +До оптимизации: + +![Screenshot](reports/ci_with_react.jpg?raw=true) + +После оптимизации: + +![Screenshot](reports/ci_with_stimulus.jpg?raw=true) diff --git a/reports/ci_after.jpg b/reports/ci_after.jpg new file mode 100644 index 0000000..9c4bbd4 Binary files /dev/null and b/reports/ci_after.jpg differ diff --git a/reports/ci_before.jpg b/reports/ci_before.jpg new file mode 100644 index 0000000..b3828ad Binary files /dev/null and b/reports/ci_before.jpg differ diff --git a/reports/ci_with_react.jpg b/reports/ci_with_react.jpg new file mode 100644 index 0000000..130648a Binary files /dev/null and b/reports/ci_with_react.jpg differ diff --git a/reports/ci_with_stimulus.jpg b/reports/ci_with_stimulus.jpg new file mode 100644 index 0000000..b84b5e4 Binary files /dev/null and b/reports/ci_with_stimulus.jpg differ diff --git a/reports/pghero_slow_query_after.jpg b/reports/pghero_slow_query_after.jpg new file mode 100644 index 0000000..0db0e5f Binary files /dev/null and b/reports/pghero_slow_query_after.jpg differ diff --git a/reports/pghero_slow_query_before.jpg b/reports/pghero_slow_query_before.jpg new file mode 100644 index 0000000..96a313f Binary files /dev/null and b/reports/pghero_slow_query_before.jpg differ