楼主,继续给你优化建议哈:
ruby 的 json gem 性能其实是比较一般的,建议你换成 oj,估计还能整体提升 10% 的性能。
另外,如果你不怕麻烦的时候,可以到 github 上找找 ruby2.0 的性能补丁,反复测试测试各种参数各种补丁,运气好的话,还能提升 30%。
不过 ruby 真的没有必要和 node 比较。node 那种嵌套回调不适合写复杂逻辑,非常反人性,两者应用场景有差别。个人看法:n 年以后,Go 会消灭 node,不信等着看。
这数据对比还好吧。node 的强项就是 IO 并发,做这种测试其实就是测 IO 并发,你的 node 性能是 ruby 的 3 倍,说明 ruby 已经很不错啦。而 ruby 本身在 IO 方面就算传统弱项,这个差距在我看来真的算很小了。
另外你如果调整一下 ruby 的 GC 参数,还能够提高性能 50-100%。
我当年玩 webwork2 的时候,就觉得 OGNL 迟早出事,特别是那个 ParametersInterceptor,虽然自动创建对象,自动匹配对象属性赋值了,但危险性比 Rails 的 AR 的 update_attributes 还要高。
你看下这个 controller: https://github.com/robbin/robbin_site/blob/master/app/controllers/home.rb
就是你想要的,直接定位到根路径的。
秘诀就是这行:
RobbinSite.controllers do
不要定义 controllers 的命名空间,就会直接定位到根路径
get :index do @blogs = Blog.order('id DESC').page(params[:page]) render 'home/index' end
这个方法就是访问整个网站首页。
#15 楼 @helloqidi 没有遇到过。
Rails 升级太痛苦了,Rails 太笨重了,我已经放弃 Rails 了,解脱了。
web app 我就用 padrino,web api 我就用 sinatra,感觉很舒服。
透露一点线索哈,林芷薰 的本尊网络 ID 是 5 个字母,有一个形象的念法:鸡鸡咔嚓
看他的博客,我感觉他离职,可能那个公司真的有问题,不单纯是王垠自己的问题。我感觉王垠的问题是人际沟通方面有性格缺陷,团队合作方面差,但是如果公司真的如他描述的那样,“误用”Agile,行死板的流程化管理,换了我,也会走。
BTW: 现在国内"Agile"都臭大街了,和很多公司的误用是分不开的。
#14 楼 @quakewang 太坏了,勾引小白黑客阿。
#6 楼 @quakewang 你终于改成 unicorn 了。
我有一个超简单,但项目结构完整的测试 demo: grape on rainbows
很好!Ruby 从语法上来说已经足够 OK 了,现在差的就是虚拟机性能,以及多核并行的支持,看来 Matz 先生对 Ruby 未来的发展应该补足的功课是非常清楚的,那就让我们期待 Ruby2.1 的分代垃圾回收和多核并行的支持吧。
你的问题不在于单个 ruby 进程占用多少内存,而在于应该尽量少开进程的情况下,尽可能多的提高系统并发性能。
在 8 CPU (1x priority) 的服务器上,你开太多进程对提高并发性能没有多少帮助,建议如下:
1、nginx 开 1 个 worker 就行了,开 4 个没必要 2、既然是 API Server,就扔掉 Rails,直接用 Passenger/Unicorn/Rainbows 跑 grape,进程内存会节省很多,我估计能从 100MB 下降到 60MB 左右。 3、少开点进程,最多开 4 个 ruby 进程,观察一下请求的 IO 并发状况,如果并发不高,用 unicron 即可,如果并发高,可以改用 rainbows 跑多线程 4、如果你需要更高的 IO 并发,可以改用 goliath 跑 grape,内存不会更节省,但是并发性能会进一步提高 5、如果你不怕麻烦,可以把操作系统换成 32bit 的,能很大程度上节省内存 (缺点就是内存不能超过 4G)
你可以换成 rainbows 看看。rainbows 也是多线程,但是 code base 和 unicorn 是一样的,我用下来很稳定。
太牛 X 了,我对楼主佩服的五体投地!
多核就用多个进程就好了,没坏处。用单一进程跑多核,GC 会成为一个巨大的瓶颈的。