Rubinius - What Have You Done For Me Lately

Post on 15-May-2015

2.113 views 7 download

Tags:

description

Talk given at RubyConf 2010 in New Orleans by Evan Phoenix on Rubinius.

Transcript of Rubinius - What Have You Done For Me Lately

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