【发布时间】:2016-09-09 17:17:52
【问题描述】:
我正在将 Nginx 与 Phusion Passenger 与单线程 Rails 应用程序一起使用。这就是问题所在。在该应用程序中,我使用多线程 sidekiq 来执行一些后台作业。通常在我的 database.yml 中,我只需要将池值设置为 1。这是一个示例:
default: &default
adapter: mysql2
encoding: utf8
collation: utf8_unicode_ci
pool: 1
username: username
password: password
host: localhost
原因是因为对于每个打开的 tcp 套接字连接,当一个 http 请求通过该套接字进入时,nginx 会接受该请求并将信息传递给乘客。乘客检测到它是一个 Rails 应用程序,它会生成一个 Rails 实例,它将响应转换为 html,将其发送回 nginx,然后将其传递回客户端(浏览器)所以对于每个乘客实例,我只需要一个数据库连接,带有单线程 Rails 应用程序。
但在我的 sidekiq.yml 中,我将并发设置为 5:
:concurrency: 5
这意味着对于每个乘客机架实例,我将有 5 个由 sidekiq 处理的并发线程加上一个用于主应用程序的连接,即一个乘客实例总共有 6 个数据库连接。
当我查看乘客状态时,我注意到 max_pool_size 设置为 6:
----------- General information -----------
Max pool size : 6
那么这是否意味着乘客永远不会同时产生超过 6 个 Rails 实例?如果是这种情况,这是否意味着我的数学是正确的:6(实例)* 6(数据库连接:sidekiq 为 5,主应用程序为 1)= 36(我的 rails 应用程序可以同时处理的数据库连接总数)。
现在我的 mysql 数据库配置为最多处理 151 个并发连接。
SHOW VARIABLES LIKE "max_connections";
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
我只是想确保我的关于乘客、轨道和 sidekiq 的数学是正确的。
【问题讨论】:
标签: ruby-on-rails passenger sidekiq