JRuby性能

Lar*_*rdt 18 jruby jrubyonrails

我有一个Rails 3.2.2应用程序,我希望使用JRuby 1.6.7(1.9.2模式)运行.

我有一个在MRI ruby​​ 1.9.3中运行的示例应用程序,一个典型的请求在~40ms内返回:在36ms完成200 OK(浏览次数:27.5ms | ActiveRecord:8.2ms)

在JRuby下使用相同的请求可能会慢3到20倍,具体取决于页面.对于与上述相同的操作,需要~180ms:180ms内完成200 OK(浏览次数:153.0ms | ActiveRecord:24.0ms)

这是正常的性能差异吗?我已经读过JRuby与MRI的速度大致相等.结果保存在我的Mac和Windows服务器上(不幸的是,它需要运行).使用在Tomcat下运行的Warbler将其打包也同样缓慢.

以上时间来自为测试JRuby而创建的基本rails应用程序.在更复杂的应用程序上,时间甚至更远.在该应用程序上,有些页面上运行了更多的ruby代码.似乎页面越依赖于ruby,我观察到的性能差异就越大.我没有对JRuby进行调整,因为我不知道从哪里开始.

所以我的问题是:这是正常的吗?我该怎么做来调整JRuby?

Sco*_*ott 18

Is this a normal performance difference?
I have read that JRuby is roughly equal on speed with MRI.
Run Code Online (Sandbox Code Playgroud)

不,那不正常.一旦JVM预热,在原始执行速度和垃圾收集方面,JRuby下的Rails请求通常比在MRI下更高效.

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

另外,请检查您的数据库配置正在连接池的优势,如pool: 20database.yml.

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

例如,适度推荐的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!Rails 4.0及更高版本中设置; 它默认是线程安全的.