rubinius - what have you done for me lately
Post on 15-May-2015
2.113 Views
Preview:
DESCRIPTION
TRANSCRIPT
Tuesday, November 23, 2010
RubiniusWhat have you done for me today?
Tuesday, November 23, 2010
Rubinius?
Tuesday, November 23, 2010
Modern Ruby Implementation
Rubinius
Tuesday, November 23, 2010
Philosophy
Rubinius
Tuesday, November 23, 2010
Philosophy
Use Ruby
Rubinius
Tuesday, November 23, 2010
Philosophy
Allow Ruby to extend the system
Rubinius
Tuesday, November 23, 2010
module Enumerable def map if block_given? ary = [] each { |o| ary << yield(o) } ary else to_a end endend
Tuesday, November 23, 2010
Compatibility
1.8.7
Rubinius
Tuesday, November 23, 2010
Compatibility
Rails 2.3 - 3+
Rubinius
Tuesday, November 23, 2010
Compatibility
C extensions
Rubinius
Tuesday, November 23, 2010
Spin Off Projects
Rubinius
Tuesday, November 23, 2010
Spin Off Projects
RubySpec
Rubinius
Tuesday, November 23, 2010
Spin Off Projects
FFI
Rubinius
Tuesday, November 23, 2010
Drop In Compatible
Rubinius
Tuesday, November 23, 2010
Technology
Rubinius
Tuesday, November 23, 2010
Technology
Bring techniques to Ruby
Rubinius
Tuesday, November 23, 2010
Tuesday, November 23, 2010
Optimized to Machine Code
Tuesday, November 23, 2010
Bytecode VM
Optimized to Machine Code
Tuesday, November 23, 2010
Bytecode VM
Soph"ticated Garba# Collection
Optimized to Machine Code
Tuesday, November 23, 2010
Technology
Efficient Memory Layout
Rubinius
Tuesday, November 23, 2010
obj.ivars = { :@name => “Evan”, :@age => 31}
Tuesday, November 23, 2010
obj.class.ivars = { :@name => 0, :@age => 1}
obj.ivars = [ “Evan”, 31]
Tuesday, November 23, 2010
Flags
Class
Extra Ivars
@name
@age
Tuesday, November 23, 2010
Developers!
Tuesday, November 23, 2010
Developers!
Developers!
Tuesday, November 23, 2010
Developers!
Developers!
Developers!
Tuesday, November 23, 2010
Build tools around APIs
API Driven
Tuesday, November 23, 2010
Allow users to build more!
API Driven
Tuesday, November 23, 2010
Example
Bytecode Compiler
API Driven
Tuesday, November 23, 2010
Example
Bytecode and Compiler
API Driven
Tuesday, November 23, 2010
Example
Fancy Language
API Driven
Tuesday, November 23, 2010
Why useRubinius?
Tuesday, November 23, 2010
Focus on Developers
Why?
Tuesday, November 23, 2010
I’m a Ruby developer
Why?
Tuesday, November 23, 2010
Tools born from need
Why?
Tuesday, November 23, 2010
Improve an Algorithm
Problem:
Tuesday, November 23, 2010
Step 1
Improving
Tuesday, November 23, 2010
Step 1
Benchmark
Improving
Tuesday, November 23, 2010
require 'benchmark'cc = CoworkersCode.new
Benchmark.bm do |x| x.report("initial") { cc.calculate_awesome_score }end
Tuesday, November 23, 2010
user system total realinitial 0.071788 0.001601 0.073389 ( 29.998823)
Tuesday, November 23, 2010
29.998823
Tuesday, November 23, 2010
user system total realinitial 0.071788 0.001601 0.073389 ( 29.998823)
Tuesday, November 23, 2010
user: 0.071788system: 0.001601 total: 0.073389 real: 29.998823
Tuesday, November 23, 2010
Time running code
User
Tuesday, November 23, 2010
Time inside the kernel
System
Tuesday, November 23, 2010
Sum of user and system
Total
Tuesday, November 23, 2010
Elapsed wall clock time
Real
Tuesday, November 23, 2010
Time measured by a stop watch
Wall Clock
Tuesday, November 23, 2010
user: 0.071788system: 0.001601 total: 0.073389 real: 29.998823
Tuesday, November 23, 2010
0.073389
29.998823!=
Tuesday, November 23, 2010
0.073389
29.998823!=??
Tuesday, November 23, 2010
Step 2
Profile
Improving
Tuesday, November 23, 2010
» rbx -Xprofile scratch/profile_sample.rb
% cumulative self self total time seconds seconds calls ms/call ms/call name------------------------------------------------------------ 99.69 30.00 30.00 10 3000.10 3000.10 Rubinius::Channel#receive_timeout 0.13 0.04 0.04 2 19.82 19.82 IO.open_with_mode 0.11 0.03 0.03 1 33.05 33.05 IO::Buffer#fill 0.02 0.01 0.01 18 0.30 0.30 FFI::Platform::POSIX.stat
Tuesday, November 23, 2010
» rbx -Xprofile scratch/profile_sample.rb
% cumulative self self total time seconds seconds calls ms/call ms/call name------------------------------------------------------------ 99.69 30.00 30.00 10 3000.10 3000.10 Rubinius::Channel#receive_timeout 0.13 0.04 0.04 2 19.82 19.82 IO.open_with_mode 0.11 0.03 0.03 1 33.05 33.05 IO::Buffer#fill 0.02 0.01 0.01 18 0.30 0.30 FFI::Platform::POSIX.stat
Tuesday, November 23, 2010
» rbx -Xprofile scratch/profile_sample.rb
% cumulative self self total time seconds seconds calls ms/call ms/call name------------------------------------------------------------ 99.69 30.00 30.00 10 3000.10 3000.10 Rubinius::Channel#receive_timeout 0.13 0.04 0.04 2 19.82 19.82 IO.open_with_mode 0.11 0.03 0.03 1 33.05 33.05 IO::Buffer#fill 0.02 0.01 0.01 18 0.30 0.30 FFI::Platform::POSIX.stat
Tuesday, November 23, 2010
» rbx -Xprofile scratch/profile_sample.rb
% cumulative self self total time seconds seconds calls ms/call ms/call name------------------------------------------------------------ 99.69 30.00 30.00 10 3000.10 3000.10 Rubinius::Channel#receive_timeout 0.13 0.04 0.04 2 19.82 19.82 IO.open_with_mode 0.11 0.03 0.03 1 33.05 33.05 IO::Buffer#fill 0.02 0.01 0.01 18 0.30 0.30 FFI::Platform::POSIX.stat
Tuesday, November 23, 2010
» rbx -Xprofile -Xprofiler.graph scratch/profile_sample.rb
Tuesday, November 23, 2010
» rbx -Xprofile -Xprofiler.graph scratch/profile_sample.rb
Tuesday, November 23, 2010
» rbx -Xprofile -Xprofiler.graph scratch/profile_sample.rb
0.00 30.00 10/60 Kernel#sleep [15][16] 99.9 30.00 0.00 10 Rubinius::Channel#receive_timeout [16]
Tuesday, November 23, 2010
» rbx -Xprofile -Xprofiler.graph scratch/profile_sample.rb
0.00 30.00 10/60 Kernel#sleep [15][16] 99.9 30.00 0.00 10 Rubinius::Channel#receive_timeout [16]
0.00 30.00 10/20 CoworkersCode#superhero_factor [14][15] 99.9 0.00 30.00 10 Kernel#sleep [15] 30.00 0.00 10/10 Rubinius::Channel#receive_timeout [16]
Tuesday, November 23, 2010
» rbx -Xprofile -Xprofiler.graph scratch/profile_sample.rb
0.00 30.00 10/60 Kernel#sleep [15][16] 99.9 30.00 0.00 10 Rubinius::Channel#receive_timeout [16]
0.00 30.00 10/20 CoworkersCode#superhero_factor [14][15] 99.9 0.00 30.00 10 Kernel#sleep [15] 30.00 0.00 10/10 Rubinius::Channel#receive_timeout [16]
Tuesday, November 23, 2010
» rbx -Xprofile -Xprofiler.graph scratch/profile_sample.rb
0.00 30.00 10/60 Kernel#sleep [15][16] 99.9 30.00 0.00 10 Rubinius::Channel#receive_timeout [16]
0.00 30.00 10/20 CoworkersCode#superhero_factor [14][15] 99.9 0.00 30.00 10 Kernel#sleep [15] 30.00 0.00 10/10 Rubinius::Channel#receive_timeout [16]
Tuesday, November 23, 2010
def superhero_factor sleep 3 rand(10) end
Tuesday, November 23, 2010
def superhero_factor sleep 3 rand(10) end
Tuesday, November 23, 2010
Step 3
Fix and benchmark
Improving
Tuesday, November 23, 2010
user system total realinitial 0.000102 0.000047 0.000149 ( 0.000139)
Tuesday, November 23, 2010
0.000139
Tuesday, November 23, 2010
0.000139
Tuesday, November 23, 2010
0.073389
29.998823!=
Tuesday, November 23, 2010
Invisible in all but real time
Sleep!
Tuesday, November 23, 2010
Improve an Algorithm
Problem:
Tuesday, November 23, 2010
Improve an Algorithm
Problem:
SOLVED!
Tuesday, November 23, 2010
Slow / hung process
Problem:
Tuesday, November 23, 2010
» bin/rbx scratch/qa_sample.rb 1288125364.684678: Server started, pid 39331
Tuesday, November 23, 2010
Slow / hung process
Use Query Agent to inspect
Problem:
Tuesday, November 23, 2010
» bin/rbx -Xagent.start scratch/qa_sample.rb 1288125364.684678: Server started, pid 39331
Tuesday, November 23, 2010
» bin/rbx -Xagent.start scratch/qa_sample.rb 1288125364.684678: Server started, pid 39331
Tuesday, November 23, 2010
» bin/rbx consoleVM: bin/rbx -Xagent.start scratch/qa_sample.rbConnecting to VM on port 58273Connected to localhost:58273, host type: x86_64-apple-darwin10.4.0console>
Tuesday, November 23, 2010
» bin/rbx consoleVM: bin/rbx -Xagent.start scratch/qa_sample.rbConnecting to VM on port 58273Connected to localhost:58273, host type: x86_64-apple-darwin10.4.0console> pidPID: 39331
Tuesday, November 23, 2010
» bin/rbx -Xagent.start scratch/qa_sample.rb 1288125364.684678: Server started, pid 39331
Tuesday, November 23, 2010
» bin/rbx consoleVM: bin/rbx -Xagent.start scratch/qa_sample.rbConnecting to VM on port 58273Connected to localhost:58273, host type: x86_64-apple-darwin10.4.0console> pidPID: 39331console> backtrace
Tuesday, November 23, 2010
» bin/rbx consoleVM: bin/rbx -Xagent.start scratch/qa_sample.rbConnecting to VM on port 58273Connected to localhost:58273, host type: x86_64-apple-darwin10.4.0console> pidPID: 39331console> backtraceThread 0:0x7fff5fbfc250: IO::Buffer#fill_from in kernel/common/io.rb:67 (+72)0x7fff5fbfc690: IO#read in kernel/common/io.rb:1197 (+125)0x7fff5fbfcaf0: ImportantServer#get_request in /Users/evan/git/rbx-release/scratch/qa_sample.rb:10 (+7)0x7fff5fbfced0: MAIN.__script__ in /Users/evan/git/rbx-release/scratch/qa_sample.rb:17 (+91)0x7fff5fbfd390: Rubinius::CodeLoader#load_script in kernel/delta/codeloader.rb:67 (+44)0x7fff5fbfd790: Rubinius::CodeLoader.load_script in kernel/delta/codeloader.rb:91 (+40)0x7fff5fbfdbb0: Rubinius::Loader#script in kernel/loader.rb:467 (+125)0x7fff5fbfdfc0: Rubinius::Loader#main in kernel/loader.rb:578 (+64)0x7fff5fbfe3e0: Rubinius::Loader.main in kernel/loader.rb:617 (+33)0x7fff5fbfe800: Object#__script__ in kernel/loader.rb:628 (+60)
Tuesday, November 23, 2010
Thread 0:0x7fff5fbfc250: IO::Buffer#fill_from in kernel/common/io.rb:67 (+72)0x7fff5fbfc690: IO#read in kernel/common/io.rb:1197 (+125)0x7fff5fbfcaf0: ImportantServer#get_request in /Users/evan/git/rbx-release/scratch/qa_sample.rb:10 (+7)0x7fff5fbfced0: MAIN.__script__ in /Users/evan/git/rbx-release/scratch/qa_sample.rb:17 (+91)0x7fff5fbfd390: Rubinius::CodeLoader#load_script in kernel/delta/codeloader.rb:67 (+44)0x7fff5fbfd790: Rubinius::CodeLoader.load_script in kernel/delta/codeloader.rb:91 (+40)0x7fff5fbfdbb0: Rubinius::Loader#script in kernel/loader.rb:467 (+125)0x7fff5fbfdfc0: Rubinius::Loader#main in kernel/loader.rb:578 (+64)0x7fff5fbfe3e0: Rubinius::Loader.main in kernel/loader.rb:617 (+33)0x7fff5fbfe800: Object#__script__ in kernel/loader.rb:628 (+60)
Tuesday, November 23, 2010
Thread 0:0x7fff5fbfc250: IO::Buffer#fill_from in kernel/common/io.rb:67 (+72)0x7fff5fbfc690: IO#read in kernel/common/io.rb:1197 (+125)0x7fff5fbfcaf0: ImportantServer#get_request in /Users/evan/git/rbx-release/scratch/qa_sample.rb:10 (+7)0x7fff5fbfced0: MAIN.__script__ in /Users/evan/git/rbx-release/scratch/qa_sample.rb:17 (+91)0x7fff5fbfd390: Rubinius::CodeLoader#load_script in kernel/delta/codeloader.rb:67 (+44)0x7fff5fbfd790: Rubinius::CodeLoader.load_script in kernel/delta/codeloader.rb:91 (+40)0x7fff5fbfdbb0: Rubinius::Loader#script in kernel/loader.rb:467 (+125)0x7fff5fbfdfc0: Rubinius::Loader#main in kernel/loader.rb:578 (+64)0x7fff5fbfe3e0: Rubinius::Loader.main in kernel/loader.rb:617 (+33)0x7fff5fbfe800: Object#__script__ in kernel/loader.rb:628 (+60)
Tuesday, November 23, 2010
Slow / hung process
Sample process via CLI
Problem:
Tuesday, November 23, 2010
» bin/rbx -Xagent.start -Xagent.verbose \ scratch/qa_sample.rb[QA: Bound to port 58407]1288125364.684678: Server started, pid 39331
Tuesday, November 23, 2010
» bin/rbx -Xagent.start -Xagent.verbose \ scratch/qa_sample.rb[QA: Bound to port 58407]1288125364.684678: Server started, pid 39331
Tuesday, November 23, 2010
» bin/rbx -Xagent.start -Xagent.verbose \ scratch/qa_sample.rb[QA: Bound to port 58407]1288125364.684678: Server started, pid 39331
Tuesday, November 23, 2010
» bin/rbx console -p 58431 --btThread 0:0x7fff5fbfc200: IO::Buffer#fill_from in kernel/common/io.rb:67 (+72)0x7fff5fbfc640: IO#read in kernel/common/io.rb:1197 (+125)0x7fff5fbfcaa0: ImportantServer#get_request in /Users/evan/git/rbx-release/scratch/qa_sample.rb:10 (+7)0x7fff5fbfce80: MAIN.__script__ in /Users/evan/git/rbx-release/scratch/qa_sample.rb:17 (+91)0x7fff5fbfd340: Rubinius::CodeLoader#load_script in kernel/delta/codeloader.rb:67 (+44)0x7fff5fbfd740: Rubinius::CodeLoader.load_script in kernel/delta/codeloader.rb:91 (+40)0x7fff5fbfdb60: Rubinius::Loader#script in kernel/loader.rb:467 (+125)0x7fff5fbfdf70: Rubinius::Loader#main in kernel/loader.rb:578 (+64)0x7fff5fbfe390: Rubinius::Loader.main in kernel/loader.rb:617 (+33)0x7fff5fbfe7b0: Object#__script__ in kernel/loader.rb:628 (+60)
Tuesday, November 23, 2010
Slow / hung process
Easy API to build monitoring tools
Problem:
Tuesday, November 23, 2010
require 'socket'require 'rubinius/agent'port = 58431agent = Rubinius::Agent.connect( "localhost", port)kind, bt = agent.get("system.backtrace")
Tuesday, November 23, 2010
Socket based VM API
Query Agent
Tuesday, November 23, 2010
Socket based VM API
Simple get/set variables
Query Agent
Tuesday, November 23, 2010
Slow / hung process
Problem:
Tuesday, November 23, 2010
Slow / hung process
Problem:
SOLVED!
Tuesday, November 23, 2010
Memory Footprint
Problem:
Tuesday, November 23, 2010
Memory Footprint
Suspect some kind of memory leak
Problem:
Tuesday, November 23, 2010
Memory Footprint
Use Heap Dump!
Problem:
Tuesday, November 23, 2010
» bin/rbx -Xagent.start scratch/hd_demo.rb Waiting...
Tuesday, November 23, 2010
» bin/rbx consoleVM: bin/rbx -Xagent.start scratch/hd_demo.rbConnecting to VM on port 58710Connected to localhost:58710, host type: x86_64-apple-darwin10.4.0console> set system.memory.dump heap.dump
Tuesday, November 23, 2010
» bin/rbx -Xagent.start scratch/hd_demo.rb Waiting...Heap dumped to heap.dump
Tuesday, November 23, 2010
» rbx -Ilib histo.rb ../rbx-release/heap.dump 19798 Rubinius::Tuple 3487912 4867 Rubinius::MethodTable::Bucket 272552 4218 String 303696 4193 Rubinius::CompiledMethod 805056 4193 Rubinius::InstructionSequence 134176 4110 Rubinius::ByteArray 100199256 1547 Rubinius::LookupTable::Bucket 74256 1053 Rubinius::LookupTable 50544 1010 Rubinius::MethodTable 48480 1000 BigCrazyClass 32000 966 Class 104592 783 Rubinius::StaticScope 37584 704 Rubinius::AccessVariable 56320
Tuesday, November 23, 2010
» rbx -Ilib histo.rb ../rbx-release/heap.dump 19798 Rubinius::Tuple 3487912 4867 Rubinius::MethodTable::Bucket 272552 4218 String 303696 4193 Rubinius::CompiledMethod 805056 4193 Rubinius::InstructionSequence 134176 4110 Rubinius::ByteArray 100199256 1547 Rubinius::LookupTable::Bucket 74256 1053 Rubinius::LookupTable 50544 1010 Rubinius::MethodTable 48480 1000 BigCrazyClass 32000 966 Class 104592 783 Rubinius::StaticScope 37584 704 Rubinius::AccessVariable 56320
Tuesday, November 23, 2010
Complete Heap Layout
Heap Dump
Tuesday, November 23, 2010
Complete Heap Layout
Stable format
Heap Dump
Tuesday, November 23, 2010
Complete Heap Layout
Reference Ruby Reader
Heap Dump
Tuesday, November 23, 2010
Gauge
Heap Dump
Tuesday, November 23, 2010
Gauge
Rails Application Explorer
Heap Dump
Tuesday, November 23, 2010
Future Feature
Tracking allocation sites
Heap Dump
Tuesday, November 23, 2010
Memory Footprint
Problem:
Tuesday, November 23, 2010
Memory Footprint
Problem:
SOLVED!
Tuesday, November 23, 2010
Memory Footprint
Problem:
SOLVED!(mostly)
Tuesday, November 23, 2010
Future
Tuesday, November 23, 2010
1.9
Future
Tuesday, November 23, 2010
Windows
Future
Tuesday, November 23, 2010
Full Concurrency
Future
Tuesday, November 23, 2010
Why Not?
Tuesday, November 23, 2010
Thanks!
Tuesday, November 23, 2010
top related