11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

OpenFeint 的系统迁移之路

  • 2012-11-17
  • 本文字数:2006 字

    阅读完需:约 7 分钟

在今天举行的 RubyConfChina 2012 大会上,来自 OpenFeint 的黄志敏( @flyerhzm )在下午的第一个演讲中为大家带来了 OpenFeint 平台从 REE 向 JRuby 迁移的经验,向大家展示了 JRuby 带来的巨大性能提升,同时就其中遇到的一些问题进行了分享。

开场时,黄志敏就抛出了一个令人振奋的数据:

JRuby 给 OpenFeint 带来了 40% 的性能提升!

OpenFeint 是最大的移动社交游戏平台,每分钟有几十万 API 调用,由于起步时间较早,之前一直运行在 REE 1.8.7 + Rails 2.3.14 的环境之下。为了解决性能问题,他们做了一些方案,其中包含向 JRuby 迁移,但是由于大多数开发者都没有 Java 平台的经验,所以这一项并没有被提上较高的优先级。在美国的 RailsConf 2012 上,大多数人都抱怨 Ruby 的 GC 性能很差,在 Real World Rails Apps at Massive Scale 的讨论中提到了 Ruby GC 占用了大量的系统资源,而在其他两个演讲中讲到了 JRuby 带来种种好处,于是 OpenFeint 决定开始他们的迁移之路。

在开始前,他们做了一个简单的快速性能测试,在一台测试服务器上(memcached、redis 和 rabbitmq 等软件都运行在一台机器里),禁用了 mysql sharding、后台任务和其他无法工作的部分,分别运行 REE 1.8.7 2010.01(GC 未优化) + Passenger 和 JRuby 1.6.7.2 + Torquebox 接受请求,前者响应为 331ms,而后者只需 51.5ms。虽然这个测试里有很多不足的地方,但是其结果的确鼓舞人心。

OpenFeint 的系统栈里主要有以下部分组成:

  1. 负载均衡
  2. Web / App Servers
  3. Mysql
  4. Memcached
  5. Redis
  6. RabbitMQ
  7. 其他部分

迁移工作主要是将 App Servers 从 Passenger 迁移到 Torquebox,迁移时希望能尽可能减少人力投入。App Servers 根据功能分为多个池,迁移时逐个进行迁移,在每个池里先部署一台。这种做法能更快地享受到 JRuby 带来的性能提升,能更快地积累经验,但是必须要保证代码能同时运行在 REE 和 JRuby 下,带来了一定的运维复杂度。

虽然 JRuby 与 CRuby 在语法上没有什么不同,但是两者仍然存在一些不兼容的地方,首先就是要逐步替换不兼容的 gem:

  • yajl-ruby 和 hiredis,这两个 gem 使用了 C 扩展,在 JRuby 下 C 扩展的使用还不理想
  • 替换了 mysql 的驱动
  • typhoeus 在大压力下,很快就会导致 JVM 崩溃,因此将它换为了 net-http-persistent
  • memcached 的客户端被替换为 jruby-memcached,必须保证 REE 和 JRuby 下一致性 Hash 算法能保持一致,所以没有选择其他方案

出于性能考虑,还要开启JRuby 的threadsafe 特性。JRuby 往往需要比CRuby 更多的内存,因此还需要设置JRUBY-OPTS,调整JVM 堆等一些配置,比如将Xmx 从默认的512M 提高到2G,提供更大的CodeCache 。还有一些问题也会造成性能下降,例如 ActiveRecord 2.3.14 是线程不安全的,大并发下容易造成死锁,导致吞吐量下降

他建议在开发和测试环境中使用 CRuby,在持续集成与线上环境使用 JRuby。目前有以下一些可选的 JRuby 部署环境:

  • Trinidad,基于 Tomcat
  • Torquebox,基于 JBoss AS(运行速度更快,有团队进行维护)
  • Mizuno,基于 Jetty
  • Puma,这是一个新的 Ruby Server(Rack 版本很高)

最后,OpenFeint 选择了 Torquebox-lite,这是一个仅包含 Web 模块的 Torquebox 精简版,可以通过配置进行扩展。Torquebox-lite 也像 Passenger 一样,可以进行热部署,只需简单的一句 touch 就可以了,但是每次热部署时会造成一定的停顿时间,而且每次热部署后非堆内存都会增加,所以最后他们还是选择了逐台重启服务的策略。

