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

Easy CPU Profiling

Easy CPU Profiling

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

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