OpenFeint的系统迁移之路

标签: openfeint 系统 | 发表时间:2012-11-17 22:20 | 作者:
出处:http://pipes.yahoo.com/pipes/pipe.info?_id=10560380f804c7341f042a2b8a03e117

在今天举行的 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中文站投稿或者参与内容翻译工作,请邮件至 [email protected]。也欢迎大家通过新浪微博( @InfoQ)或者腾讯微博( @InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

丁雪丰 是InfoQ中文站编辑,满江红翻译组核心成员,出版过《Spring攻略》、《JRuby实战》等多部译著。主要关注领域:企业级应用、海量数据计算、动态语言应用等。

您可能也会喜欢

相关 [openfeint 系统] 推荐:

OpenFeint的系统迁移之路

- - InfoQ cn
在今天举行的 RubyConfChina 2012大会上,来自OpenFeint的黄志敏( @flyerhzm)在下午的第一个演讲中为大家带来了OpenFeint平台从REE向JRuby迁移的经验,向大家展示了JRuby带来的巨大性能提升,同时就其中遇到的一些问题进行了分享. 开场时,黄志敏就抛出了一个令人振奋的数据:.

你退我进:OpenFeint将为开发者提供一站式登录系统,取代苹果的iOS UDID

- pestwave - 36氪
上个星期苹果宣布将禁止iOS 5开发者使用苹果设备的UDID(独立设备ID),这对移动广告商、游戏网络运营商、以及手机游戏开发者来说是一个坏消息,因为他们往往需要通过UDID用来识别用户,并对用户活动进行跟踪,有些开发者还需要通过UDID来确认用户是否通过一部新设备来访问自己的应用. 手机社交游戏平台OpenFeint今天宣布将在今秋为开发者提供一个一站式登录系统.

OpenFeint宣告其社交游戏在Android大获成功

- caixin - GeekPark 捕风捉影
移动社交游戏商OpenFeint已经在过去的2个月又增加了230款游戏,Android Market的免费游戏排行榜Top 100中有24个使用他们的社区. 目前在Android Market里面总共有他们的700款游戏了,利用这个优势可以铺开更多新功能,包括补充玩家的资料,状态信息以及建立起一个玩家信息的壁垒.

壳系统

- Vernsu - It Talks-魏武挥的blog
经常有人被我问到“你用什么浏览器”时的答案是:傲游啦360啦,但事实上,这些都不是真正的浏览器,从技术角度讲,充其量只是在IE浏览器上加一个壳罢了. 在国外,壳浏览器是以“皮肤”的形式存在,纯属为了美化浏览器而用. 但在中国,壳浏览器成了一门生意. 奇虎的主要收入来源并非来自那个由于一场商战而赫赫有名的安全卫士,而是来自于360浏览器(它有两个版本,分别以IE和Chrome为内核).

秒杀系统

- - 开源软件 - ITeye博客
秒杀系统架构分析与实战. (反馈非常好的文章,推荐). (1)查询商品;(2)创建订单;(3)扣减库存;(4)更新订单;(5)付款;(6)卖家发货. (1)低廉价格;(2)大幅推广;(3)瞬时售空;(4)一般是定时上架;(5)时间短、瞬时并发量高;. 假设某网站秒杀活动只推出一件商品,预计会吸引1万人参加活动,也就说最大并发请求数是10000,秒杀系统需要面对的技术挑战有:.

Ext文件系统

- Haides - 博客园-首页原创精华区
  虽然从Ext2到Ext4,找数据的方式发生了变化,但是,磁盘的布局还是非常相似的. 其实这个东西也不需要变化,因为现在也没什么特别巧妙的方式,而且磁盘的吞吐量、效率的瓶颈也不在这里. 当然,这里排除那些根据自身文件特点设计的数据库,毕竟还是为了支持通用文件.   Boot在第一个块,放的应该是引导程序,超级块就放在了第二个块上,如果不是可以在mount的时候通过参数sb来设置.

HBase 系统架构

- - 博客园_首页
HBase是Apache Hadoop的数据库,能够对大型数据提供随机、实时的读写访问. HBase的目标是存储并处理大型的数据. HBase是一个开源的,分布式的,多版本的,面向列的存储模型. 5 可在廉价PC Server搭建大规模结构化存储集群. HBase是Google BigTable的开源实现,其相互对应如下:.

Linux系统监控

- - CSDN博客系统运维推荐文章
查看所有的进程和端口使用情况:. 查看nginx并发(连接数)进程数:. 查看当网络连接状态中,已建立连接的数量:. 查看系统tcp连接中各个状态的连接数. 输出每个ip的连接数,以及总的各个状态的连接数. df -hl 查看磁盘使用情况 . df -hl 查看磁盘剩余空间. df -h 查看每个根路径的分区大小.

mysql 权限系统

- - 数据库 - ITeye博客
mysql 权限系统控制一个用户是否能进行连接,以及连接后能够针对那些对象进行什么操作. mysql权限控制包含两个阶段. 2:检查用户是否具有所执行动作的权限. 本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的简单格式可概括为:. 一、grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利.

银行核心系统-贷款系统【信贷系统】

- - ITeye博客
一、         贷款业务. 贷款按期限分为短期、中期与长期贷款,短期贷款是指期限在1年以内的贷款,中期贷款是指期限在1年(含1年)至3年(含3年)之间的贷款,长期贷款是指期限超过3年的贷款. 贷款的种类目前有个人助学贷款和个人住房贷款:. l     个人助学贷款:须提供两位担保人,无须质押物,贷款额度不超过人民币10万元.