Подтвердить что ты не робот

Настройка производительности Rails для производства?

Я приближаюсь к развертыванию приложения, созданного на Rails 3.1.x, и начал выполнять некоторые тесты производительности. Поймав ab немного, я вижу некоторые очень обескураживающие результаты, которые дают около 15 запросов в секунду на Heroku.

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

Я запускаю Unicorn, что на 40% быстрее, чем Thin на Celadon Cedar. Кроме того, я использую общий доступ к PGSQL.

Я надеюсь, что кто-то может поделиться списком стилей или, по сути, контрольным списком запуска, который я должен переместить при подготовке приложения к производству и переходе к необходимости настройки скорости. До сих пор я не нашел реальный краткий список элементов, способных двигаться, что, кажется, имеет смысл, учитывая мою ситуацию.

Или, если у вас есть солидный практический опыт, проходящий через такие проблемы, любой ввод будет оценен!

4b9b3361

Ответ 1

Я потратил некоторое время на настройку своего приложения на heroku и некоторое время работал над настройкой производительности Rails-приложений в различных настройках.

Когда я запускаю ab -n 300 -c 75... myapp.com.... #, который является резервной копией на моем основном сайте, и находится на бесплатном плане кедра с единорогом

Requests per second:    132.11 [#/sec] (mean)
Time per request:       567.707 [ms] (mean)
Time per request:       7.569 [ms] (mean, across all concurrent requests)

(это против домашней страницы, которая не делает ничего интенсивного, поэтому я предоставляю ее только как "как быстро может быть герою на бесплатном плане с очень простой страницей?", например, а не "ваш приложения должны быть такими быстрыми" )

Вот мой контрольный список настройки производительности Rails 101:

  • Сначала измерьте время загрузки браузера/страницы (браузер делает много запросов, ab сообщает только об одном из них, и обычно ваш запрос главной страницы не является проблемой), получите базовые номера загрузки страницы из такие как www.webpagetest.org или www.gtmetrix.com для общедоступных страниц или инструментов браузера Yslow, google page скорость или динамичность для личных страниц. Если вы посмотрите на диаграмму загрузки страницы на странице (панель "Сеть" в chrome/firefox), она обычно показывает, что ваш html загружается быстро (в секундах), но затем все остальное занимает 1-3 секунды для загрузки. Следуйте рекомендациям Yslow/page speed о том, как улучшить (убедитесь, что вы используете материал конвейера Rails 3.1 в полной мере)

  • Прочитайте ваши файлы журналов/новую реликвию, чтобы найти сладкое пятно запроса "самый медленный/наиболее часто удачный" и профайл, что происходит для этого запроса (это медленный рубин/много использования памяти или лоты запросов?) У вас должен быть надежный способ обнаружения и мониторинга проблем производительности, а не просто менять вещи наугад. После того, как вы определили некоторые целевые области, создайте тестовые скрипты, которые помогут с тестированием до и после тестирования, и докажите, что ваши изменения помогают, и обнаруживают, что происходит регрессия.

  • Недостаток индексов на столбцах db является одной из наиболее распространенных проблем и проще всего адресовать. Запустите объяснение по целевым запросам или просмотрите журнал медленных запросов, чтобы узнать, что делает планировщик запросов. Добавьте индексы для внешних ключей, столбцов поиска или первичных данных (охватывающий индекс), если это необходимо. Повторите проверку с фактическими данными о производстве, чтобы доказать, что это имеет значение. (вы можете запустить объяснение в heroku, а также запустить запросы для отсутствующих или неиспользуемых индексов)

  • Большинство неудачных приложений Rails страдают от N + 1 запросов, потому что так легко писать order.owner.address.city и не думать о том, что происходит, когда это в цикле. Запросы N + 1 не обязательно являются медленными запросами, поэтому они не отображаются в журнале медленных запросов, а именно, что их много, и более эффективно делать все это сразу. Используйте: include или .includes() для активной загрузки этих данных или посмотрите на выполнение запроса другим способом.

  • Проанализируйте поток вашего приложения и найдите возможности кэширования. Если пользователь отскакивает назад и вперед между индексной страницей и страницей деталей и обратно, возможно, ajax-представление деталей, не выходя из индексной страницы, даст им нужные им данные быстрее. Я написал несколько больше мыслей об этом в своем блоге

Я выступил с презентацией об этих методах и других идеях в Чикаго в этом году на конференции WindyCityRails. Вы можете посмотреть видео здесь, в моем блоге www.RailsPerformance.com То, что я люблю в героике, - это то, что вы должны быть масштабируемыми с самого начала. Когда вы смотрите на обсуждения в списке рассылки, вы видите, что большинство людей знают о лучших примерах производительности и о том, как извлечь максимальную выгоду из сервера. Мне также нравится, как вы, если хотите остаться дешевым, вы узнаете, как трюки настройки производительности, которые будут вам наиболее эффективны.

Удачи!

Ответ 2

Есть некоторые довольно низко висящие фрукты, которые почти всегда приносят довольно достойные выигрыши в производительности:

  • Уменьшите количество запросов БД, используя более эффективные операторы ActiveRecord. Обязательно используйте include и join, где это необходимо, и убедитесь, что вы используете empty? поверх any?, где это возможно, чтобы избежать SELECT, когда вам просто нужен COUNT.
  • Особенно на более тяжелых страницах, представлениях кеша, даже если только на несколько минут. Вы можете часто разбивать большие или динамические части на частичные, которые можно кэшировать без каких-либо негативных эффектов.
  • Переместить любую активность по сети в фоновое задание. Это включает в себя отправку сообщений электронной почты, выборка страниц с веб-сайта и просмотр API (даже [особенно?] В Heroku). В Ruby существует множество действительно хороших библиотек обработки фоновых заданий, DelayedJob действительно популярен, потому что он работает с любой базой данных ActiveRecord, но мой любимый Resque.

Вам нужно быть осторожным, чтобы не тратить слишком много времени на оптимизацию рубиновых процедур. Если вы не делаете что-то с огромным количеством данных или обработкой (например, изменение размера изображения), вы, вероятно, не увидите очень значительных выигрышей от оптимизации циклов или минимизации использования памяти. И если вы обнаружите, что некоторые страницы проблематичны, загляните в свои журналы и посмотрите, что происходит во время этих запросов.

И если вы еще этого не сделали, автомасштабирование приложений, таких как HireFireApp, отлично подходит для того, чтобы вы обрабатывали множество запросов, масштабируя горизонтально, без затрат на выполнение посторонних динамиков в течение медленных периодов.

PS: есть новый Heroku Add-On, называемый Blitz, который позволяет протестировать одновременную нагрузку до 5000 пользователей.

Ответ 3

Самый полный единственный ответ - использовать что-то вроде NewRelic для инструмента вашего приложения и поиска медленных пятен. Затем вы можете применить оптимизацию или кэширование к вашему коду, чтобы сгладить эти медленные точки. Как клиент Heroku вы получаете бесплатную версию NewRelic - это надстройка, которую вы можете добавить к развертыванию с консоли Heroku.

Как только вы поймете, что замедляет вас, вы можете начать приближаться к нему. Heroku обрабатывает большинство всех функций настройки производительности, поэтому вам не нужно ничего делать. Тем не менее, вы по-прежнему сможете добиться больших выигрышей, оптимизируя запросы к базе данных и выполняя кеширование на фрагментах и ​​уровне действия, где это необходимо.

Ответ 4

Пока ничего не появилось, я дам ответ для PostgreSQL. Я не могу помочь с Ruby.

Вы можете найти отличные отправные точки для оптимизации производительности в вики PostgreSQL.

  • Настройка параметров (не уверен, насколько это возможно с Heroku)
  • Обратите особое внимание на медленные запросы
  • Проверьте hardware (не относится к Heroku)