我有一个希望使用JRuby 1.6.7 (1.9.2模式)运行的Rails 3.2.2应用程序。
我有一个运行在MRI ruby 1.9.3中的示例应用程序,一个典型的请求在大约40ms内返回:在36ms内完成200OK(浏览量: 27.5ms | ActiveRecord: 8.2ms)
在JRuby下,根据页面的不同,使用相同请求的速度要慢3到20倍。对于上面相同的操作,需要大约180ms :在180ms内完成200OK(视图: 153.0ms | ActiveRecord: 24.0ms)
这是正常的性能差异吗?我读到过,JRuby的速度与核磁共振大致相当。结果在我的Mac和一台Windows服务器上保持不变(不幸的是,它需要在Windows服务器上运行)。用运行在Tomcat下的Warbler打包同样很慢。
以上时间来自为测试JRuby而创建的基本rails应用程序。在更复杂的应用程序上,时间间隔甚至更远。在该应用程序上,一些页面上运行着更多的ruby代码。似乎页面对ruby的依赖越多,我观察到的性能差异就越大。我没有对JRuby做任何调整,因为我不知道从哪里开始。
所以我的问题是:这是正常的吗?我能做些什么来优化JRuby?
发布于 2012-04-24 00:09:25
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的共享副本加载到内存中。
还要检查您的数据库配置是否利用了连接池,例如database.yml中的pool: 20。
最后,检查您的JVM和JRuby设置--两者都是高度可调的。您需要确保在启动时为JVM分配足够的内存,然后为您的应用程序的正常流畅操作提供足够的内存;否则,JVM将经常被强制过早且频繁地进行垃圾收集,这将显著降低性能。
例如,适度指定的VPS的一些设置可能如下所示:
-Xmx500m -Xss1024k -Djruby.memory.max=500m -Djruby.stack.max=1024k
..。但是不要盲目地复制这些设置!对于服务器上可用的内存资源,您必须进行实验,找出对您有好处的资源。
也就是说,虽然在MRI下,JRuby消耗的内存可能会少于多个Rails进程的总和,但您肯定需要预先为单个进程分配更多的内存。对JRuby慷慨一点,JRuby会报答你的好意:-)
您可以在这里阅读更多关于调优JRuby和JVM的内容:https://github.com/jruby/jruby/wiki/PerformanceTuning
更新
在Rails 4.0和更高版本中,不需要设置config.threadsafe!;默认情况下,它是线程安全的。
发布于 2013-01-29 21:48:04
我看到了相同的行为,但请记住,JRuby需要更长的时间来预热。实际上,我稍微乐观地认为,JRuby最终会迎头赶上。
通过设置一些选项,可以让这个“热身”更快。通过设置以下env var,Ruby ->字节码编译器可以在第一次调用时编译每个方法:
export JRUBY_OPTS="-J-Djruby.jit.threshold=1 -J-Djruby.jit.max=16384"
对我来说,在刷新Rails页面几次之后,它仍然比MRI Ruby慢2-3倍,但至少比以前快了3倍。
还要记住,java运行时是JIT以类似的方式将java字节码编译成机器码,但在使用服务器运行时调用10.000x之前,这种JIT不会生效。这可以是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编译几乎总是一个坏主意;您正在JIT上浪费宝贵的时间和内存-编译可能只运行几次的代码。但是,它显示了基于初始运行,最终的JRuby性能可能会比您预期的要好。
让我知道这对你是否有效。
发布于 2012-12-13 19:23:22
使用Java7升级到jruby 1.6.8或jruby 1.7.x!
很棒的表演。
我们遇到了同样的问题,现在它的速度非常快(只需切换版本)。
https://stackoverflow.com/questions/10252293
复制相似问题