Я запускаю Puma 3.4, Rails 4.2.6, Sidekiq 4.2.2, Redis Mini, на 3 динамиках (стандартный 1x) на Heroku. Я делаю простое бета-тестирование, и я не могу оптимизировать свою ситуацию с puma-dyno. Я получаю предупреждения о высоком отклике и критические сообщения о квоте памяти, когда один пользователь находится на сайте (я использую New Relic для мониторинга).Heroku Puma Sidekiq Запуск 167% критической памяти r14 квоты превышен на 3 веб-динамика с одним посетителем
Я добавил Puma Worker Killer, чтобы попытаться диагностировать это, но никакой помощи.
У меня есть все, что задано с помощью переменных окружения (max_threads, параллелизм и т. Д.), И я проверил интернет для настройки.
Я устанавливаю параметры в database.yml, sidekiq.rb, puma.rb, puma_worker_killer.rb и sidekiq.yml, поэтому я мог бы устанавливать вещи в слишком многих местах.
Поскольку я запускаю 3 стандартных 1x веб-динамика для одного пользователя, я знаю, что что-то не так.
конфигурации/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
конфигурации/инициализаторы/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
конфигурации/sidekiq.yml
:verbose: false
:concurrency: <%= ENV["WEB_CONCURRENCY"] %>
production:
:timeout: <%= ENV["SIDEKIQ_TIMEOUT"] %>
development:
:timeout: 30
:queues:
- [highest, 2]
- medium
- lowest
- mailers
конфигурации/инициализаторы/puma_worker_killer.rb
PumaWorkerKiller.enable_rolling_restart
конфигурации/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
мои текущие параметры среды
памяти 125-167% (на веб динамометрических стендах, не работник динамометрические стенды)
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
Я также попытался использовать это хелпер http://manuelvanrijn.nl/sidekiq-heroku-redis-calc/
, но это сделало его еще хуже, 300% + память использование
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