写点什么

在 JRuby on Rails 上构建 Oracle Mix 的收获

  • 2007-11-28
  • 本文字数:1764 字

    阅读完需:约 6 分钟

Oracle 实验室最近发布了 Oracle Mix ,这是一个基于JRuby on Rails的社会网络应用。 Rich Manalang 刚刚在博客上分享了他在这个项目中的经验。虽然这个项目目前运行在 JRuby 上,但是最原始的工作却是用 MRI 完成的:

我们用标准的 Ruby 解释器(也就是 MRI——Matz’s Ruby Interpreter)和 Ruby-OCI 在 Oracle DB XE 上完成了 Mix 的大部分工作。用 MRI 来开发 Rails 应用还是要容易很多,因为 JRuby 的启动要花一段时间。

随后人们便发现Rails 插件系统在帮助 Mix 与 Oracle 内部系统——这里指的是单点登录(SSO)策略——协同工作方面起到了很大作用:

这个项目至关重要的一点就是要支持 Oracle 单点登录策略。也就是说我们所部署的每一个 Web 应用都要通过 Oracle SSO 服务来支持单点登陆。我着实用了几天才找出解决方案,但方案一旦成型,把它插入到我们正在使用的 acts_as_authenticated Rails 插件中就并非难事了。

解决了这些问题后,开发团队在向 JRuby on Rails 进行部署时又遇到了新的难题——性能

这一切都搞定以后,我们就开始在 JRuby 上做早期部署。性能简直烂得要死。单台应用服务器每秒只能处理 20 到 40 个请求。很明显,有些产品设置没有被配置好(比如,忘了对 ruby 类进行缓存等等)。我修改了一些环境设置后(标准的 rails 产品设置),单台应用服务器达到了每秒 80 个请求……情况好了一些,但是还远远不够。

长话短说,经过对性能问题的一阵调查研究以后,性能开始有所改善:

Ola 和 jRuby 团队在 jRuby 代码中发现了一些有趣的瓶颈。一两天内,Ola 和团队就做好了一个补丁,其后请求数达到了每秒 150 到 200 个。而应用服务器“热身(warm up)”以后,情况变得更好玩了……数值开始上升,达到了每秒钟 400 到 600 个请求。

这还仅仅是开始,因为按照作者所述,这些数字还是在没有进行任何缓存的服务器上得到的结果。那么是什么引起的性能提升呢?JRuby 团队对一系列的问题进行了研究,并发现了一些老问题,诸如正则表达式的性能

当我开始关注 Rails 中的正则表达式性能时,就发现了问题所在。每个请求中正好有 50 次正则表达式运算,于是我就写了个脚本,在 MRI 上检查每一次运算的性能。然后发现当拿 MRI 和 JRuby 相比较的时候,其中一次运算的性能显得相当怪异。实际上,它差不多要慢上 200 到 1000 倍。更糟的是,这性能还是非线性的。

这个问题实际上是在 JRuby 的 each_line 实现中出现的,和 Rails 代码无关。当这个问题和其它一些性能问题被一一发现并获得解决后, JRuby 的速度有了显著的提升……

除了 JRuby 实现上的瓶颈,其他一些原因同样可以导致 JRuby 应用的速度变慢。Nick Siger指出了 JRuby 用户可以用一些小窍门来提升应用的速度。其中最重要的步骤是:

  • 关掉ObjectSpace.
    ObjectSpace 是一个可以允许用户遍历堆中所有对象的特性。很少有代码库真的会用到这个特性,所以关掉它并不会有什么相关的后果。实际上,JRuby 1.1 默认就是把它关掉的。这个做法对性能的提升是很有效的:因为如果要提供 ObjectSpace 功能的话,每一个被创建的对象就都必须要在一个单独的列表结构中进行注册,从而增加了对象创建的代价。
  • 确保使用了“server” VM
    可以通过一个简单的命令开关来使用“server” VM,从而获得更强劲的性能优化。
  • 等待 JVM热身
    这并不是真正的优化,但是能够保证测量出的性能数字是正确的。JVM 工作的方式是,首先解析字节码,然后通过动态编译器来逐步将字节码进行优化并编译成 native 代码。只有实际上频繁用到的代码才会被编译和优化,而这个过程是需要一定时间的。这也就是说,在一个刚刚启动的 JVM 上测量每秒请求之类的性能,其结果要比在运行了一段时间的 JVM 上测量出来的性能差很多。
  • 从稳定版本的 JRuby(例如 JRuby 1.0.x)切换到开发版本
    这对于 JRuby1.1(当前的开发版本)而言效果尤其显著,因为它是第一个使用了完整的JIT的 JRuby 版本。但是,因为开发版可能会变动很大,所以使用最新版本也就意味着可能会引入新的、未被报告的 bug。这些都会以不可预知的方式给应用程序造成破坏。当然,使用一个适当的 test suite 可以帮助开发人员将使用开发版带来的风险降低。跟上 JRuby 的开发步伐是有一定代价的,这个代价与所带来的性能提升相比孰轻孰重,还是要依据情况来判断。

