-
Notifications
You must be signed in to change notification settings - Fork 47
HW 8 #18
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
HW 8 #18
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
## О проекте | ||
|
||
Я работаю в компании Jetrockets. | ||
|
||
Пишем проект для одной американской юридической компании, реализуем единое приложения удовлетворяющее их потребностям, раньше им приходилось использовать различный софт для разных задач, теперь с нашим приложением все находится в одном месте. | ||
|
||
Проект разрабатывается с конца февраля 2020 года. | ||
|
||
Я пришел на проект да и в целом в компанию в конце января 2021, в компании являюсь back-end разработчиком на ruby. | ||
|
||
Приложение представляет собой API которое общается с отдельным фронтом написанном полностью на Svelte. | ||
|
||
Перформанском в проекте особо не занимались поскольку проект предназначен для корпоративного клиента, | ||
Никаких систем мониторинга не используется, разве что шлем ошибки в rollbar | ||
|
||
## Stack | ||
0. Rails 6 | ||
1. Grape для написания API | ||
2. Dry-rb для валидаций и инициализаций | ||
3. PostgreSQL | ||
4. Rspec | ||
|
||
## Case 1 | ||
|
||
Начал оптимизировать проект с самой больной точки, это генерация отчета, его можно было посмотреть в веб версии и экспортировать в разные форматы. | ||
|
||
Проблема состояла в том что это происходило довольно медленно, особенно на моем компьютере, где стоял простой hdd, | ||
порой приходилось лезть на сервер где используется ssd что бы проверить как генерируется отчет. | ||
|
||
Мы это долго задумывали и как появилась возможность перевели работу в sidekiq, не знаю как, но он стал работать в десятки раз быстрее, мне так и не удалось выяснить почему синхронно и асинхронно была такая колоссальная разница во времени, возможно держа соединение открытым на время экспорта, что-то замедляло его. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Хм, да, загадочно |
||
|
||
## Case 1.1 | ||
|
||
я решил еще больше ускорить экспорт и начал с кода, профилировал его всеми изученными инструментами и особых проблем с кодом не было, он был написан довольно хорошо я нашел парочку больных точек которые не играли особой роли в скорости формирования отчета для экспорта, | ||
|
||
тогда я решил переключиться на базу данных, начал с pgHero, он мне показал медленные запросы, но их причина не была ясна, переключился на NewRelic, благо теперь он бесплатный для одного юзера, собрал небольшую аналитику и заметил что в запросе часто используется поиск по составному полю, я добавил индекс и удалось добиться ускорения примерно на 30% | ||
так же я заметил что часто используется связующая таблица, сделал релоад и магическим образом это помогло добиться двухкратного ускорения экспорта. | ||
|
||
До сих пор остается актуальной проблемой то что мы при экспорте грузим все записи в ОЗУ поскольку при выборке используется сложная сортировка, а батчами такую сортировку не выполнить. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Если вам это правда хочется исправить, то можно например в postgres создавать временную табличку на время работы этой джобы, где будет два столбца - FK на исходную табличку и значение показателя сортировки, которое считается в ruby. Батчами заполнить эту табличку. А далее приджойнить её к основной и отсортироваться по рейтингу. Ну что-то в этом духе. |
||
|
||
|
||
## Case 2 | ||
|
||
Занялся тестами, тесты шли 10 минут в одном потоке, а в parallel_tests ~3 минуты. | ||
|
||
Прогнал test-prof на наличие повторяющихся вызовов let и заменил их на let_it_be, за минимальные усилия удалось ускорить экспорт в два раза до 1.4 минуту(+1905 тестов), там еще есть много чего то можно оптимизировать но пока остановился на этом. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Да, 2x минимальными усилиями это кайф 👍 А если учесть ещё параллелизм, то 6x. |
||
|
||
### Итого | ||
|
||
В итоге удалось облегчить жизнь клиентам ускорил им экспорт, так и разработчикам ускорил им тесты. | ||
|
||
К сожалению проект на стадии завершения, сдаем буквально на следующей неделе и многое применить не удастся. | ||
|
||
Но как минимум коллеги оценили ускорение прогона тестов и test-prof точно станет часть проекта. | ||
|
||
### Проблемы при оптимизации | ||
|
||
Поскольку в качестве Api используется Grape то NewRelic не очень хорошо понимал что происходит в ресурсах, и на графиках выполнение Grape могло занимать 80% времени и не понятно что там внутри. | ||
|
||
let_it_be тоже следует применять осторожно поскольку он порождает нестабильные тесты, то проходят, то не проходят, у него видимо какие-то проблемы с ассоциациями которые создаются внутри фабрик. | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ох, grape кстати тяжкая штука в части мониторинга и оптимизаций.
На каждом проекте приходили к желанию выпилить grape )