Я работал над несколькими приложениями рельсов, которые испытывали высокую нагрузку из-за вирусного роста на 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 (это только те, которые я могу придумать не по себе):
Если вы этого еще не сделали, убедитесь, что правильно используете индексы в таблицах вашей базы данных.
Избегайте вызовов базы данных в представлениях, особенно частичных, может быть очень легко потерять отслеживание того, сколько вы делаете запросов к базе данных в представлениях. Вставьте все запросы и расчеты в ваши модели или контроллеры.
Избегайте запросов в итераторах. Обычно это можно сделать с помощью: include.
Избегайте того, чтобы рельсы максимально создавали объекты ActiveRecord для больших наборов данных. Когда вы делаете вызов, такой как Post.find (: all) .size, для каждого сообщения в вашей базе данных создается новый класс (и это может быть также большой запрос). В этом случае вы захотите использовать Post.count (: all), который сделает один быстрый запрос и вернет целое число без создания каких-либо объектов.
Ассоциации типа User..has_many :objects
создают метод user.objects
и user.object_ids
. Последний пропускает создание экземпляров объектов ActiveRecord и может быть намного быстрее. Особенно при работе с большим количеством объектов это хороший способ ускорить процесс.
Учитесь и используйте 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.
Удачи!