gpt4 book ai didi

ruby-on-rails - Rails Puma 耗尽 Redis 连接

转载 作者:可可西里 更新时间:2023-11-01 11:05:13 27 4
gpt4 key购买 nike

我已经查看了有关 SO 的其他类似问题,但无法很好地将所有内容拼凑在一起。我有一个 Rails 应用程序(在 Heroku 上),它使用具有多进程和多线程的 Puma。我的应用程序还使用 Redis 作为辅助数据存储(除了 SQL 数据库之外),直接查询 Redis(好吧,通过 connection_pool gem)。这是我的 Puma 配置文件:

workers Integer(ENV["WEB_CONCURRENCY"] || 4)
threads_count = Integer(ENV["MAX_THREADS"] || 5)
threads threads_count, threads_count

preload_app!

rackup DefaultRackup
port ENV["PORT"] || 3000
environment ENV["RACK_ENV"] || "development"

on_worker_boot do
# Worker specific setup for Rails 4.1+
ActiveRecord::Base.establish_connection

redis_connections_per_process = Integer(ENV["REDIS_CONNS_PER_PROCESS"] || 5)
$redis = ConnectionPool.new(size: redis_connections_per_process) do
Redis.new(url: ENV["REDIS_URL"] || "redis://localhost:6379/0")
end
end

我的 Redis 实例有 20 个连接限制,我发现自己经常超过这个限制,尽管应该(据我所知)每个进程只有 5 个连接,分布在 4 个工作进程中。

事实上,当我将 REDIS_CONNS_PER_PROCESS 设置为 1 时,我什至会收到 max number of clients reached Redis 错误。是否为每个线程调用了 on_worker_boot而不是每个过程?

我也尝试过使用单独的 redis.rb 初始化程序,即使 REDIS_CONNS_PER_PROCESS 为 1,它仍然会给我错误。这看起来很奇怪,因为我应该能够如果我的数学计算正确(4 个工作进程 + 1 个主进程)* 每个进程 4 个连接,最多可以有 4 个连接。 (请注意,出于这个问题的目的,我忽略了部署过程中发生的错误,因为我假设 Heroku 可能会在该过程中连接新旧进程,即使我没有使用 Preboot。)

我哪里误解了这一切是如何组合在一起的?

最佳答案

我遇到了类似的问题。一开始我用的是redis-togo,没问题。但是在我从 redis-togo 更改为 Heroku redis 之后,我得到了“ERR max number of clients reached”错误。

我的应用程序的代码没有改变,redis 提供者的改变是唯一的。

我在 Heroku 支持处开了一个工单,他们建议我更改超时值的默认设置。

https://devcenter.heroku.com/articles/heroku-redis#configuring-your-instance

在我更改了Heroku redis的默认超时值后,一切都解决了。我猜 redis 提供者的 redis 超时默认值是不同的。而 Heroku redis 的默认设置是 0。“零值意味着连接不会关闭。”

希望我的经验对您有所帮助。

关于ruby-on-rails - Rails Puma 耗尽 Redis 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31810396/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com