Оптимизация Ruby/Rails-приложений [Thinknetica]
Курс для практикующих Ruby/Rails-разработчиков, которые хотят:
После курса вы сможете:
Одна тема в неделю + задание на неделю.Проверка автором с подробным code review
Неделя 1. Оптимизация работы с памятью в ruby-программах
Алексей Васильев
Техлид в Busfor, кандидат технических наук (Github, LinkedIn)
Всерьёз втянулся в оптимизацию при написании кандидатской диссертации].
В научной работе на два порядка ускорил моделирование газотранспортных систем Газпрома за счёт применения архитектурных решений, параллельных и распределённых вычислений, расчётов на графических картах.
В 2015 году сменил академическую среду на продуктовую разработку на Rails.
В Busfor оптимизировал и продолжает оптимизировать всё, что тормозило
(бэкенд, фронтенд, postgres, sprockets, webpack, capistrano, тесты, CI, кэш и т.д.).
За время работы над проектом:
Курс для практикующих Ruby/Rails-разработчиков, которые хотят:
- всерьез заняться оптимизацией кода
- сделать свои проекты быстрее и эффективнее
- добиться профессионального и карьерного роста
- получать еще больший кайф от своей работы.
После курса вы сможете:
- Выстраивать стратегию оптимизации Rails-приложений: уметь определять и собирать нужные метрики, ставить обоснованные цели по производительности и достигать их
- Понять, что надо оптимизировать, а что лучше не стоит и подойти к оптимизации любого аспекта Rails-приложения так, чтобы добиться нужного результата
- Дружить со сборщиком мусора, профилировать и оптимизировать ruby и rails приложения по процессору и по памяти. Находить и устранять реальные bottleneck'и
- Настраивать и использовать мониторинг rails-приложений, настраивать production-окружение и production-like данные локально
- Оптимизировать работу СУБД, находить и оптимизировать медленные SQL-запросы, эффективно работать с индексами. Бороться с гидрой N+1, оптимизировать ActiveRecord и понимать, когда лучше работать в обход него
- Оптимизировать фронтенд под современный интернет, использовать кеширование по максимуму, понимать как браузер строит страницу, получая ответ сервера, и оптимизировать этот процесс
- Оптимизировать свой Development Experience: прогон тестов, сборку, деплой, CI и т.д.
- Оптимизировать настройки app-сервера, адаптировать серверы под неравномерную нагрузку
Одна тема в неделю + задание на неделю.Проверка автором с подробным code review
Неделя 1. Оптимизация работы с памятью в ruby-программах
- Оптимизация: общие подходы и мантра
- Планирование эксперимента
- Общая стратегия сбора метрик, постановки целей по оптимизации Rails-приложений
- Сбор метрик и постановка целей по оптимизации памяти
- Как устроена работа с памятью в ruby
- Сборщик мусора: эволюция, современное состояние, тюнинг
- Замеры использования памяти
- Memory leak vs Memory bloat
- Профилирование использования памяти, визуализация и анализ результатов
- Возможности сброса работы с ruby на более подходящие части технологического стека
- Альтернативные аллокаторы памяти, jemalloc
- Связь оптимизации памяти c оптимизацией CPU
- Сбор метрик и постановка целей по оптимизации CPU
- Особенности организации эксперимента с использованием CPU
- Бенчмаркинг ruby-программ
- Профилирование использования CPU в ruby-коде (rubyprof, stackprof, rbspy)
- Визуализация и анализ результатов профилирования CPU
- Разновидности, идентификация и устранение Bottleneck'ов
- Возможности использования оптимизированных библиотек для нагруженных частей проекта
- Параллельные вычисления в Ruby, GIL, потоки, процессы
- Закон Амдала
- Best-practices и gotchas
- Сбор метрик и постановка целей по оптимизации бэкенда
- Настройка production-like данных локально - зачем и как
- Уточнение роли бэкенда в цикле запрос-ответ-взаимодействие современного веб-приложения
- Работа с rack-mini-profiler
- Настройка и использование мониторинга NewRelic, Skylight, Scout
- Кеширование!
- Вынос ресурсоемких процессов в фоновые задачи
- Resque, Sidekiq и другие
- Профилирование rails-бэкенда, нагрузочные тесты, численные эксперименты
- Сбор метрик и постановка целей по оптимизации работы с базой данных
- Борьба с гидрой N+1
- Определение и исправление медленных запросов
- Сокращение количества запросов
- Кэширование сложных запросов
- Работа с планировщиком запросов БД с Explain Analyze
- Эффективная работа с индексами базы данных
- Vacuum, autovacuum и чем он может быть опасен
- Импорт больших объёмов данных с ActiveRecord и в обход него
- Польза, цена и альтернативы ActiveRecord
- Сбор метрик и постановка целей по оптимизации фронтенда
- Формирование Performance mindset у себя и в своей компании
- Оценка стоимости вашего фронтенда
- Работа с сервисом WebPageTest
- Настройка local-production окружения
- HTTP 1, 2, 3 и как с ними жить
- Preconnect, Prefetch, Preload, Server Push
- Конкатенация ассетов, CDN rotation, CDN внешних библиотек: за и против
- Gzip, brotli, zopfli, WebP
- Server-Sent Events, Streaming шаблонов в Rails
- Процесс построения браузером страницы в деталях
- Chrome Timeline как профилировщик фронтенда
- Формирование оптимального тега HEAD
- Critical CSS
- Оптимизация CSS-бандлов
- service-workers
- Работа с картинками, шрифтами
- Webpack bundle-analyzing, code-splitting, tree-shaking
- Автоматизация защиты от разбухания js-бандлов
- Интеграция инструментов контроля соблюдения бюджетов в CI
- PageSpeed Insights, Lighthouse
- Чек-листы производительного фронтенда
- Сбор метрик и постановка целей по оптимизации серверов
- Обзор и сравнение альтернативных app-серверов для Rails
- Закон Литтла
- Расчёт оптимальных настроек серверов для вашего проекта
- Контроль потребления памяти в production
- Отлов memory bloat в production
- Оптимизация Rails как фреймворка, derailed_behcnmarks
- Оптимизация серверов под неравномерную нагрузку
- Reverse Proxy
- Минимальная защита от DDoS
- Сбор метрик и постановка целей по оптимизации DX
- Ещё раз в важности feedback-loop для разработчика
- Оптимизация open-source инструментов
- Оптимизация скорости загрузки Rails
- Оптимизация прогона тестов
- Оптимизация деплоя
- Оптимизация пересборки
- Оптимизация CI
- Live-reload css и js
Алексей Васильев
Техлид в Busfor, кандидат технических наук (Github, LinkedIn)
Всерьёз втянулся в оптимизацию при написании кандидатской диссертации].
В научной работе на два порядка ускорил моделирование газотранспортных систем Газпрома за счёт применения архитектурных решений, параллельных и распределённых вычислений, расчётов на графических картах.
В 2015 году сменил академическую среду на продуктовую разработку на Rails.
В Busfor оптимизировал и продолжает оптимизировать всё, что тормозило
(бэкенд, фронтенд, postgres, sprockets, webpack, capistrano, тесты, CI, кэш и т.д.).
За время работы над проектом:
- снизил пиковую нагрузку на бэкенд в 5 раз с 15000rpm до 3000rpm
- ускорил деплой в 5 раз
- ускорил прогон тестов в 4 раза
- В 2 раза снизил потребление памяти приложения
- в 4 раза ускорил загрузку приложения
- ускорил импорт данных объёмом 3Гб в 20 раз, c 60 до 3х минут.
https://thinknetica.com/pro/rails_optimization