Gem Ruby China 已经正式换成 Puma 来跑了!

huacnlee for Ruby China · 发布于 2013年10月29日 · 最后由 1129963143 回复于 2015年11月29日 · 23129 次阅读
De6df3
本帖已被设为精华帖!

话说上次 @luikore 在 RubyConf China 2013 上面演讲提到 Ruby China 在用 Puma 来跑是穿越了!其实之前我和他提到有个 Puma 在跑的应用是另外一个网站。

到今天才切换到 Puma 是因为据之前的测试,Puma 在部署过程有许多小问题,不如 Unicorn 那么稳妥。

但是最近 Puma 2.6.0 发布以后,明显好多了:

  • 多进程模式, 并且也有 Copy on Write 机制;
  • Capistrano 部署脚本集成
  • 重启连接不断开(不会出现 Nginx 502)
  • 支持 SIGUSR2 的方式重启;

于是我就换上了,据今天跑了一下午来看,速度和稳定性不比 Unicorn 差。

之前 Unicorn 在 Ruby China 上面跑了 8 个进程左右 (共 1.5 G 左右)

目前 Puma 的状况:

  • MRI Ruby 2.0, Rails 4
  • 2 4 进程(由于有了线程暂时两个进程就够用了),400M 内存耗费
  • 8 - 32 个线程

UPDATE! 2015 年据长期使用来看,Unicorn 和 Puma 的内存消耗,性能都是差不多的。


Puma 以及 Rails 跑多线程应用的细节

之前和 @luikore 讨教过关于 Ruby App Server 方面的进程、线程的细节,总结一下我的理解,有错的地方还望指正

  1. Puma 的多线程在 MRI 上面只是对有 IO 的地方才有效果,其他的东西由于 GIL 的原因同一时间只能有一个 Thread 在跑; 只有用 JRuby 才能实现完全多线程化;
  2. 用 Puma 得开启 threadsafe! (Rails 4 默认开启)不然 Rails 调用的 Rack::Lock 将导致 Thread 无效(参考文章)
  3. 当用 JRuby 跑 Puma 的时候,进程数量应该设置成和 CPU 核数一样;
  4. Puma -t 参数指定的每个进程的线程数量;
  5. 由于 MRI 只能调用一个核,所以,和 Unicorn 一样,Puma 的进程数量应设成与 CPU 核数一样,以便能充分利用资源,如果数量超过核数,反而会由于进程抢占资源过程的开销带来性能损耗;
共收到 66 条回复
1

以后我也试试。

686

果断跟风

96

分享中提到Puma的优势是比Unicorn省很多内存,目前有体现这个优势吗

De6df3

#3楼 @jiang_plus 上面我有提到啊,之前由于 Unicorn 是单线程多进程模式,进程数量等于并发数量,所以开到了 8 个为高访问的情况准备。而现在 Puma 的多线程模式直接少了 6 个 Ruby 进程。

不过 Puma 用 MRI 跑多线程的模式是否能达到 Unicorn 8 个进程的效果这个还得验证,只是据目前情况来看(Rails log 里面的请求响应时间)和以前没有区别

2622

关注

165

主要还是看吞吐量

4584

之前看到GitLab用Puma,我就跟着用了,当时好像是Puma 2.1.0 之后的确有出现start提示要删除sock文件的问题,然后看各位大伙都推荐unicorn、rainbows什么的,加上GitLab又换回unicorn,所以我又回到unicorn了…… 不过这次听了分享说Puma很好,所以,计划又一次回到puma体验一把

96

果断关注

96

关注

2650

果断跟风,尝试一下!

2650

用 Heroku 上的小应用尝试了一下,ab 测试的Requests per second没有明显变化。看来和 unicorn 相比主要是内存上的优势?

366

@huacnlee 原来8个进程,现在puma两个进程,怀疑能否达到原来的请求数量,毕竟thread只是在IO的时候有作用,反而如果很多请求(假设CPU计算比较多) 进入thread反而互相影响,导致进入thread的request响应时间比以前还要长,如果按照puma也起8个进程来看消耗的内存也不一定比unicorn少

