Ruby.inspect. Koichi Sasada. <ko1@heroku.com>



Similar documents
What s happening in your Rails app? Introduction to Introspection features of Ruby

最 近 の Ruby のメモリ 管 理 Recent Ruby s memory management

Jonathan Worthington Scarborough Linux User Group

Java Troubleshooting and Performance

General Introduction

Monitoring, Tracing, Debugging (Under Construction)

Lecture 1 Introduction to Android

serious tools for serious apps

Using jvmstat and visualgc to Solve Memory Management Problems

vmprof Documentation Release 0.1 Maciej Fijalkowski, Antonio Cuni, Sebastian Pawlus

Example of Standard API

Improving Your App with Instruments

HeapStats: Your Dependable Helper for Java Applications, from Development to Operation

Practical Performance Understanding the Performance of Your Application

IBM SDK, Java Technology Edition Version 1. IBM JVM messages IBM

New Relic & JMeter - Perfect Performance Testing

Valgrind BoF Ideas, new features and directions

OS Observability Tools

GDB Tutorial. A Walkthrough with Examples. CMSC Spring Last modified March 22, GDB Tutorial

Habanero Extreme Scale Software Research Project

Application-Level Debugging and Profiling: Gaps in the Tool Ecosystem. Dr Rosemary Francis, Ellexus

Get the Better of Memory Leaks with Valgrind Whitepaper

The programming language C. sws1 1

How To Use Java On An Ipa (Jspa) With A Microsoft Powerbook (Jempa) With An Ipad And A Microos 2.5 (Microos)

CSCI E 98: Managed Environments for the Execution of Programs

MA-WA1920: Enterprise iphone and ipad Programming

Embedded Systems. Review of ANSI C Topics. A Review of ANSI C and Considerations for Embedded C Programming. Basic features of C

Software Engineering Best Practices. Christian Hartshorne Field Engineer Daniel Thomas Internal Sales Engineer

Sequential Performance Analysis with Callgrind and KCachegrind

Java memory proler user guide

The Definitive Guide To Docker Containers

EECS 354 Network Security. Introduction

CSE 403. Performance Profiling Marty Stepp

C Compiler Targeting the Java Virtual Machine

How To Port A Program To Dynamic C (C) (C-Based) (Program) (For A Non Portable Program) (Un Portable) (Permanent) (Non Portable) C-Based (Programs) (Powerpoint)

AMD CodeXL 1.7 GA Release Notes

VA Smalltalk Update. John O Keefe Principal Smalltalk Architect Instantiations, Inc. Copyright 2011, Instantiations, Inc.

MID-TIER DEPLOYMENT KB

Storm Worm & Botnet Analysis

A JIT Compiler for Android s Dalvik VM. Ben Cheng, Bill Buzbee May 2010

Chapter 3 Operating-System Structures

Eclipse Visualization and Performance Monitoring

Innovative Program to Access VMware Tools

Comp 411 Principles of Programming Languages Lecture 34 Semantics of OO Languages. Corky Cartwright Swarat Chaudhuri November 30, 20111

Debugging Java performance problems. Ryan Matteson

Sequential Performance Analysis with Callgrind and KCachegrind

Language Based Virtual Machines... or why speed matters. by Lars Bak, Google Inc

Semester Review. CSC 301, Fall 2015

Red Hat Linux Internals

The V8 JavaScript Engine

Chapter 3: Operating-System Structures. System Components Operating System Services System Calls System Programs System Structure Virtual Machines

Tomcat Tuning. Mark Thomas April 2009

Computer Systems and Networks. ECPE 170 Jeff Shafer University of the Pacific. Linux Basics

PTC System Monitor Solution Training

A Typing System for an Optimizing Multiple-Backend Tcl Compiler

INTEL PARALLEL STUDIO XE EVALUATION GUIDE

Identifying Performance Bottleneck using JRockit. - Shivaram Thirunavukkarasu Performance Engineer Wipro Technologies

A Practical Method to Diagnose Memory Leaks in Java Application Alan Yu

