Приложение Rails для пассажиров размещено * мучительно * медленно, но сервер зверь - PullRequest
26 голосов
/ 04 февраля 2010

Я работал над развертыванием сравнительно большого приложения Rails (Rails 2.3.5), и недавно проводил нагрузочное тестирование, и мы обнаружили, что пропускная способность сайта намного ниже ожидаемого уровня трафика.

Мы работали на стандартном 32-битном сервере, 3 ГБ ОЗУ с Centos, и мы использовали Ruby Enterprise Edition (последняя сборка), Passenger (Последняя сборка) и Nginx (Последняя сборка) - когда есть только один или два пользователя сайт работает нормально (как и следовало ожидать), однако, когда мы пытаемся увеличить нагрузку до ~ 50 одновременных запросов, он полностью умирает. (Отчет Apache Bench ~ 2,3 рэк / сек, что ужасно )

Мы запускаем RPM и пытаемся определить, где проблема с загрузкой, но она довольно равномерно распределена по Rails, SQL и Memcached, поэтому мы более или менее проходим и оптимизируем кодовую базу.

Из чистого отчаяния мы ускорили работу большого экземпляра EC2 (Ubuntu 9.10, 7,5 ГБ ОЗУ, 2 вычислительных блока / ядра) и настроили ту же конфигурацию, что и исходный сервер, и, хотя ресурсов было больше, мы все еще видели жалкие результаты .

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

В настоящее время конфигурация состоит из 15x Mongrels, которые проксируются через Nginx, и мы, похоже, отвечаем нашим требованиям к нагрузке просто , но этого недостаточно, чтобы я чувствовал себя комфортно при запуске ... Что мне было интересно, так это если кто-нибудь знает о возможных причинах этого ...?

Моя конфигурация для passenger / nginx была:

  • Работники Nginx: пробовали от 1 до 10, обычно три, хотя.
  • Максимальный размер пула пассажиров: 10–30 (да, эти цифры довольно высоки)
  • Пассажирские глобальные очереди: пробовал и выключать.
  • NGinx GZip on: да

Стоит отметить, что мы увеличили максимальный размер тела клиента nginx до 200 м, чтобы можно было загружать большие файлы.

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

Ответы [ 2 ]

18 голосов
/ 04 февраля 2010

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

2 голосов
/ 04 февраля 2010

В качестве первого шага я бы развернул в вашей среде минимальное Rails-приложение типа «Hello World» и посмотрел, какую пропускную способность вы получите. Это по крайней мере скажет вам, если ваша проблема связана с окружением или где-то в вашем приложении.

...