Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Easy CPU Profiling

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Easy CPU Profiling

My LNUG slides from the 26th Feburary 2014, Easy and hardcore CPU profiling in #nodejs

Avatar for Tom Gallacher

Tom Gallacher

February 27, 2014
Tweet

More Decks by Tom Gallacher

Other Decks in Programming

Transcript

  1. What to expect ! function init(cb) { for (var i

    = 1e8 - 1; i >= 0; i--) { var a = 16 + 87 a = a - 10 } cb() }
  2. var http = require(‘http') ! http.createServer(function (req, res) { !

    res.writeHead(200, {'Content-Type': ‘text/plain’}) ! res.end('Hello World\n') ! }).listen(1337, '127.0.0.1') ! console.log('Server running at http://127.0.0.1:1337/')
  3. $ dtrace -n 'profile-97/pid == 1337 && arg1/{ @[jstack(150, 8000)]

    = count(); } tick-60s { exit(0); }' > stacks.out $ stackvis dtrace flamegraph-svg < stacks.out > stacks.svg $ npm install -g stackvis Flame-graph using stack-vis
  4. StrongOps $ npm install -g strong-cli $ open http://strongloop.com/ops/dashboard $

    slc strongops --register $ slc example $ cd sls-sample-app
  5. NodeTime $ npm install --save nodetime $ node -e 'require('nodetime').profile(

    { accountKey: your_account_key })' $ open https://nodetime.com/apps
  6. Don’t fancy sending data to third parties? $ npm install

    -g webkit-devtools-agent $ npm install -g bugger $ npm install -g node-inspector -- Upcoming --
  7. CPU-Profiler Originally by Danny Coates - https://github.com/dannycoates Updated by StrongLoop

    - https://github.com/strongloop New features by me! - https://github.com/tomgco
  8. CPU-Profiler var profiler = require('cpu-profiler') profiler.startProfiling([name], true) var cpuProfile =

    profiler.stopProfiling([name]) // …suspected code bottleneck to profile
  9. CPU-Profiler { samplesCount: 0 , endTime: 1393368793528908 , startTime: 1393368789344919

    , topRoot: { scriptId: 0 , hitCount: 0 , childrenCount: 2 , id: 1 , callUid: 2833936552 , lineNumber: 0 , bailoutReason: '' , scriptName: '' , functionName: '(root)' , getChild: [Function: getChild] } , uid: 1 , title: 'a' , delete: [Function: delete] , getSample: [Function: getSample] }
  10. V8 Tools $ node --prof app.js $ git clone [email protected]:v8/v8.git

    $ ./tools/mac-tick-processor ~/v8.log > out.prof $ cat out.prof $ cd v8; git checkout 3.20.14.1 #or relevant v8 version
  11. Statistical profiling result from v8.log, (395 ticks, 1 unaccounted, 0

    excluded). ! [JavaScript]: ticks total nonlib name 181 45.8% 61.6% LazyCompile: *init /Users/tomg/Projects/nodejs/chrome-cpu-profiler/ 101 25.6% 34.4% LazyCompile: *initInner /Users/tomg/Projects/nodejs/chrome-cpu-prof 2 0.5% 0.7% RegExp: ^(\\/?|)([\\s\\S]*?)((?:\\.{1\,2}|[^\\/]+?|)(\\.[^.\\/]*|)) 2 0.5% 0.7% LazyCompile: *pre /Users/tomg/Projects/nodejs/chrome-cpu-profiler/e 1 0.3% 0.3% Stub: KeyedStoreElementStub 1 0.3% 0.3% Stub: FunctionPrototypeStub 1 0.3% 0.3% Stub: BinaryOpStub_ADD_ReuseLeft(String*String->String) 1 0.3% 0.3% LazyCompile: ~substr native string.js:748:22 1 0.3% 0.3% LazyCompile: ~Buffer.isEncoding buffer.js:126:29 1 0.3% 0.3% KeyedCallMegamorphic: args_count: 2 1 0.3% 0.3% Builtin: ArgumentsAdaptorTrampoline
  12. ! [GC]: ticks total nonlib name 3 0.8% ! [Bottom

    up (heavy) profile]: Note: percentage shows a share of a particular caller in the total amount of its parent calls. Callers occupying less than 2.0% are not shown. ! ticks parent name 181 45.8% LazyCompile: *init /Users/tomg/Projects/nodejs/chrome-cpu-profiler/example/cp 91 50.3% LazyCompile: ~preInner /Users/tomg/Projects/nodejs/chrome-cpu-profiler/exam 91 100.0% LazyCompile: *pre /Users/tomg/Projects/nodejs/chrome-cpu-profiler/example 91 100.0% LazyCompile: ~bootstrap /Users/tomg/Projects/nodejs/chrome-cpu-profiler 91 100.0% Function: ~<anonymous> /Users/tomg/Projects/nodejs/chrome-cpu-profile 91 100.0% LazyCompile: ~Module._compile module.js:367:37 90 49.7% LazyCompile: ~preInner /Users/tomg/Projects/nodejs/chrome-cpu-profiler/exam 90 100.0% LazyCompile: *pre /Users/tomg/Projects/nodejs/chrome-cpu-profiler/example 90 100.0% LazyCompile: ~initInner /Users/tomg/Projects/nodejs/chrome-cpu-profiler 90 100.0% LazyCompile: *init /Users/tomg/Projects/nodejs/chrome-cpu-profiler/ex 90 100.0% LazyCompile: ~preInner /Users/tomg/Projects/nodejs/chrome-cpu-profi ! 101 25.6% LazyCompile: *initInner /Users/tomg/Projects/nodejs/chrome-cpu-profiler/examp 101 100.0% LazyCompile: *init /Users/tomg/Projects/nodejs/chrome-cpu-profiler/example/ 101 100.0% LazyCompile: ~preInner /Users/tomg/Projects/nodejs/chrome-cpu-profiler/ex 101 100.0% LazyCompile: *pre /Users/tomg/Projects/nodejs/chrome-cpu-profiler/examp 101 100.0% LazyCompile: ~initInner /Users/tomg/Projects/nodejs/chrome-cpu-profil 101 100.0% LazyCompile: *init /Users/tomg/Projects/nodejs/chrome-cpu-profiler/
  13. :O

  14. Dtrace $ npm install --save dtrace-provider var d = require('dtrace-provider')

    ! var dtp = d.createDTraceProvider('nodeapp') var p1 = dtp.addProbe('probe1', 'int', 'int') var p2 = dtp.addProbe('probe2', 'char *') dtp.enable()
  15. Q&A

  16. YAY