Real-time Debugging using GDB Tracepoints and other Eclipse features

How to create/avoid memory leak in Java and.net? Venkat Subramaniam

Introduction to Embedded Systems. Software Update Problem

6.170 Tutorial 3 - Ruby Basics

Monitoring and Managing a JVM

CS3813 Performance Monitoring Project

Linux Tools for Monitoring and Performance. Khalid Baheyeldin November 2009 KWLUG

Code::Blocks Student Manual

Android Developer Fundamental 1

Automated Virtual Cloud Management: The need of future

Operating System Structures

ReqXChanger Closing the Gap between Requirements and Modelling

Frysk The Systems Monitoring and Debugging Tool. Andrew Cagney

Lab 2: Swat ATM (Machine (Machine))

A lap around Team Foundation Server 2015 en Visual Studio 2015

A Unified View of Virtual Machines

Performance Testing. Based on slides created by Marty Stepp

Best Practices on monitoring Solaris Global/Local Zones using IBM Tivoli Monitoring

Instrumentation Software Profiling

The release notes provide details of enhancements and features in Cloudera ODBC Driver for Impala , as well as the version history.

Crash Course in Java

Network Administration and Monitoring

Compilers and Tools for Software Stack Optimisation

Last Class: OS and Computer Architecture. Last Class: OS and Computer Architecture

GPU Tools Sandra Wienke

High Performance Computing in Aachen

RTI Monitoring Library Getting Started Guide

Effective Java Programming. measurement as the basis

MatrixSSL Developer s Guide

Linux Performance Optimizations for Big Data Environments

CSC230 Getting Starting in C. Tyler Bletsch

HP Server Automation. Software Versions: 7.8x, 9.0x, 9.1x. Software Discovery Reference Guide

NetBeans Profiler is an

What s Cool in the SAP JVM (CON3243)

A (Web) Face for Radio. NPR and Drupal7 David Moore

CSE 265: System and Network Administration. CSE 265: System and Network Administration

System Structures. Services Interface Structure

Resource Utilization of Middleware Components in Embedded Systems

Puppet Firewall Module and Landb Integration

The C Programming Language course syllabus associate level

Networks and Services

All Your Code Belongs To Us Dismantling Android Secrets With CodeInspect. Steven Arzt Secure Software Engineering Group Steven Arzt 1

Transcription:

Ruby.inspect Koichi Sasada <ko1@heroku.com>

Summary.inspect Introduction of new Ruby Stable 2.1 Next version of 2.2 How to inspect your application behavior With tools & services Make a tools by inspection primitives Inspection from outside

Today s Message.inspect Become a Low-level engineer (somtimes)

Ko1.inspect #=> <Ko1: @name= Koichi Sasada > Koichi Sasada a.k.a. ko1 From Japan 笹 田 (family name) 耕 一 (given name) in Kanji character Ichi (Kanji character 一 ) means 1 or first This naming rule represents I m the first son of my parents Ko ichi ko1

Ko1.inspect #=> <Ko1: @job= Programmer > CRuby/MRI committer Virtual machine (YARV) from Ruby 1.9 YARV development since 2004/1/1 Recently, improving GC performance Matz team at Heroku, Inc. Full-time CRuby developer Working in Japan Director of Ruby Association

RubyAssociation.inspect #=> The Ruby Association was founded to further development of the programming language Ruby. The goals of the Ruby Association are to improve relationship between Ruby-related projects, communities and businesses, and to address issues connected with using Ruby in an enterprise environment. Quoted from http://www.ruby.or.jp/en/

Foundation to encourage Ruby dev. and communities Activities Ruby programmer certification program http://www.ruby.or.jp/en/certification/examination/ in English Grant project. We have selected 3 proposals in 2013 Ruby Prize To recognize the efforts of New members to the Ruby community http://www.ruby.or.jp/en/news/20140627.html Maintenance of Ruby (Cruby) interpreter Now, it is for Ruby 2.0.0 Events, especially RubyWorld Conference http://www.rubyworld-conf.org/ Donation for Ruby developments and communities