2369

我以为Unicorn已经可以达到不中断部属了?http://rubyist.marsz.tw/blog/2013-06-03/unicorn-rails-and-capistrano/

366

#15楼 @lulalala 确实已经可以了啊

1164

passenger一直都可以不中断部署所有一直用,但是很多人推unicorn,还搞不懂原因。现在想试用puma看看。

681

内存优势,因为 Copy on Write 机制 吗?

1680

关注一下~

6281

我能问下吗?我不太懂。。。看lz说的,ruby才8个进程?能高并发?并发能多高?我看php好像都是128,256个进程的。。。(fastcgi的方式跑)。交流学习,勿喷。

487

@huacnlee

Puma 在 MRI 上面只是对 IO 的地方实现多线程了,其他的东西由于 GIL 的原因同一时间只能有一个 Thread 在跑; 只有用 JRuby 才能实现完全多线程化;

MRI Ruby的线程,在IO的时候,会自动释放GIL, 只有JRuby和Rubinius这种无GIL的Ruby实现,才能实现多线程「并行」,你说的多线程化是指「并行」吧。 单MRI Ruby的话,多线程依旧可以「并发」。

703

@huacnlee thread_num = CPU_core_number - 1?

3211

关注,有空试试

2443

#22楼 @shawnyu Puma 进程数量考虑和 CPU Core 一样. 线程数量可根据负载情况来看, 比如从 4 个Unicorn 进程转过来, 可以考虑 1 个 puma 进程 4 个线程或者 2 个 puma 进程 2 个线程, 当然也可以先直接使用 puma 默认的 16 个线程.

3753

#8楼 @imlcl 我的gitlab已经切到puma了 从日志来看没有太大差别 但是内存省了50%

4744

重启时会不会内存泄露cpu飙升,或者直接起不起来? 在puma 2.0的时候碰见过这两个bug,至今心有余悸。

366

看过一篇文章,同时使用两个server,redirect慢的IO多的request到puma, 其他的redirect到unicorn

4584

#25楼 @zj0713001 GitLab当时换回unicorn,估计也是当时puma不成熟 #17楼 @JeskTop 我觉得passenger装起来很方便,但升级时就比较蛋疼……

291

感谢楼主分享!

捎带问一句,楼主有没有做过rainbows和Rails 4的搭配测试?感觉如何?

30楼 已删除
9162

#26楼 @iamroody 我觉得这个Bug在Thin上更常见…

96

之前robin发过一个服务器的帖子 http://ruby-china.org/topics/10832 ,有空还打算试试rainbow呢,现在业界风向又回到puma了吗?

4508
Fetching: puma-2.6.0.gem (100%)
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
ERROR:  Error installing puma:
        ERROR: Failed to build gem native extension.

    g:/RailsInstaller/Ruby2.0.0/bin/ruby.exe extconf.rb
creating Makefile

make
generating puma_http11-i386-mingw32.def
compiling http11_parser.c
ext/http11/http11_parser.rl: In function 'puma_parser_execute':
ext/http11/http11_parser.rl:111:3: warning: comparison between signed and unsigned integer expressions
compiling io_buffer.c
io_buffer.c: In function 'buf_to_str':
io_buffer.c:119:3: warning: pointer targets in passing argument 1 of 'rb_str_new' differ in signedness
g:/RailsInstaller/Ruby2.0.0/include/ruby-2.0.0/ruby/intern.h:668:7: note: expected 'const char *' but argument is
compiling mini_ssl.c
In file included from mini_ssl.c:3:0:
g:/RailsInstaller/Ruby2.0.0/include/ruby-2.0.0/ruby/backward/rubyio.h:2:2: warning: #warning use "ruby/io.h" inst
mini_ssl.c:4:25: fatal error: openssl/bio.h: No such file or directory
compilation terminated.
make: *** [mini_ssl.o] Error 1


Gem files will remain installed in g:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/puma-2.6.0 for inspection
Results logged to g:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/puma-2.6.0/ext/puma_http11/gem_make.out
729

