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
280
Other Decks in Programming
See All in Programming
プロダクトという一杯を作る - プロダクトチームが味の責任を持つまでの煮込み奮闘記
hiliteeternal
0
450
令和最新版手のひらコンピュータ
koba789
13
7.3k
なぜ今、Terraformの本を書いたのか? - 著者陣に聞く!『Terraformではじめる実践IaC』登壇資料
fufuhu
4
560
React は次の10年を生き残れるか:3つのトレンドから考える
oukayuka
41
16k
実践 Dev Containers × Claude Code
touyu
1
170
抽象化という思考のツール - 理解と活用 - / Abstraction-as-a-Tool-for-Thinking
shin1x1
1
960
Strands Agents で実現する名刺解析アーキテクチャ
omiya0555
1
120
Infer入門
riru
4
1.4k
技術的負債で信頼性が限界だったWordPress運用をShifterで完全復活させた話
rvirus0817
1
1.4k
Flutterと Vibe Coding で個人開発!
hyshu
1
250
Constant integer division faster than compiler-generated code
herumi
2
580
AHC051解法紹介
eijirou
0
390
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
Done Done
chrislema
185
16k
KATA
mclloyd
32
14k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
Documentation Writing (for coders)
carmenintech
73
5k
Raft: Consensus for Rubyists
vanstee
140
7.1k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Designing Experiences People Love
moore
142
24k
Fireside Chat
paigeccino
38
3.6k
Code Reviewing Like a Champion
maltzj
524
40k
Become a Pro
speakerdeck
PRO
29
5.5k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
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
[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
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!