Heroku, Inc. http://www.heroku.com You should know about Heroku!!

Heroku, Inc. http://www.heroku.com Heroku supports OSSs / Ruby development Many talents for Ruby, and also other languages Heroku employs 3 Ruby interpreter core developers Matz Nobu Ko1 (me) We name our group Matz team

Matz team.inspect Nobu @ Tochigi Patch monster Matz @ Shimane Title collector ko1 @ Tokyo EDD developer

Matz.inspect #=> Title collector He has so many (job) title Chairman - Ruby Association Fellow - NaCl Chief architect, Ruby - Heroku Research institute fellow Rakuten Chairman NPO mruby Forum Senior researcher Kadokawa Ascii Research Lab Visiting professor Shimane University Honorable citizen (living) Matsue city Honorable member Nihon Ruby no Kai This margin is too narrow to contain

Nobu.inspect #=> Patch monster Great patch creator

Nobu is Great Patch Monster nobu 29% akr 12% svn 9% naruse 8% usa 4% ko1 4% drbrain 3% kosaki 3% kazu 2% zzak 2% tenderlove 2% matz 2% marcandre 2% mame 2% tadf 2% knu 1% shugo 1% nagachika 1% yugui 1% kou 1% mrkn 1% emboss 1% shyouhei 1% nari 0% glass 0% ktsj 0% nahi 0% ayumin 0% tarui 0% sorah 0% ryan 0% charliesome 0% shirosaki 0% xibbar 0% nagai 0% eregon 0% ngoto 0% wanabe 0% azav 0% keiju 0% suke 0% kouji 0% duerst 0% takano32 0% luislavena 0% jeg2 0% hsbt 0% arton 0% seki 0% kanemoto 0% tmm1 0% eban 0% muraken 0% headius 0% evan 0% a_matsuda 0% iwamatsu 0% technorama 0% davidflanagan 0% gotoken 0% okkez 0% COMMIT RATIO IN LAST 5 YEARS

2010/11/8 2011/1/8 2011/3/8 2011/5/8 2011/7/8 2011/9/8 2011/11/8 2012/1/8 2012/3/8 2012/5/8 2012/7/8 2012/9/8 2012/11/8 2013/1/8 2013/3/8 2013/5/8 2013/7/8 2013/9/8 2013/11/8 Ko1.inspect #=> EDD developer 25 20 15 10 Commit number of ko1 (last 3 years) RubyConf 2012 Ruby 2.0 Euruko 2013 RubyKaigi 2013 RubyConf 2013 5 0 EDD: Event "Ruby.inspect" Driven by Koichi Sasada, Development RDRC2014

Mission of Matz team.inspect Improve quality of next version of CRuby Matz decides a spec finally Nobu fixed huge number of bugs Ko1 improves the performance

Ruby 2.1.inspect #=> Current stable http://www.flickr.com/photos/loginesta/5266114104

Ruby 2.1.inspect #=> a bit old Ruby Ruby 2.1.0 was released at 2013/12/25 New features Performance improvements Ruby 2.1.1 was released at 2014/02/24 Includes many bug fixes found after 2.1.0 release Introduce a new GC tuning parameter to change generational GC behavior (introduce it later) Ruby 2.1.2 was released at 2014/05/09 Solves critical bugs (OpenSSL and so on)

Ruby 2.1 the biggest change Version policy Change the versioning policy Drop patch level in the version Teeny represents patch level Release new teeny versions about every 3 month Teeny upgrades keep compatibility Minor upgrades can break backward compatibility We make an effort to keep compatibility (recently. Remember Ruby 1.9 )

