2014-01-06 4 views
4

У нас есть следующий конфигурационный файл для Unicorn. Мы находимся на Rails 3.2.12 и Mongoid 3.1.16. Как определить, сколько рабочих процессов нужно использовать? Существуют ли другие возможности для повышения производительности?Оптимизация Heroku, Rails и Единорога: определение правильных параметров конфигурации, таких как количество рабочих процессов?

Спасибо!

# config/unicorn.rb 
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3) 
timeout 25 
preload_app true 

before_fork do |server, worker| 
    # TERM signals indicates the Heroku Dyno is shutting down 
    Signal.trap 'TERM' do 
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead' 
    Process.kill 'QUIT', Process.pid 
    end 
end 

after_fork do |server, worker| 
    # TERM signals indicates the Heroku Dyno is shutting down 
    Signal.trap 'TERM' do 
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT' 
    end 
end 

ответ

4

Существует два ресурса, необходимых для запуска рабочего процесса Rails unicorn: память и процессор.

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

Например, если вашему приложению требуется около 110 мб (для этого нужны обычные Rails 3.2), вы можете поместиться около 4 на одном 1X динодере.

Heroku предоставляет 2X динамиков с большим объемом памяти и процессором. Я не рекомендую 2X динозавров, потому что они не поставили 2x производительности в наших тестах.

Вы можете раскрутить терминал на дино, чтобы вручную запустить единорога и измерить использование памяти с помощью:

> heroku run bash 
> unicorn -c config/unicorn.rb & # Run unicorn in the background 
> ps euf # Read RSS value for each worker, in kb - ie: 116040 ~ 116mb 

Вы можете просмотреть конфигурацию приложения с помощью:

> heroku config 
> heroku config | grep WEB_CONCURRENCY # Filter config output to WEB_CONCURRENCY 

EDIT: Heroku posted updated information about dyno sizing three months after I originally answered this.

+0

круто, спасибо! как вы порекомендовали нас измерять размер памяти в каждом приложении на одного человека-единорога? – Crashalot

+0

также как мы видим значение ENV ["WEB_CONCURRENCY"]? (кто-то другой настроил этот файл для нас.) спасибо! – Crashalot

+0

Обновлено, чтобы добавить эти две вещи. – Winfield

4

Как определить, сколько рабочих процессов необходимо использовать?

«Лучший» способ, который я определил, заключается в том, что мы медленно увеличиваем количество рабочих, пока динозаторы не начнут предупреждать вас о проблемах с памятью через файлы журнала. Из того, что я нашел для довольно общего приложения рельсов, получающего умеренный трафик, 1-й диновер может безопасно обрабатывать 3 рабочих-единорогов, а 2x-динамо может безопасно обрабатывать 7 единорогов. Я смог поднять это до 4 и 8 соответственно, но в течение дня или около того я начал получать ошибки памяти, и работники регулярно перезапускали себя.

Да, этот метод определения того, как много рабочих процессов является чрезвычайно грубой силой, но даже Heroku's Unicorn docs сказать «между 2-4 рабочих» ...

Существуют ли другие варианты, мы могли бы включать, чтобы повысить производительность?

Для Единорога? Наверное, нет, за пределами настройки своих работников ...

Кроме Unicorn, есть несколько относительно простых решений добавлять и интегрировать с приложением Rails Heroku:

  1. кэш, кэш, кэш. У Heroku есть куча промежуточных дополнений для кеширования. Я бы рекомендовал проверить memcache и/или redis - у обоих есть планы Heroku, которые можно попробовать, и очень быстро подключиться к вашему приложению.

  2. Я также хотел бы посмотреть, есть ли какие-либо процессы, которые могут выполняться работниками фона, используя либо sidekiq, либо resque. Вам нужно будет развернуть фонового работника на Heroku и configure your application, чтобы использовать фоновых работников - это будет стоить вам еще одного динозатраты, если потратить деньги, но если у вас есть функции длительной обработки в вашем приложении, лицевая часть может быть чрезвычайно значимой.

+0

Почему downvote? Это правильно в документах heroku. – CDub

10

Этот принятый в настоящее время ответ содержит некорректную информацию.

Согласно heroku docs on dyno size, 2X динамометрические стенды имеют долю процессора 2Х, не только двойной памяти:

enter image description here

Несмотря на это, так как число единорога работников, которые могут быть использованы связано с памятью footprint, вы, скорее всего, получите больше производительности из 2X-динода, где вы сможете лучше использовать доступную память.

Например, вы можете запустить один 2X-динамик с 7 рабочими единорога против двух 1X-динамиков с тремя рабочими-единорогами (всего 6). Кроме того, при использовании большего количества динамиков также может возникнуть некоторый накладной.

через heroku docs on optimizing dyno usage:

Высоко приложение зависит, в следующей таблице перечислены некоторые грубые правила для сколько Unicorn работников могут работать на каждом размере дины:

enter image description here

Имея это в виду, самое важное, что нужно знать для оптимизации использования, - это общий объем памяти. Вы можете включить log-runtime-metrics, чтобы иметь информацию об использовании памяти и процессора, напечатанную в журналах heroku. Это будет выглядеть примерно так:

source=web.1 dyno=heroku.2808254.d97d0ea7-cf3d-411b-b453-d2943a50b456 sample#load_avg_1m=2.46 sample#load_avg_5m=1.06 sample#load_avg_15m=0.99 
source=web.1 dyno=heroku.2808254.d97d0ea7-cf3d-411b-b453-d2943a50b456 sample#memory_total=21.00MB sample#memory_rss=21.22MB sample#memory_cache=0.00MB sample#memory_swap=0.00MB sample#memory_pgpgin=348836pages sample#memory_pgpgout=343403pages 

Как указано выше в связанной статье, вы можете использовать его в сочетании с librato add-on на график использования в течение долгого времени, чтобы получить лучшее представление о требованиях использования пиковое вашего приложения:

enter image description here

The NewRelic add on могут быть использованы для подобных целей.

Надеюсь, что это поможет.

Смежные вопросы