Rails Rails 多线程并发占用 CPU 问题

tomanderson · 2021年05月29日 · 最后由 nine 回复于 2021年05月30日 · 601 次阅读

在 server 机(4 核)开一个 rails,1 个客户端向 server 请求。假设该请求会消耗 100% 的 cpu,那么 server 机实际占用的 cpu 是 25%。无论这个请求多么耗 cpu,也不可能超过整机的 25%,因为 rails 是单进程 + 单线程模式。这个在预期内。

开 4 个不同的客户端同时向 server 请求,测试发现,server 机 cpu 占用仍然是 25%!难道无论有多少客户端请求,rails 只能利用 1 个 cpu 核心?rails 作为一个 web server,不应该这样吧?如果是这样的话,那上百万用户的网站,rails 怎么撑得过来?

我想知道,有没有办法让 rails 利用多核心,这样并发情况下可以多核负载?

把 web server 配置成多个实例呗。想要几个进程都行

ruby 2.x 多线程主要是减少了 IO 等待时间,提高 IO 密集场景下的 CPU 利用率。由于 GVL 的存在,实际上同一时刻只会有一段 ruby 代码被执行,也就是并发而不是并行,所以不管有几个客户端请求,单进程下也只能等同于单核的效率。GVL 是进程级别的,所以要用多核心就需要多开几个进程

ruby 3 加了 ractor 支持多核

手动的话起 4 个进程就好了。

一般用 passenger(nginx)管理进程,全自动的。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号