Ich betreibe Puma 3.4, Rails 4.2.6, Sidekiq 4.2.2, Redis Mini, auf 3 Dynoden (Standard 1x) auf Heroku. Ich mache einfache Beta-Tests und ich kann meine Puma-Dyno Situation nicht optimieren. Wenn ein Benutzer auf der Site ist, erhalte ich Warnungen bei hoher Reaktionszeit und kritische Speicherkontingente (ich verwende New Relic zur Überwachung).Heroku Puma Sidekiq Running 167% kritische r14 Speicherkontingent überschritten auf 3 Web-Dynos mit einem Besucher
Ich habe Puma Worker Killer hinzugefügt, um dies zu diagnostizieren, aber keine Hilfe.
Ich habe alles mit Umgebungsvariablen (max_threads, Nebenläufigkeit, etc) eingestellt und ich habe das Internet für die Konfiguration durchforstet.
Ich setze Optionen in database.yml, sidekiq.rb, puma.rb, puma_worker_killer.rb und sidekiq.yml, also könnte ich Dinge an zu vielen Orten setzen.
Da ich 3 Standard 1x Web-Dynos für einen Benutzer betreibe, weiß ich, dass etwas nicht stimmt.
config/puma.rb
before_fork do
require 'puma_worker_killer'
ActiveRecord::Base.connection_pool.disconnect!
PumaWorkerKiller.config do |config|
config.ram = ENV['PUMA_WORKER_KILLER_RAM'] || 1024 # mb
config.frequency = 5 # seconds
config.percent_usage = 0.98
config.rolling_restart_frequency = 12 * 3600 # 12 hours in seconds
end
PumaWorkerKiller.start
end
workers Integer(ENV['WEB_CONCURRENCY'] || 5)
min_threads_count = Integer(ENV['MIN_THREADS'] || 1)
threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5)
threads min_threads_count, threads_count
preload_app!
rackup DefaultRackup
port ENV['PORT'] || 5000
environment ENV['RACK_ENV'] || 'development'
on_worker_boot do
ActiveSupport.on_load(:active_record) do
ActiveRecord::Base.establish_connection
end
end
config/Initialisierungen/sidekiq.rb
require 'sidekiq'
redis_url = ENV['REDISTOGO_URL']
redis_config = {
url: redis_url,
namespace: 'oct',
}
Sidekiq.configure_server do |config|
config.redis = { url: ENV["REDISTOGO_URL"], namespace: 'oct', size: ENV["SIDEKIQ_SERVER_CONNECTIONS"].to_i || 6}
config.error_handlers << Proc.new do |exception, context_hash|
SidekiqErrorService.new(exception, context_hash).notify
end
end
Sidekiq.configure_client do |config|
config.redis = { url: ENV["REDISTOGO_URL"], namespace: 'oct', size: ENV["REDIS_CLIENT_CONNECTION_SIZE"].to_i || 2}
end
config/sidekiq.yml
:verbose: false
:concurrency: <%= ENV["WEB_CONCURRENCY"] %>
production:
:timeout: <%= ENV["SIDEKIQ_TIMEOUT"] %>
development:
:timeout: 30
:queues:
- [highest, 2]
- medium
- lowest
- mailers
config/Initialisierungen/puma_worker_killer.rb
PumaWorkerKiller.enable_rolling_restart
config/database.yml
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV["DB_POOL"] || ENV['RAILS_MAX_THREADS'] || 5 %>
development:
<<: *default
database: myapp_development
username: myapp
password: myapp
host: localhost
port: 5432
test:
<<: *default
database: myapp_test
username: myapp
password: myapp
host: localhost
port: 5432
meine aktuellen Umgebungseinstellungen
Speicher 125-167% (auf Web-Prüfständen, nicht Arbeiter dynos)
WEB_CONCURRENCY: 4
DB_POOL: 15
SIDEKIQ_SERVER_CONNECTIONS: 25
MIN_THREADS: 1
RAILS_MAX_THREADS: 5
REDIS_CLIENT_CONNECTION_SIZE: 1
SIDEKIQ_TIMEOUT: 30
DATABASE_REAP_FREQ: 5
PUMA_WORKER_KILLER_RAM: 1535
Ich habe auch versucht, diese zu verwenden Helfer http://manuelvanrijn.nl/sidekiq-heroku-redis-calc/
aber es machte es schlimmer, 300% + Speicher Verwendung
WEB_CONCURRENCY: 45
DB_POOL: 15
SIDEKIQ_SERVER_CONNECTIONS: 47
MIN_THREADS: 1
RAILS_MAX_THREADS: 5
REDIS_CLIENT_CONNECTION_SIZE: 1
SIDEKIQ_TIMEOUT: 30
DATABASE_REAP_FREQ: 5
PUMA_WORKER_KILLER_RAM: 1535