Rails puma 中的 threads 和 workers 配置应该如何设置比较好?

QueXuQ · 2015年03月05日 · 最后由 eastrj 回复于 2019年05月21日 · 5361 次阅读

我的 puma 配置如下:

daemonize true
pidfile "/home/deployer/xxx/shared/tmp/pids/puma.pid"
state_path "/home/deployer/xxx/shared/tmp/pids/puma.state"
stdout_redirect '/home/deployer/xxx/shared/log/puma_error.log', '/home/deployer/xxx/shared/log/puma_access.log', true

threads 0,16

bind 'unix:///tmp/xxx.sock'

workers 0

preload_app!

on_restart do
  puts 'Refreshing Gemfile'
  ENV["BUNDLE_GEMFILE"] = "/home/deployer/xxx/current/Gemfile"
end

都是使用默认的配置,然后会出现如果访问量和搜索数量量大时,puma 会挂掉的情况,需要手动进行重启cap production puma:start。 而且我在使用 sidekiq 的时候,发现它也会出现挂掉的情况,但是它缺很奇怪,自动的重启回来,对这个事情非常好奇。后面找了很多相关的信息,好像和 workers 有关,但是不是特别了解情况。不知道各位有什么服务器方面的建议吗?

其实你知道是 workers 了 workers 设置,可以在单进程和多进程 cluster 模式之间自动切换,如果是 0,则不启动 master 进程,只有一个单进程,如果 workers 不是 0,则启动 1 个 master 和多个 workers。而且 master 进程不会加载应用代码,master 进程占有内存非常少,基本是不会挂掉的,细心观察 workers 进程在一定时间就会变动,相关于重启内存回收。 workers 一般设置成 cpu 核心数,threads 也可以根据硬件条件设置,这个多看看 puma 文档就知道了

好的,谢谢。我尝试一下,看看把 workder 调高的情况。 #1 楼 @xxqfamous

@xxqfamous 比如 aws(虚拟)核心是 16, 那么 worker 设成 16,还是把 threads 设成 16 为好?

@zealinux threads 是线程数,worker 是进程,当 workder=1 时也可以将 threads 设成 16 或更高,核心数是 16 当然 worker 设成 16 是没有问题,但 threads 是需要同时设置的,一般默认初始大小是 0:16,通常设置 8:32 最为合适吧,我曾经也测试过 threads 值 8:64 越大是不是更好,事实效果不明显也可以说不好,决定性在于核心数。

woker 调高会导致内存占用超高……

tomanderson Puma worker 有内存回收/重启机制吗? 提及了此话题。 06月01日 18:13
需要 登录 后方可回复, 如果你还没有账号请 注册新账号