Potrzebuję pomocy z moją konfiguracją Puma (Multi-Thread + Multi-Core Server) w mojej aplikacji RoR4 Heroku. Dokumenty Heroku na ten temat nie są jeszcze aktualne. Połączyłem się z tym: Concurrency and Database Connections dla konfiguracji, która nie wspomina konfiguracji dla Klastra, więc musiałem używać obu typów razem (gwintowane i wielordzeniowe).Konfiguracja Puma Cluster na Heroku
Moja obecna konfiguracja:
./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
Pytania:
a) Czy potrzebuję konfiguracji before_fork/after_fork jak w Unicorn, ponieważ pracownicy Cluster są rozwidleni ?.
b) Jak dostroić liczbę wątków w zależności od mojej aplikacji - jaki byłby powód jej odrzucenia?/W jakich przypadkach miałoby to znaczenie? Czy zoptymalizowano już 0:16?
c) Baza danych Heroku umożliwia 500 połączeń. Jaka byłaby dobra wartość dla DB_POOL w zależności od liczby wątków, liczby robotników i dyno? - Czy każdy wątek na pracownika na dyno wymaga równoległego połączenia DB podczas pracy równoległej?
Ogólnie: Jak powinna wyglądać moja konfiguracja pod kątem współbieżności i wydajności?
Jeśli chodzi o strojenie liczby wątków. Przeczytałem samouczek dotyczący tuningu pracownika Unicorn, który sugerował uruchomienie 'ab' i zwiększenie liczby robotników (wątek w twoim przypadku), aż do spadku wydajności (żądania wymagają więcej czasu, aby zakończyć). Dobrze jest wziąć dość dynamiczną stronę i zobaczyć, jak działają różne żądania/współbieżne proporcje (pamiętaj także, że jeśli wykonasz wiele żądań, heroku może odciąć cię od podejrzeń o DoS) –
@MichaelSzyndel Więc zasadniczo muszę pójść pierwszy choć każdy pracownik , sprawdź wydajność, a następnie przejdź przez wątki i sprawdź ponownie? Czy to nie zależy od tego, co dokładnie jest wymagane? – Nikom
Z tego, co czytałem gdzieś, Heroku ma dwa rdzenie (4 wirtualne) na dyno. Optymalne jest posiadanie jednego procesu na dyno, a następnie od Ciebie zależy, ile wątków uruchomi się na proces. Że będę testował z ab. Pamiętaj też, że jeśli przekażesz 521 MB pamięci RAM, Heroku wyśle ostrzeżenia i zamieni się na> 1 GB (potwierdź za pomocą docptów w heroku). –