写点什么

在 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:09769
用户头像

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

关注

评论

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

学生管理系统的架构文档

卡西毛豆静爸

「架构实战营」

数据库读写分离如何保证主从一致性?

蜜糖的代码注释

MySQL 数据库 2月月更

用简单例子带你了解联合索引查询原理及生效规则

华为云开发者联盟

sql 索引 查询 联合索引

基于CC2530设计的智能风扇

DS小龙哥

2月月更 智能风扇

学生管理系统的架构设计

凌波微步

「架构实战营」

[Python]第一章(建议收藏)

謓泽

Python 2月月更

初级工程师建议收藏|企业级APIs安全实践指南

领创集团AdvanceGroup

eBPF 完美搭档:连接云原生网络的 Cilium

火山引擎边缘云

边缘计算 ebpf 云原生网络 cllium

[Python]介绍

謓泽

Python 2月月更

存储新图谱:DNA存储的边界与天地

脑极体

『The ShardingSphere Global Echo』Vol.4

SphereEx

数据库 开源 中间件 ShardingSphere SphereEx

关于MVVM和MVC,面试看这篇就够了

山河已无恙

mvc 全栈 MVVM 2月月更

如何打造一个能自动回复的钉钉机器人

老表

Python 机器人 Linxu 跟老表学云服务器

UMEM:友盟统计自定义事件多应用一键同步 & 批处理工具

SamgeApp

Docker Vue 友盟助手 友盟自定义事件批处理 友盟统计

鲲鹏DevKit & BoostKit直播解密:如何“做开发者的开发者”

科技热闻

盘一盘常见的6种索引失效情况

华为云开发者联盟

MySQL 索引 字符串 查询 索引失效

十年所学,梦想终至,不负时光 | 《云端架构》新书首推发布,来自极度努力的吕校长

博文视点Broadview

CSS实现阮大佬博文的阅读进度功能

战场小包

CSS css3 前端 2月月更

超硬核攻略!《2022金融云原生落地实用指南》重磅发布(限时免费下载)

York

云原生时代,如何保证容器镜像安全?

极狐GitLab

DevSecOps 镜像安全 极狐GitLab

面试突击25:sleep和wait有什么区别?

王磊

java面试

大厂偏爱的Agent技术究竟是个啥

捉虫大师

架构 agent

CNCF 沙箱项目 OCM Placement 多集群调度指南

阿里巴巴云原生

阿里云 云原生 OCM Placement

Python 中的数组哪去了?

宇宙之一粟

Python 数组 2月月更

好用不卡,这些插件和配置让你的 Webstorm 更牛逼!

前端下午茶

前端 工具 webstorm

FIddler+Proxifer工具对windows PC客户端进行抓包

喀拉峻

黑客 网络安全

工作想法小计(2):2/14 - 2/18

非晓为骁

个人成长

Nginx跨域解决配置示例

nginx 跨域

Clusterpedia 加持 kubectl,检索多集群资源

Daocloud 道客

云原生 开源项目 K8s 多集群管理

系统学习 TypeScript(二)——开发流程和语法规则

编程三昧

typescript 前端 2月月更

Pulsar 职位广场 | 腾讯、华为云、虾皮、众安保险、StreamNative 等多个热招岗位

Apache Pulsar

开源 架构 云原生 招聘 Apache Pulsar

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