Я работаю над развертыванием относительно большого 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. Кроме того, разве это не должно было сделать это проще и лучше?