Мне нужна помощь с моей конфигурацией Puma (Multi-Thread + Multi-Core Server) в моем приложении RoR4 Heroku. Документы Heroku об этом не совсем актуальны. Я последовал за этим: Concurrency and Database Connections для конфигурации, в которой не упоминается конфигурация кластера, поэтому мне пришлось использовать оба типа вместе (многопоточные и многострочные).Конфигурация кластера Puma на Heroku
Моя текущая конфигурация:
./Procfile
web: bundle exec puma -p $PORT -C config/puma.rb
./config/puma.rb
environment production
threads 0,16
workers 4
preload_app!
on_worker_boot do
ActiveRecord::Base.connection_pool.disconnect!
ActiveSupport.on_load(:active_record) do
config = Rails.application.config.database_configuration[Rails.env]
config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
config['pool'] = ENV['DB_POOL'] || 5
ActiveRecord::Base.establish_connection
end
end
Вопросы:
a) Нужна ли мне конфигурация before_fork/after_fork, как в Unicorn, так как рабочие кластера разветвляются ?.
b) Как настроить количество потоков в зависимости от моего приложения - в чем причина его отказа?/В каких случаях это может иметь значение? Не оптимизировано ли 0:16?
c) База данных Heroku позволяет 500 подключений. Что было бы хорошим значением для DB_POOL в зависимости от потока, рабочего и динамического счета? - У каждого потока на одного работника на динамод требуется единственное соединение БД при работе параллельно?
В целом: Как должна выглядеть моя конфигурация для параллелизма и производительности?
Когда дело доходит до настройки количества нитей. Я прочитал учебник по настройке работника Unicorn, который предложил запустить «ab» и увеличивать количество сотрудников (поток в вашем случае) до тех пор, пока не произойдет снижение производительности (запросы требуют больше времени для завершения). Хорошо сделать довольно динамичную страницу и посмотреть, как действуют разные запросы/параллельные пропорции (также имейте в виду, что если вы делаете много запросов, герою может вырезать вас, подозревая DoS) –
@MichaelSzyndel Итак, я в основном должен идти первым, хотя каждый рабочий , проверить производительность, а затем перейти через потоки и проверить еще раз? Разве это не зависит от того, что именно запрашивается? – Nikom
Из того, что я где-то читал, у Героку есть два ядра (4 виртуальных) на дино. Оптимально иметь один процесс на дино, и тогда вам решать, сколько потоков будет выполняться на каждый процесс. То, что я проверил бы с ab. Имейте в виду также, что если вы передадите 521 МБ ОЗУ, Heroku отправит оповещения и обменется на> 1 ГБ (подтвердите с помощью документов heroku). –