2015-10-01 5 views
3

У меня возникли проблемы, выяснить, как именно параллелизм работает на Heroku, и как идти о создании оптимального :concurrency значение для SidekiqНастройка Sidekiq: параллелизм на Heroku

Вот настройки -

Puma Web Server 
    2 workers 
    5 threads 

Heroku Dynos 
    8 web dynos 
    2 "worker" dynos (These will run Sidekiq, not to be confused with Puma Workers) 

DB Connections 
120 Max Connections Allowed by Postgres 
5 Active Record Pool Size (default) 
?? Sidekiq :concurrency value 

Каждому работнику Puma разрешено использовать по умолчанию 5 соединений ActiveRecord DB (что хорошо соответствует каждому из 5 потоков). Поскольку в Web Dyno есть два из этих сотрудников Puma, каждый Web Dyno потребляет до 10 подключений. Во всех 8 веб-играх они занимают 80 соединений

Это оставляет 120 - 80 = 40 соединений, которые будут использоваться 2-мя динозаводами, которые будут запускать Sidekiq. Если предположить, что есть один процесс Sidekiq работает на каждом динамометре (это правда?), Каждый процесс Sidekiq свободно использовать до 20 соединений (т.е. набор :concurrency 20)

  1. Является ли эта логика верна, или я неправильно как эти процессы работают на динамиках?

  2. Ограничен ли процесс Sidekiq каким-либо ограничением пула соединений ActiveRecord 5? Если это так, звучит как установка его на 20 бесполезно, так как на самом деле она может использовать только максимум 5 подключений за раз.

Спасибо за помощь!

ответ

8

Ваша логика звучит правильно, но несколько нот.

Puma не будет нажимать на Sidekiq на все 5 потоков, чтобы вы могли использовать меньшее значение, например. поэтому 5 нитей имеют 2 соединения:

Sidekiq.configure_client do |config| 
    config.redis = { size: 2 } 
end 

Sidekiq concurrency - количество рабочих потоков, а не соединений. Вы хотите явно ограничить размер пула соединений:

Sidekiq.configure_server do |config| 
    config.redis = { size: 20 } 
end 

По умолчанию размер пула соединений Sidekiq является (параллелизм + 2), но 20 соединений должно работать нормально для параллельной обработки по умолчанию 25.

+0

Спасибо за ответ ! Quick follow-up - сервер Sidekiq подключается как к «ActiveRecord», так и к «redis». Когда мы говорим «соединения» и «пул соединений», он поддерживает отдельные пулы для обоих из них, или они извлекаются из одного и того же количества пулов, даже если они представляют собой два разных типа соединений? Более конкретно, в приведенном выше примере '' {size: 20} 'относится к соединениям с DB или ActiveX? – user2490003

+0

Sidekiq не имеет ничего общего с ActiveRecord или вашей БД. Rails управляет этими соединениями. –