2016-11-04 6 views
1

Я запускаю 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 

ответ

1

Для Rails 4 у ​​вас слишком много работников puma даже в 4 (45 невозможно для этого уровня). Стандартные-1x имеют 512 МБ. Попытка сбросить WEB_CONCURRENCY до 2, и я подозреваю, что вы увидите достаточно значительное сокращение потребления памяти, чтобы предотвратить R14.

Если у вас по-прежнему возникают проблемы после переключения WEB_CONCURRENCY на 2, вам нужно будет сделать некоторые оптимизации памяти или сбросить их до 1.