在经过了一些的调整之后,OpenFeint 的同学们又进行了一次较为正式的性能测试,在线上的备机上进行测试,结果毫无悬念是 JRuby 胜出。对比 Ruby 1.9.3p194 + Passenger 和 JRuby 1.7.0RC2 + Torquebox-lite,读操作耗时分别为 374ms 和 187ms,写操作耗时分别为 42ms 和 38ms。整体的性能提升在 40% 左右,不同的应用服务器池情况稍有不同,但总体上都有 30% 以上的提升。在使用过程中,他们禁用了 JRuby 1.7 的 invokedynamic 特性,原因是开启该特性后 Torquebox 无法正常运行,相信在修正这个问题后,启用该特性会有更大的性能提升。

一个运行生产环境的系统自然少不了监控,在使用 REE 时,OpenFeint 的监控主要用 NewRelic 和 Scout,迁移到 JRuby 之后,还是使用 NewRelic,Scout 需要加上 JMX Monitoring Plugin 插件。此外,JRuby 的监控还有一些工具,比如命令行下的 jstat、jstack 和 jmap,图形化的 jconsole 和 visualvm。黄志敏还介绍了几个他自己的问题排查经历,就是使用这些工具进行的。

JRuby 最近刚发布了 1.7.0 正式版,相信随着 JRuby 的不断发展,以及 Java 平台的不断升级,JRuby 将会被越来越多的人用于生产环境之中,有兴趣的读者可以访问 JRuby 的官方网站了解进一步的信息。


给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-11-17 08:201503
用户头像

发布了 135 篇内容, 共 55.5 次阅读, 收获喜欢 43 次。

关注

评论

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

为啥你写的代码老有大串的if/else?

华为云开发者联盟

代码 if for循环 else

进程崩溃/应用卡死,故障频频怎么办?|HDC2021技术分论坛

HarmonyOS开发者社区

HarmonyOS

DataPipeline与TiDB推出异构数据实时同步解决方案,共筑安全可信基础设施

DataPipeline数见科技

数据库 大数据 中间件 数据融合 数据管理

极光笔记|基于CMPP协议集成短信测试桩全流程实践分享

极光JIGUANG

<<活法>>读后感

Tiger

28天写作

让工具成为双手的延伸

Zilliz

数据库 书籍推荐 程序 书籍

恒拓高科WorkPlus助力南兴装备移动数字化升级

WorkPlus Lite

前端开发之Vue 技术栈编写表单组件

@零度

Vue 前端开发

一文读懂 Apache Pulsar

晓双

云原生 Apache Pulsar 消息系统 数据流 Apache Pulsar 社区

【干货分享】研效优化实践:AI算法助力深层BUG挖掘

WeTest

Linux常用命令速查手册

入门小站

Linux

这套神奇的个人信息管理系统,带我一步步进入互联网大厂

博文视点Broadview

Android C++系列:Linux网络(三)协议格式

轻口味

c++ android 28天写作 12月日更

10年经验总结,华为fellow教你如何成为一名优秀的架构师?

华为云开发者联盟

架构设计 架构师 华为fellow 云服务运维

如期而至-用户购买时间预测(下)

索信达控股

模型 购买预测 购买行为 精准营销

前端性能优化 24 条建议

编程江湖

大前端

MySQL性能测试之select&update【FunTester框架】

FunTester

MySQL 性能测试 测试框架 FunTester FunTester框架

Kyligence 智能数据服务与管理相关研究

Kyligence

技术专题合集

大厂面试算法题之数组

程序员学长

数据结构 算法 大厂面试

从 0-15 套存储集群,YRCloudFile 助力 AI 训练效率“超线性增长”

焱融科技

人工智能 云计算 分布式 高性能 文件存储

浅析流媒体CDN与WEB CDN的业务差异

郑州埃文科技

CDN加速 IP网络 在线并发

数据库事务的三个元问题

Zilliz

数据库 数据库设计

科创人·StreamNative翟佳:开源模式价值为王,基础软件的未来在国内社区

科创人

双 11 大促会场开发提效解析:前端智能化落地实践

凹凸实验室

机器学习 大前端 智能代码

CANN5.0黑科技解密 | 高并发图片视频处理,为出行保驾,为生活添彩!

华为云开发者联盟

高并发 图像预处理 CANN 昇腾 异构计算

Java开发之环境搭建基础教程

@零度

Java 开发环境搭建

高并发多方案秒杀架构

MetaThoughts

Python enumerate():使用计数器简化循环

华为云开发者联盟

Python 变量 计数器 循环 enumerate

浅谈服务网关和联邦云

星环科技

联邦云 服务网关

Java 程序员必须掌握的 10 款开源工具

编程江湖

java编程 java开发工具

大数据开发之传输组件Sqoop的功能介绍

@零度

大数据 sqoop

OpenFeint的系统迁移之路_Ruby_丁雪丰_InfoQ精选文章