好像缓存CacheStore貌似都不支持connection pool,在多线程状态下会不会出现性能问题

2880

#34楼 @yakczh 似乎是缺少 openssl 的头文件, 最好在 msys 里编译安装一个

487

#25楼 @zj0713001 多线程自然省内存。

96

期待 jruby + torquebox

487

啥时候换成JRuby或Rubinius跑跑

5610

哦。rubychina都rails4了啊?好前卫~!

96

我们用 GitLab 的时候没发现 Puma 省多少内存,可能是默认配置的原因。。

781

继续观望一段时间

96

之前也出现过Puma内存吃的很紧的情况,可能现在2.6.0好了点,之前部署问题多多~

2099

关注!

96

留言回帖都很快,赞一个。

611

关注!

1069

为什么没有人用thin呢? 好像都没人提及这个哦

96

GitLab5.4 切换到unicorn,然后GitLab6(2013-8-20发布)又切换回到unicorn了。看这里 貌似在MRI环境下puma多线程会有很严重的内存泄露,而且CPU100%很高。

We switched from Puma in GitLab 5.4 to unicorn in GitLab 6.0.

why switch back to Unicorn again?

Puma caused 100% CPU and greater memory leaks when running mult-ithreaded on systems with many concurrent users. That's because people used MRI. You MUST use JRuby or Rubynius when using Puma. Or else the world breaks apart.

Mathieu adds in the comments:

Yes, Unicorn is better (but more memory-eager) on MRI setups. Puma is better on Rubinius & JRuby, that's all.

They can't force people to use other implementations of the Ruby Runtime, so they just fell back to the best setup for most setups :) –

9162

今天把一个Discourse项目换用puma跑了,内存由1.8G降到了400多mb,速度也有明显上升…… 4 worker 、8:32 运行之前: 运行时:

3547

#50楼 @cassiuschen 哥们,有教程不,我也打算上puma了。

9162

#51楼 @QueXuQ 你说discourse还是rails项目部署puma?

Discourse部分我再优化优化过几天给官方PR,rails部署参考:http://tommy.chheng.com/2013/01/23/deploying-a-rails-app-on-nginxpuma-with-capistrano/

只不过这篇文章用的capistano2,升级到三需要大幅修改…puma配置文件看官方https://github.com/puma/puma 下的README和Example下的config.rb,写得很清楚

看ruby-china的源码也可以学习一下

3547

#52楼 @cassiuschen 哦。说的是puma。以前安装passenger都对照着passenger和nginx的教程来配置,现在puma网上看不到如何连同nginx的配置,所有才问问。 那就单独先装好nginx,然后在根据puma remadme的config就可以了。等我试试看。

9162

#53楼 @QueXuQ 嗯…nginx部署大同小异,因为都是靠socket连接,passager我没用过,以前thin的多worker是多次允许thin server,生成多个sock,然后在nginx里负载均衡,puma只有一个sock,内部负载均衡

1141

@huacnlee 好像有段时间没上了 rubychina 是用的 Nginx + Puma 吗, 咋 Capistrano 没见到 Nginx 相关的部署代码

96

#50楼 @cassiuschen 不错,我的新项目将果断跑Puma

9162

#56楼 @u1360749170 不过前几天用puma跑discourse之后,把puma的配置信息pr给discourse官方,结果对方似乎很介意把负载平衡从nginx迁移到puma,于是就拒绝了merge……

96

#55楼 @feitian124 capistrano v2 的有现成文件可以引用

96

#50楼 @cassiuschen 你原来使用的是什么?thin 还是passager

9162

#60楼 @todaynet 没用过passager……唯一一次用Passager+Apache结果内存溢出,我阿里云整台服务器崩溃……上面部署的php什么的全宕机来着……后来不敢再使用passager了……

1411

redmine也用puma跑一下试试,虽然并发量不是很大

64楼 已删除
15924

类似于python下flask的东西么?

68

Great. 我现在也在用了。你的研究成果,解决了我一些疑问。

11314

好东西

21328

嘛,刚刚学ruby。

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