Ruby 2.1 New syntax New syntaxes Required keyword parameter Rational number literal Complex number literal `def returns symbol of method name http://www.flickr.com/photos/rooreynolds/4133549889

Ruby 2.1 Syntax Required keyword parameter Keyword argument (from Ruby 2.0.0) def foo(a: 1, b: 2); end `a and `b are optional parameters OK: foo(); foo(a: 1); foo(a: 1, b: 2); foo(b: 2) Required keyword argument from 2.1 def foo(a: 1, b: ) `a is optional, but `b is required parameter OK: foo(a: 1, b: 2); foo(b: 2) NG: foo(); foo(a: 1)

Ruby 2.1 Syntax Rational number literals To represent ½, in Ruby Rational(1, 2) Too long!! Introduce r suffix ½ 1/2r [digits]r represents Rational([digits], 1) ½ 1/2r 1/2r #=> 1/Rational(2, 1) 1/Rational(2, 1) #=> Rational(1/2)

Ruby 2.1 Syntax Complex number literals We already have Integer#i method to make imaginary number like 1+2.i We already introduced r suffix for Rational No reason to prohibit i suffix!! [digits]i represents Complex(0, [digits]) 1+2i #=> 1+Complex(0, 2) 1+Complex(0, 2) #=> Complex(1, 2) You can mix r and i suffix

Ruby 2.1 Syntax Return value of `def syntax Return value of method definition Method definition syntax returns symbol of defined method name `def foo; ; end #=> :foo Method modifier methods Example: private def foo; ; end public static void def main(args); ; end

Ruby 2.1 Runtime new features String#scrub Process.clock_gettime Binding#local_variable_get/set Bignum now uses GMP (if available) Extending ObjectSpace

Performance improvements Optimize string literal.freeze Sophisticated inline method cache Introducing Generational GC: RGenGC

RGenGC: Generational GC for Ruby RGenGC: Restricted Generational GC Generational GC (minor/major GC uses M&S) Dramatically speedup for GC-bottleneck applications New generational GC algorithm allows mixing Writebarrier protected objects and WB unprotected objects No (mostly) compatibility issue with C-exts Inserting WBs gradually We can concentrate WB insertion efforts for major objects and major methods Now, most of objects (such as Array, Hash, String, etc.) are WB protected Array, Hash, Object, String objects are very popular in Ruby Array objects using RARRAY_PTR() change to WB unprotected objects (called as Shady objects), so existing codes still works.

Accumulated execution time (sec) RGenGC Performance evaluation (RDoc) 14 12 10 8 6 4 2 0 About x15 speedup! Total mark time (ms) Total sweep time (sec) w/o RGenGC RGenGC * Disabled lazy sweep to measure correctly.

Total execution time (sec) RGenGC Performance evaluation (RDoc) 140 120 100 80 60 40 20 0 16.04393815 4.946003494 103.7627479 102.3799865 w/o RGenGC RGenGC other than GC GC * 12% improvements compare with w/ and w/o RGenGC * Disabled "Ruby.inspect" lazy sweep by Koichi to measure Sasada, RDRC2014 correctly.

http://www.flickr.com/photos/adafruit/8483990604 Ruby 2.2.inspect #=> Next version

Schedule of Ruby 2.2 Not published officially Schedule draft is available by Naruse-san https://bugs.ruby-lang.org/projects/rubytrunk/wiki/releaseengineering22

Ruby 2.2 schedule 2013/12 Ruby 2.1.0 We are here! 2014/12/25 Ruby 2.2.0 Rubyconf.PH 3/28, 29 Rubyconf.tw 4/25, 26 RDRC 6/26, 27 RubyKaigi 9/18, 19, 20 RubyConf 11/17, 18, 19 Events are important for EDD (Event Driven Development) Developers

Ruby 2.2 (rough) schedule 2013/12 Ruby 2.1.0 We are here! Sep/2014 Preview 1 Big feature freeze 2014/12/25 Ruby 2.2.0 26 th,jul/2014 Dev. Meeting Feature proposal Aug/2014 Dev. Meeting Feature proposal Bug fix only Nov/2014 Preview2 Feature freeze Critical Bug fix only Dec/2014 Release candidate

2.2 big features (planned) New syntax: not available now New method: no notable methods available now Libraries: Minitest and test/unit will be removed (provided by bundled gem)

2.2 internal changes Internal C APIs Hide internal structures for Hash, Struct and so on Remove obsolete APIs GC Symbol GC (merged recently) 2age promotion strategy for RGenGC Incremental GC to reduce major GC pause time VM More sophisticated method cache

Symbol GC Symbols remain forever Security issue n.times{ i i.to_s.to_sym} creates n symbols and they are never collected Symbol GC: Collect dynamically created symbols

http://www.flickr.com/photos/donkeyhotey/8422065722 Break

Ruby.inspect https://www.flickr.com/photos/theloushe/4640871734/

Inspecting Ruby You may want to know what happen? on your application Ruby has many inspecting features to see applications behavior Some features are supported only by MRI/CRuby

Why inspect is needed? Code reading Debugging Performance tuning Understanding Ruby s implementation

How to inspect your app? Use Tools and services for Ruby Make tools with Standard inspect features Inspect Ruby process itself from outside

Inspection features on computer layers Your app Libraries/Tools Ruby interpreter Tools & Services Primitives Operating System Hardware

Tools & Services https://www.flickr.com/photos/bunnyrel/9015937323

Tools & Services Your app Libraries/Tools Tools & Services Ruby interpreter Operating System Hardware

Tools & Services Benchmarking benchmark benchmark/ips Profiling [Time] ruby-prof (deterministic profiler) [Time] perftools.rb, stackprof, rblineprof (sampling profilers) [Memory] GCTracer, AllocationTracer, [Total] NewRelic Debugging ruby-debug byebug (2.0~) tracer (standard library)

New Relic Dive into Ruby VM Stats with New Relic http://blog.newrelic.com/2014/04/23/ruby-vmstats/ Ruby VM measurements https://docs.newrelic.com/docs/ruby/ruby-vmstats IMPORTANT You can use New Relic very easily on Heroku as an Add-on

Tools & Services You can find manuals for tools! Enjoy! Debugging Ruby Performance by Aman Gupta will help you to survey https://speakerdeck.com/tmm1/debugging-rubyperformance

Ruby s Inspection primitives How to make inspection tools? https://www.flickr.com/photos/fiddleoak/6691220069/

Inspection features on computer layers Your app Libraries/Tools Ruby interpreter Primitives Operating System Hardware

Ruby s Inspection primitives Show object Reflections Statistics Tracing

Show objects Kernel#p and pp library Debug print Kernel#p(obj): print result of obj.inspect pp: print pretty printed result Both print onto STDOUT You can modify Object#inspect for better representation Everyone love to use Traditional printf debug

Show objects Kernel#p and pp library Tips Use p() method with keyword argument foo=[1, 2]; bar={a: 1, b: ['bar']} p foo: foo, bar: bar #=> {:foo=>[1, 2], :bar=>{:a=>1, :b=>["bar"]}} PP.pp(obj, STDERR) prints onto STDERR, not STDOUT

Show objects ObjectSpace::dump(obj) Dump the contents of a ruby object as JSON Not for serializing, but for seeking internal implementation specific information ObjectSpace::dump_all() dumps all objects and relations It will help us to find out memory leak (unexpected relation to prevent GC collection) Introduced from Ruby 2.1

Reflections https://www.flickr.com/photos/cbpphotos/11934804573

Reflections Stack trace caller, caller_locations Thread#backtrace, Thread#backtrace_locations Access variables Object#instance_variable_get(name) Binding#local_variable_get(name) Kernel#global_variable_get(name) Module#class_variable_get(name) Module#const_get Definitions #source_location, #arity, #parameters for Method and Proc objects Last weapon Kernel#eval, Object#instance_eval,

Getting stack trace caller, caller_locations caller() returns Backtrace strings array. like ["t.rb:1:in `<main>'"] caller_locations() retuns OO style backtrace information caller_locations(0).each{ loc p "#{loc.path}:#{loc.lineno} } No need to parse backtrace string!

