Как подготовиться, чтобы быть технологичным - PullRequest
1 голос
/ 23 марта 2009

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

Наша производственная установка состоит из 2 срезов EngineYard, каждый с 3 экземплярами mongrel, с использованием Postgres в качестве сервера базы данных.

Очевидно, что огромная часть того, как наше приложение будет выдерживать, связана с нашим реальным кодом, запросами и т. Д. Однако было бы хорошо узнать, есть ли какие-либо советы / указатели относительно того, какую нагрузку ожидать или что от нее происходит люди, которые прошли через это. Похоже ли, что 6 экземпляров беспородных (возможно, 8, если серверы могут их принять) справятся с нагрузкой, или, по крайней мере, большинство из них?

Ответы [ 6 ]

3 голосов
/ 31 марта 2009

Я работал над несколькими приложениями рельсов, которые испытывали высокую нагрузку из-за вирусного роста на Facebook.

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

Убедитесь, что на вашем сервере используется Fair Proxy Balancer (не Round Robin). Вот модуль nginx, который делает это: http://github.com/gnosek/nginx-upstream-fair/tree/master

А вот еще несколько советов по улучшению и оценке производительности вашего приложения для обработки нагрузки:

ActiveRecord

Самая распространенная проблема, с которой сталкиваются приложения Rails, - плохое использование объектов ActiveRecord. Это может быть довольно легко сделать сотни запросов, когда нужен только один. Самый простой способ определить, может ли это быть проблемой с вашим приложением, - настроить New Relic . Сделав запрос на каждую главную страницу вашего сайта, взгляните на новый реликтовый обзор SQL. Если вы видите большое количество очень похожих запросов последовательно (выберите * из сообщений, где id = 1, выберите * из сообщений, где id = 2, выберите * из сообщений ...), это может быть признаком того, что вам нужно использовать: включить в один из ваших вызовов ActiveRecord.

Некоторые другие базовые советы ActiveRecord (это только те, которые я могу придумать не по себе):

  1. Если вы этого еще не сделали, убедитесь, что правильно используете индексы в таблицах вашей базы данных.

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

  3. Избегайте запросов в итераторах. Обычно это можно сделать с помощью: include.

  4. Избегайте того, чтобы рельсы максимально создавали объекты ActiveRecord для больших наборов данных. Когда вы делаете вызов, такой как Post.find (: all) .size, для каждого сообщения в вашей базе данных создается новый класс (и это может быть также большой запрос). В этом случае вы захотите использовать Post.count (: all), который сделает один быстрый запрос и вернет целое число без создания каких-либо объектов.

  5. Ассоциации типа User..has_many :objects создают метод user.objects и user.object_ids. Последний пропускает создание экземпляров объектов ActiveRecord и может быть намного быстрее. Особенно при работе с большим количеством объектов это хороший способ ускорить процесс.

  6. Учитесь и используйте named_scope, когда это возможно. Это поможет вам сохранить крошечный код и значительно упростить эффективные запросы.

Внешние API и ActionMailer

Столько, сколько вы можете, не совершать API-вызовы внешним сервисам при обработке запроса. Ваш сервер прекратит выполнение кода, пока не будет получен ответ. Мало того, что это увеличит время загрузки, но ваш дворняга не сможет обрабатывать новые запросы.

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

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

Для решения этой проблемы были созданы такие инструменты, как BackgroundRB .

Кэширование

Вот хорошее руководство по различным методам кэширования в рельсах.

Сравнительный анализ (определение проблем с производительностью) Если вы подозреваете, что метод может быть медленным, попробуйте сравнить его в консоли. Вот пример:

>> Benchmark.measure { User.find(4).pending_invitations }
=> #<Benchmark::Tms:0x77934b4 @cutime=0.0, @label="", @total=0.0, @stime=0.0, @real=0.00199985504150391, @utime=0.0, @cstime=0.0>

Следите за медленными методами в вашем приложении. Это те, которые вы хотите избежать часто выполнять. В некоторых случаях только первый вызов будет медленным, так как в Rails есть кеш запросов. Вы также можете кэшировать метод самостоятельно, используя Memoization .

NewRelic также предоставит хороший обзор того, как долго выполняются методы и вызовы SQL.

Удачи!

1 голос
/ 23 марта 2009

Посмотрите некоторые программы для нагрузочного тестирования, такие как WEBLoad или, если у вас есть деньги, Quick Test Pro. Это поможет дать вам некоторое представление. WEBLoad может быть лучшим тестом в вашей ситуации.

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

0 голосов
/ 31 марта 2009

У нас в основном те же настройки, что и у вас, 2 прод-среза и промежуточный срез в EY. Мы обнаружили, что ab - отличный инструмент для нагрузочного тестирования - просто напишите bash-скрипт с URL-адресами, которые вы ожидаете получить, и укажите его на свой фрагмент. Посмотрите статистику NewRelic, и она должна дать вам некоторое представление о нагрузке, которую может выдержать ваше приложение, и о том, где вам может потребоваться оптимизировать.

Мы также обнаружили, что query_reviewer также очень полезен. Он отлично подходит для поиска этих неиндексированных таблиц и n + 1 запросов.

0 голосов
/ 25 марта 2009

Ваши большие проблемы, вероятно, будут заключаться не в количестве входящих запросов, а в количестве данных в вашей базе данных, показывающих, где ваши запросы не используют ожидаемые вами индексы или возвращают слишком много данных, например, Страница списка пользователей работает с 10 пользователями, но умирает, когда вы пытаетесь отобразить 10 000 пользователей на этой странице, потому что вы не добавили пагинацию (плагин will_paginate - почти ваш друг - следите за запросами "select count (*)" сгенерировано для вас)

Итак, две вещи, которые нужно посмотреть:

  1. Отсутствующие индексы
  2. Слишком много данных на странице

Для # 1 есть плагин, который запускает запрос объяснения после каждого запроса, так что вы можете проверить использование индекса вручную

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

Для # 2 используйте плагин will_paginate или другой способ уменьшить количество данных на страницу.

0 голосов
/ 23 марта 2009

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

0 голосов
/ 23 марта 2009

По моему опыту, наблюдая за тем, как некоторые из наших клиентов поглощают хруст, трафик был довольно скромным - не то, что люди, похоже, ожидают от того, что они сокрушают кости. Теперь, если вы получаете синдицирование и делаете на странице Yahoo или что-то еще, все может быть иначе.

Ищите опыт Facestat.com, если хотите прочитать о том, как они справились с этим (Yahoo FP.)

Мой совет - будьте готовы отключить регистрацию или перейти на более статичную версию своего сайта, если ваши серверы слишком нагреваются. Также неплохо использовать инструмент мониторинга / профилирования, мне нравится инструмент FiveRuns Manage для простоты установки.

...