Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Easy CPU Profiling
Search
Tom Gallacher
February 27, 2014
Programming
3
16k
Easy CPU Profiling
My LNUG slides from the 26th Feburary 2014, Easy and hardcore CPU profiling in #nodejs
Tom Gallacher
February 27, 2014
Tweet
Share
More Decks by Tom Gallacher
See All by Tom Gallacher
Dis.io
tomgco
3
270
Other Decks in Programming
See All in Programming
OUPC2024 Day 1 解説
kowerkoint
0
390
Gunma.web #55
tinykitten
0
130
CTFのWebにおける⾼難易度問題について
hamayanhamayan
1
930
Scala 3 で GLSL のための c-like-for を実装してみた
exoego
1
170
Functional APIから再考するLangGraphを使う理由
os1ma
5
640
RCPと宣言型ポリシーについてのお話し
kokitamura
2
140
MCP世界への招待: AIエンジニアが創る次世代エージェント連携の世界
gunta
2
480
本当だってば!俺もTRICK 2022に入賞してたんだってば!
jinroq
0
200
研究開発と実装OSSと プロダクトの好循環 / A virtuous cycle of research and development implementation OSS and products
linyows
1
180
Django for Data Science (Boston Python Meetup, March 2025)
wsvincent
0
210
RubyKaigiで手に入れた HHKB Studioのための HIDRawドライバ
iberianpig
0
190
Devin入門と最近のアップデートから見るDevinの進化 / Introduction to Devin and the Evolution of Devin as Seen in Recent Update
rkaga
7
3.4k
Featured
See All Featured
Unsuck your backbone
ammeep
669
57k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Facilitating Awesome Meetings
lara
53
6.3k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
490
Thoughts on Productivity
jonyablonski
69
4.5k
Building Adaptive Systems
keathley
40
2.5k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7.1k
Six Lessons from altMBA
skipperchong
27
3.7k
The Cost Of JavaScript in 2023
addyosmani
48
7.6k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
Code Review Best Practice
trishagee
67
18k
Transcript
Hello!
Tom Gallacher ! Aka: @tomgco
Tom Gallacher ! Aka: @tomgco Me!
image by @substack Easy CPU profiling in node
What to expect
What to expect
What to expect ! function init(cb) { for (var i
= 1e8 - 1; i >= 0; i--) { var a = 16 + 87 a = a - 10 } cb() }
What to expect
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/')
None
What?
$ 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
None
Illumos-based system required Requires sudo (utilises dtrace) Understanding of libuv
required Downfalls: Well not really, it can help
What about SaaS’s?
StrongOps $ npm install -g strong-cli $ open http://strongloop.com/ops/dashboard $
slc strongops --register $ slc example $ cd sls-sample-app
None
NodeTime $ npm install --save nodetime $ node -e 'require('nodetime').profile(
{ accountKey: your_account_key })' $ open https://nodetime.com/apps
None
Don’t fancy sending data to third parties? $ npm install
-g webkit-devtools-agent $ npm install -g bugger $ npm install -g node-inspector -- Upcoming --
None
PAIN!
v0.11
$ npm install --save-dev cpu-profiler $ npm install --save-dev chrome-cpu-profiler
Roll your own (thats what I did)
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
CPU-Profiler var profiler = require('cpu-profiler') profiler.startProfiling([name], true) var cpuProfile =
profiler.stopProfiling([name]) // …suspected code bottleneck to profile
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] }
Chrome-CPU-Profiler var profiler = require('chrome-cpu-profiler') profiler.startProfiling('cpu-block') var data = profiler.stopProfiling('cpu-block')
// …suspected code bottleneck to profile profiler.writeFile(data)
None
None
None
None
None
USES
image by @substack Easy CPU profiling in node
V8 Tools $ node --prof app.js $ git clone git@github.com: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
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
! [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/
" " (compiled) "~" (optimisable) "*" (optimised)
:O
Production
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()
Metrics - StatsD - Graphite - Lynx https://github.com/dscape/lynx $ npm
install --save lynx
None
None
Tom Gallacher ! Aka: @tomgco
Q&A
YAY
BYE!