Getting more rich trace debug_inspector gem Binding information for each frame General version of caller_binding https://github.com/banister/debug_inspector

Accessing variables Object#instance_variable_get(name) Binding#local_variable_get(name) Kernel#global_variable_get(name) Module#class_variable_get(name) Module#const_get

Getting definitions Method#source_location, Proc#source_location Method#arity, Proc#arity Method#parameters, Proc#parameters

Evil eval eval series Kernel#eval, Binding#eval Object#instance_eval Module#module_eval Can do everything Accessing any variable (getting and setting) Evaluate any expression Strong, but dangerous

Statistics https://www.flickr.com/photos/cimmyt/5428317596

Statistics features GC.stat for GC (memory management) ObjectSpace::count_objects

Statistics information GC.stat returns current information of GC Counts :count=>2, :minor_gc_count=>2, :major_gc_count=>0, # GC count # minor GC count # major GC count Current slot information :heap_live_slot=>6836, #=> # of live objects :heap_free_slot=>519, #=> # of freed objects :heap_final_slot=>0, #=> # of waiting finalizer objects total_slots = heap_live_slot + heap_free_slot + heap_final_slot Statistics :total_allocated_object=>7674, # total allocated objects :total_freed_object=>838,# total freed objects Current living objects = total_allocated_object - total_freed_object