查看英文原文 Lessons from building Oracle Mix on JRuby on Rails

2007-11-28 01:091121
用户头像

发布了 197 篇内容, 共 60.9 次阅读, 收获喜欢 21 次。

关注

评论

发布
暂无评论
发现更多内容

多元办公场景下,企业如何保障工作效率与数据安全流通?

人称T客

阿里一面凉凉,幸获内推华为技术四面,offer到手!

程序知音

Java java面试 Java进阶 八股文 Java面试八股文

活动回顾丨首期阿里云 Serverless 技术创新实战营上海开讲(含 PPT 下载)

Serverless Devs

ScaleFlux企业级SSD通过VMware IOVP认证

ScaleFlux

vmware 固态硬盘 企业SSD 存储解决方案

软件测试/测试开发丨Web自动化测试高级定位xpath

测试人

程序员 软件测试 自动化测试 测试开发

inBuilder今日分享丨表单设计器画布渲染引擎揭秘

inBuilder低代码平台

如何进行存储容量规划?

ScaleFlux

存储成本 数据压缩 企业级SSD NVMeSSD

Last Week in Milvus

Zilliz

非结构化数据 Milvus Zilliz 向量数据库

商业地产研策如何搜集数据​

MobTech袤博科技

艾媒金榜|2023年中国信创企业百强榜

亚信AntDB数据库

数据库 AntDB AntDB数据库

旅游景区如何寻找共享电单车厂家

共享电单车厂家

共享电动车厂家 景区共享电单车 共享电动车投放 景区共享电动车

怎样将图片直接转换为3d模型?

真大的脸盆

Mac Mac 软件 图片转换工具 图片转换模型软件

AIGC下的低代码赛道,你我皆是拓荒人

引迈信息

AI 低代码 AIGC JNPF

探索 PlanetIX:解读区块链游戏运营的奥秘

Footprint Analytics

区块链游戏 web3 Planet IX

MegEngine 使用小技巧:如何解读 MegCC 编译模型几个阶段 Pass 的作用

MegEngineBot

深度学习 编译器 MegEngine Pass

用友BIP新一代全球司库,重塑企业资金管理新价值

用友BIP

全球司库

详解RocketMQ 顺序消费机制

华为云开发者联盟

后端 开发 华为云 华为云开发者联盟 企业号 5 月 PK 榜

水泥行业全球第一企业怎么进行财务共享建设?

用友BIP

财务共享

利用透明压缩技术解决企业级SSD读写延迟挑战

ScaleFlux

压缩算法 固态硬盘 企业存储

基于 Log 的通用增量 Checkpoint

Apache Flink

大数据 flink 实时计算

财务标准化建设进程中,财务共享能起到什么作用?

用友BIP

财务共享

「ACL 2023」:火山语音团队多篇论文中选,涉多方向技术创新突破

科技热闻

财务共享五大价值助力央企构建世界一流财务管理体系

用友BIP

财务共享

怎样才能让业财融合真正为企业数智化转型起到推动作用?

用友BIP

财务共享

论数字化大趋势下,建设财务共享中心的重要性

用友BIP

财务共享

西南财经大学李玉周:数智化技术广泛使用推动管理会计加快落地

用友BIP

智能会计 价值财务

进阶神册!Redis+Nginx+设计模式+Spring全家桶+Dubbo核心技术笔记

程序知音

Java 数据库 spring java架构 Java进阶

AI浪潮再掀低代码开发热,快来了解最新趋势!

加入高科技仿生人

人工智能 低代码 AI技术

Wallys/DR5018+QCN6122/support for the latest Wi-Fi standards in networking devices.

Cindy-wallys

ipq5018 QCN6102 QCN6122

通过SQL获取每个月第n周任意天的数据

搞大屏的小北

sql查询 sql 第一周 每个月 周一

在JRuby on Rails上构建Oracle Mix的收获_Ruby_Werner Schuster_InfoQ精选文章