当前位置: 首页 > 知识库问答 >
问题:

Heroku Puma Sidekiq在3个web dynos上运行的Critical r14内存配额超过167%,只有一个访问者

司寇照
2023-03-14

我正在Heroku上运行Puma 3.4、Rails 4.2.6、Sidekiq 4.2.2、Redis Mini和3个dynos(标准1x)。我正在做简单的Beta测试,我似乎无法优化我的puma dyno情况。当一个用户在站点上时,我会收到高响应时间警报和关键内存配额警报(我使用New Relic进行监视)。

我添加了彪马工人杀手来试图诊断这个,但没有帮助。

我使用环境变量(max_线程、并发性等)设置了所有内容,并在互联网上搜索如何配置。

我正在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

config/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

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

我的当前环境设置

内存125-167%(在web动态对象上,而不是工作动态对象上)

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个答案

微生毅然
2023-03-14

对于Rails 4,即使在4级,也有太多的puma工作人员(对于该层来说,45是不可能的高)。标准1x dynos具有512MB。尝试将WEB\u并发性降低到2,我怀疑您将看到足够大的内存消耗减少,以防止R14s。

如果在将WEB\u并发性切换到2之后仍然有问题,则需要进行一些内存优化,或者将其降到1。

 类似资料:
  • 是帐单账户吗?还是那是一个随机事件? 我不相信我的应用程序超出了限制 限制多久重置一次? 在哪里可以看到每个服务/功能的实际限制? 非常感谢和抱歉给你发了这么长的帖子!

  • 我用的是Netty camel-Netty:jar:2 . 10 . 0 . red hat-60024。下面是我对Netty监听器的配置 荨麻:tcp://10.1.33.204:9001?textline=true 在这里,我看到基于调试日志,Netty只创建一个工作线程,所以传入的消息被阻塞,直到现有的消息被处理。 喜欢: 2014-08-23 12:36:48,394|DEBUG|w I/

  • 问题内容: 每次从stdin读取字母“ u”时,此代码段将分配2Gb,并且在读取“ a”后将初始化所有分配的字符。 我在具有3Gb内存的linux虚拟机上运行此代码。在使用htop工具监视系统资源使用情况时,我已经意识到malloc操作不会反映在资源上。 例如,当我仅输入一次“ u”(即分配2GB的堆内存)时,我看不到htop中的内存使用量增加2GB。只有当我输入“ a”(即初始化)时,我才会看到

  • 我们有一个项目,其中我们有几个Jenkins作业:一种类型的作业运行交付(a), 一个只进行编译和单元测试的程序(B) 和 运行集成测试、静态代码分析等(C)的人。 我们在四个 Jenkins 节点(主节点三个从节点)上运行,我们的作业是声明性管道作业的混合,并在 Jenkins 作业中手动单击。 我们一次只想为每个节点运行一个集成测试构建。然而,我们希望运行尽可能多的交付(A)和代码质量(B)构

  • 我使用Keras/Tensorflow在python中创建了一个程序。我对数据的创建和训练没有任何问题。但是,当我想评估我的模型时,我有以下错误: 这似乎是一个内存分配问题。我缩小了模型的尺寸,缩小了所有参数,但没有任何变化。我不知道如何解决这个问题。

  • 问题内容: 前几天,我接受了亚马逊的采访,他们问我一个问题,涉及以下问题。 给定2个整数数组,其中包含任意数量的正负元素,请查找出现在两个数组中的数字。 我能够非常轻松地解决此问题,因此它将具有计算复杂性,但是不幸的是,这还将具有空间复杂性。可以通过遍历每个数组中的所有元素而无需额外的内存来完成此操作,但这将是。 在我解释完该方法之后,面试官问我是否可以想到一种在计算上为O(n)但不会使用任何额外