GC.stat example: normal program 100_000.times{ i ""; # Generate an empty string h = GC.stat puts "#{i} t#{h[:total_allocated_object]} t#{h[:total_freed_object]}"}

GC.stat example: Leakey behavior Live obj# ary = [] 100_000.times{ i ary << "" # generate an empty string and store (leak) h = GC.stat puts "#{i} t#{h[:total_allocated_object]} t#{h[:total_freed_object]}"}

Statistics information ObjectSpace::count_objects ObjectSpace::count_objects returns counts for each type Example: p ObjectSpace::count_objects #=> {:TOTAL=>30235, :FREE=>1226, :T_OBJECT=>60, :T_CLASS=>513, :T_MODULE=>24, :T_FLOAT=>7, :T_STRING=>9527, :T_REGEXP=>68, :T_ARRAY=>1718, :T_HASH=>8 9, :T_STRUCT=>1, :T_BIGNUM=>5, :T_FILE=>21, :T_DATA=>1013, :T_MATCH=>26, : T_COMPLEX=>1, :T_NODE=>15904, :T_ICLASS=>32} Sister methods ObjectSpace::count_objects_size in objspace lib

Tracing TracePoint DTrace Object allocation tracing Trace object relations

TracePoint Track Ruby s execution Insert tracing points by block Introduced from Ruby 2.0 Lightweight OO-style version of set_trace_func method # old style set_trace_func(lambda{ ev,file,line,id,klass,binding puts #{ev} #{file}:#{line} } # new style with TracePoint trace = TracePoint.trace{ tp puts #{tp.event}, #{tp.path}:#{tp.line} }

TracePoint Advantages Advantage of TracePoint compare with set_trace_func OO style Easy enable and disable Lightweight Creating binding object each time is too costly Event filtering

TracePoint Traceable events Same as set_trace_func line call/return, c_call/c_return class/end raise New events (only for TracePoint) thread_begin/thread_end b_call/b_end (block start, block end)

TracePoint Filtering TracePoint.new(events) only hook events set_trace_func track all events Example: TracePoint.new(:call, :return){ } Aliases a_call -> call, c_call, b_call a_return -> return, c_return, b_return

TracePoint Event information Same as set_trace_func event path, lineno defined_class, method_id binding New event info return_value (only for retun, c_return, b_return) raised_exception (only for raise)

TracePoint Internal events Added events RUBY_INTERNAL_EVENT_NEWOBJ When object is created RUBY_INTERNAL_EVENT_FREEOBJ When object is freed RUBY_INTERNAL_EVENT_GC_START When GC is started RUBY_INTERNAL_EVENT_GC_END_MARK When marking of GC is finished RUBY_INTERNAL_EVENT_GC_END_SWEEP When sweeping of GC is finished

TracePoint Internal events Timeline GC Start Ruby Mark Sweep GC End mark Sweep Sweep Sweep Sweep GC End sweep Stop the (Ruby) World

DTrace Solaris, MacOSX FreeBSD and Linux has DTrace tracing features Ruby interpreter support some events See https://bugs.rubylang.org/projects/ruby/wiki/dtraceprobes

Object allocation tracing ObjectSpace::trace_object_allocations Trace object allocation and record allocation-site Record filename, line number, creator method s id and class Implemented by TracePoint with internal events NEWOBJ/FREEOBJ Usage: ObjectSpace.trace_object_allocations{ # record only in the block o = Object.new file = ObjectSpace.allocation_sourcefile(o) #=> FILE line = ObjectSpace.allocation_sourceline(o) #=> LINE -2 } Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada <ko1@heroku.com> 75

Trace objects relations ObjectSpace.reachable_objects_from(obj) returns directly reachable objects Examples: (1) When obj is [ a, b, c ], returns [Array, a, b, c ] (2) When obj is [ a, a ], returns [Array, a, a ] (3) When obj is [a = a, a], returns [Array, a ] (1) array obj b Array c (2) array obj Array a (3) array obj Array a a a 76

Trace objects relations You can analyze memory leak.... Maybe. Combination with ObjectSpace.memsize_of() (introduced at 1.9) is also helpful to calculate how many memories consumed by obj. array obj Array 12 byte a a 1 byte DEMO Total 14 bytes (this is fake example) 1 byte 77

Trace objects from root ObjectSpace.reachable_objects_from_root -> hash Return all reachable objects from root. You can get all objects graph in the heap. ObjectSpace::dump_all() is implemented with this method.

Make tools!! Example: combination of GC.stat and TracePoint ObjectSpace::trace_object_allocation gc_tracer: GC behavior allocation_tracer: Allocation tracing You can make your own tools if you need!!

Inspect from outside https://www.flickr.com/photos/justin_case/2842104135

Inspection features on computer layers Ruby process Your app Libraries/Tools Ruby interpreter Operating System Inspect ruby process from outside From other process From OS Hardware

Inspect from outside System level tracing strace (system call tracer) Dtrace, systemtap, (with Ruby s dtrace support) System level profilers Valgrind (massif for memory usage) prof, proftools, System level debugger gdb

Advanced inspection https://www.flickr.com/photos/usnavy/5958545513

Inspection features on computer layers Your app Libraries/Tools Ruby interpreter They are only software!! Operating System Hardware

You can modify software Modify inspection tools Most of tools are placed on github Modify Ruby interpreter Make an C extension libraries with C-APIs Some tools are written as C-extensions Modify Ruby interpreter written in C Modify operating systems and system software layers

Hacking Ruby Ruby Under a Microscope By Pat Shaughnessy http://patshaughnessy.net/ruby-undera-microscope Ruby Hacking Guide By Minero Aoki, written in Japanese English translation: http://rubyhacking-guide.github.io/

Advanced computer layers Your app Libraries/Tools Ruby interpreter Operating System Hardware

Advanced computer layers Your app Libraries/Tools Ruby interpreter Guest Operating System Virtual Hardware They are also only software!! Virtual Machine Monitor (VMM) system Real Hardware

Important idea: Understanding Lower-layers Understanding computer layers and lower-layers helps your understanding of your application Which information we can inspect What happen on the computer Ruby hides computers details, but understanding details will help you This is why Computer science study is important Or try to ask lower-layer professionals Balance is matter between higher-layers and lowerlayers

Today s Message Become a Low-level engineer (somtimes)

Talk.inspect Summary of this talk Introduction of Ruby 2.1, 2.2 How to inspect your application behavior With tools & services Make a tools by inspection primitives Inspection from outside Knowing low-level helps you Happy hacking

Ruby.inspect Thank you for your attention Koichi Sasada <ko1@heroku.com>