2012-04-20 29 views
18

我有一个Rails 3.2.2应用程序,我正在使用JRuby 1.6.7(1.9.2模式)运行。JRuby性能

我在MRI红宝石1.9.3和一个典型的请求运行一个示例应用程序将返回在40毫秒〜: 完成200 OK在36ms:|:在JRuby中使用

(查看8.2ms 27.5ms的ActiveRecord)根据页面的不同,相同的请求可能会慢3到20倍。与上面相同的操作需要〜180ms: 在180ms内完成200 OK(查看:153.0ms | ActiveRecord:24.0ms)

这是一个正常的性能差异吗?我读过JRuby与MRI的速度大致相当。结果在我的Mac和Windows服务器上(不幸的是它需要运行)。在Tomcat下运行的Warbler包装起来也很慢。

上述时间来自为测试JRuby而创建的基本rails应用程序。在更复杂的应用程序中,时间更加分开。在那个应用程序中,有些页面上运行着更多的ruby代码。看起来页面越是依赖ruby,我观察到的性能差异就越大。我没有做过JRuby的调整,因为我不知道从哪里开始。

所以我的问题是:这是正常的吗?我能做些什么来调整JRuby?

回答

18
Is this a normal performance difference? 
I have read that JRuby is roughly equal on speed with MRI. 

不,这不正常。一旦JVM变暖,在原始执行速度和垃圾回收方面,JRuby下的Rails请求通常比MRI下性能更高。

这听起来像你的应用程序配置错误。首先要检查的是Rails本身的配置 - 请确保Rails不处于开发模式,并且config.threadsafe!已在您的生产环境中启用。线程安全模式将导致只有一个Rails共享副本在应用程序运行时加载到内存中。

还要检查您的数据库配置是否利用连接池,例如, pool: 20 in database.yml

最后,检查您的JVM和JRuby设置 - 两者都是高度可调的。您需要确保在启动时有足够的内存分配给JVM,然后有足够的内存用于应用程序的正常平滑操作;否则JVM将不断被迫过早和经常垃圾收集,这将显着降低性能。

例如一些对适度specced VPS的设置可能是这样的:

-Xmx500m -Xss1024k -Djruby.memory.max=500m -Djruby.stack.max=1024k

... ...但不要盲目照搬这些设置!您将不得不试验一下您的服务器上可用的内存资源,以确定对您有什么好处。也就是说,尽管JRuby可能会消耗比MRI下多个Rails进程总和更少的内存,但您肯定需要为单个JVM进程分配更多的前期内存。大方的JRuby和JRuby的将奖励你的好意:-)

你可以阅读更多有关调整JRuby和这里的JVM:https://github.com/jruby/jruby/wiki/PerformanceTuning

更新

你并不需要设置config.threadsafe! in Rails 4.0及以上;它默认是线程安全的。

+0

在'生产'模式下运行,相比于开发模式,有时会带来5-6倍的响应速度。至少这是我的情况。感谢您的注意。 – Aleks 2016-11-06 19:04:41

3

用JAVA 7升级到jruby 1.6.8或jruby 1.7.x!

令人敬畏的表现。

我们遇到了同样的问题,现在速度非常快(只需切换版本)。

+2

我有同样糟糕的表现。试过java 7&Jruby 1.7,新版Rails应用程序比使用MRI的强大当前项目更慢。尔格。 – m4tm4t 2013-01-13 23:51:04

4

我看到相同的行为,但请记住JRuby需要更长的时间进行预热。实际上我对JRuby最终会赶上来感到有点乐观。

可以通过设置几个选项来加快“预热”。红宝石 - > Java字节码编译器也可以教给JIT通过设置以下的环境变量编译每个方法第一次调用:

export JRUBY_OPTS="-J-Djruby.jit.threshold=1 -J-Djruby.jit.max=16384"

对于我来说,刷新Rails的页面了几次后,它仍然是2比MRI红宝石慢3倍,但至少比以前快3倍。

另外请记住,java运行库是JIT以类似的方式将java字节码编译为机器代码,但这个JIT不会启动,直到在使用服务器运行时调用10.000x的方法。这可以是configured as well

export JRUBY_OPTS="-J-Djruby.jit.threshold=10 -J-Djruby.jit.max=16384 -J-XX:CompileThreshold=10" -J-XX:ReservedCodeCacheSize=128M"

通过这些选项,JRuby的on Rails的提供了有关比MRI相同或更好的性能。

请注意,这些选项仅用于不耐烦的基准!实际上,积极运行JIT编译几乎总是一个糟糕的主意;你正在浪费宝贵的时间和内存来编译可能只运行几次的代码。但是,它显示了JRuby的最终性能可能比您预期的更好,这取决于初始运行。

让我知道这是否适合你。