Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JRuby @ OpenFeint
Search
flyerhzm
November 19, 2012
Technology
23
3.4k
JRuby @ OpenFeint
一次JRuby迁移成功的案例
flyerhzm
November 19, 2012
Tweet
Share
More Decks by flyerhzm
See All by flyerhzm
玩转 AST
flyerhzm
0
340
Find and Replace Code based on AST
flyerhzm
0
460
Rails Performance Tips
flyerhzm
0
1.4k
Refactor ruby code based on AST
flyerhzm
4
4.3k
基于AST的代码优化
flyerhzm
10
890
Write ruby code to change ruby code
flyerhzm
5
3.7k
Building Asynchronous APIs
flyerhzm
25
9.1k
构建异步API服务
flyerhzm
19
7.4k
Other Decks in Technology
See All in Technology
Physical AI on AWS リファレンスアーキテクチャ / Physical AI on AWS Reference Architecture
aws_shota
1
130
AI時代のIssue駆動開発のススメ
moongift
PRO
0
170
Escape from Excel方眼紙 ~マークダウンで繋ぐ、人とAIの架け橋~ /nikkei-tech-talk44
nikkei_engineer_recruiting
0
200
Phase04_ターミナル基礎
overflowinc
0
2.2k
【社内勉強会】新年度からコーディングエージェントを使いこなす - 構造と制約で引き出すClaude Codeの実践知
nwiizo
22
11k
韓非子に学ぶAI活用術
tomfook
1
170
_Architecture_Modernization_から学ぶ現状理解から設計への道のり.pdf
satohjohn
2
740
CloudFrontのHost Header転送設定でパケットの中身はどう変わるのか?
nagisa53
1
150
AI時代のオンプレ-クラウドキャリアチェンジ考
yuu0w0yuu
0
230
Copilot 宇宙へ 〜生成AIで「専門データの壁」を壊す方法〜
nakasho
0
170
「お金で解決」が全てではない!大規模WebアプリのCI高速化 #phperkaigi
stefafafan
5
2.2k
The Rise of Browser Automation: AI-Powered Web Interaction in 2026
marcthompson_seo
0
310
Featured
See All Featured
Designing Powerful Visuals for Engaging Learning
tmiket
0
290
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
490
The SEO identity crisis: Don't let AI make you average
varn
0
420
Building Adaptive Systems
keathley
44
3k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
500
Producing Creativity
orderedlist
PRO
348
40k
Bash Introduction
62gerente
615
210k
A Soul's Torment
seathinner
5
2.5k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
61
43k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.1k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Transcript
JRuby @ OpenFeint 黄志敏 http://huangzhimin.com/2012/11/14/jruby-at-openfeint-jruby-migration-success-story/
JRuby 给 OpenFeint 带来 了40%的性能提升
关于OpenFeint • 最大的移动社交游戏平台 • 每分钟几十万的API调用 • 去年被GREE收购 • REE 1.8.7
+ Rails 2.3.14
关于我 • 黄志敏 Richard Huang (a.k.a flyerhzm) • 之前是OpenFeint资深工程师 现在是GREE咨询顾问
• 活跃于Ruby/JRuby的开源社区 • 个人主页 http://huangzhimin.com twitter, weibo, github: flyerhzm
为什么要尝试JRuby?
提高OpenFeint 服务器端的性能
Railsconf 2012
大多数人在抱怨Ruby的GC
Not a Vendor Pitch: Real World Rails Apps at Massive
Scale:: A Panel Discussion with New Relic, Groupon, Zendesk, Fanzter, and Uken http://railsconf2012.com/sessions/66
2场介绍JRuby的话题
Up and to the right – how Spiceworks is scaling
200 million requests per month http://railsconf2012.com/sessions/62
Complex Made Simple: Sleep Better with TorqueBox http://railsconf2012.com/sessions/16
快速性能测试
REE 1.8.7 2010.01 + passenger 331 ms JRuby 1.6.7.2 +
torquebox 51.5 ms 禁用mysql sharding,background job和其它无法工作的部分 部署在qa服务器上,memcached, redis, rabbitmq和app server在同一台机器 ree没有优化gc
JRuby迁移策略
fetch_friend_status OpenFeint基础设施 Load Balancers Web / App Servers Mysql Memcached
Redis Rabbitmq ......
fetch_friend_status OpenFeint基础设施 Load Balancers Web / App Servers Mysql Memcached
Redis Rabbitmq ......
fetch_friend_status OpenFeint基础设施 App服务器按功能拆分到不同的池 Load Balancers负载把请求分发到不同的池
JRuby迁移策略 一个池一个池地进行迁移
JRuby迁移策略 (优点) 人力投入少 更早地享受JRuby带来的高速 更早地发现问题 更快地积累线上运维的经验
JRuby迁移策略 (缺点) 必须保证代码可同时在REE和JRuby下运行 增加了部署的复杂度
替换不兼容的gem
yajl-ruby (x) hiredis (x) mysql => activerecord-jdbcmysql-adapter
typhoeus => net-http-persistent
memcached => jruby-memcached
启用 threadsafe http://jrubytips.com/posts/3-enable-threadsafe-for-rails
所有测试通过
JRuby往往需要更多的内存 JRUBY_OPTS=-J-Xmx2g jruby --client -S bundle exec rake test
在开发和测试环境使用CRuby 在生产环境使用JRuby http://jrubytips.com/posts/2-mri-for-development-and-test-while-jruby-for- production
选择JRuby服务器
Trinidad 基于 Tomcat Torquebox 基于 JBoss AS Mizuno 基于 Jetty
Puma 新的ruby server
Trinidad 基于 Tomcat Torquebox 基于 JBoss AS Mizuno 基于 Jetty
Puma 新的ruby server (rack 版本问题)
Trinidad 基于 Tomcat Torquebox 基于 JBoss AS (运行最快,团队维护) Mizuno 基于
Jetty Puma 新的ruby server (rack 版本问题)
torquebox-lite
监控JVM
REE监控 NewRelic Scout
JRuby监控 NewRelic Scout + JMX Monitoring Plugin Zabbix (没上)
JRuby监控 http://jrubytips.com/posts/6-monitor-jvm 命令行工具 jstat, jstack, jmap 图形化工具 jconsole, visualvm
JVM 相关的问题
内存泄漏
内存无法回收
内存无法回收 频繁执行Full GC 性能急剧下降
线程安全问题
ActiveRecord 2.3.14 线程池 不安全! https://gist.github.com/3882854
ActiveRecord 2.3线程池 不安全! 线程死锁 吞吐量逐渐下降
优化JVM Xms Xmx CodeCache http://jrubytips.com/posts/4-set-proper-value-for- codecache ......
性能测试
read action write action REE 1.8.7 2010.01 + passenger 448
ms 44 ms Ruby 1.9.3 p194 + passenger 374 ms 42 ms JRuby 1.7.0.RC2 + torquebox-lite 187 ms 38 ms 在备机上进行测试 连接产品环境的mysql, memcached, redis, rabbitmq等等 REE使用Twitter提供的GC优化
部署策略
热部署 touch /opt/torquebox/current/jboss/standalone/deployments/openfeint_pla tform-knob.yml.dodeploy 30s 左右的宕机时间 non heap memory 每次都会增加
Rolling restart sudo /etc/init.d/jboss-as-standalone restart 1. 从LB中移除服务器A 2. 在服务器A上重启JBOSS 3.
把服务器A加回到LB中 4. 对每台服务器重复以上操作 零宕机 http://jrubytips.com/posts/5-zero-downtime-deployment
上线之后效果如何?
性能提升 ~ 40%
None
invokedynamic?
bug 18:29:03,515 ERROR [org.torquebox.core.runtime] (Thread-71) Error during execution: ENV['RAILS_ROOT']=RACK_ROOT ENV['RAILS_ENV']=RACK_ENV
require %q(org/torquebox/web/rails/boot) : org.jruby.exceptions.RaiseException: (LoadError) load error: haml/buffer -- java.lang.NoClassDefFoundError: org/jruby/runtime/ThreadContext at org.jruby.RubyKernel.require(org/jruby/RubyKernel.java:1010) [jruby.jar:] at ActiveSupport::Dependencies::Loadable.require (/home/deploy/rails_apps/openfeint_platform/shared/bundle/jruby/1. 8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:182)
期待invokedynamic带来 更多的性能优化
感谢 JRuby team 感谢 Torquebox team
谢谢 提问