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

Пассажирское приложение Rails * болезненно * медленно, но сервер - зверь

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

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

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

Из явного отчаяния мы развернули большой экземпляр EC2 (Ubuntu 9.10, 7.5GB RAM, 2 Compute Units/Cores) и установили ту же конфигурацию, что и исходный сервер, и пока есть больше ресурсов, мы все еще видим патетические результаты.

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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