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
2024/11/8 関西Kaggler会 2024 #3 / Kaggle Kernel で Gemma 2 × vLLM を動かす。
kohecchi
5
920
Amazon Bedrock Agentsを用いてアプリ開発してみた!
har1101
0
340
Realtime API 入門
riofujimon
0
150
Generative AI Use Cases JP (略称:GenU)奮闘記
hideg
1
290
色々なIaCツールを実際に触って比較してみる
iriikeita
0
330
TypeScript Graph でコードレビューの心理的障壁を乗り越える
ysk8hori
2
1.1k
Arm移行タイムアタック
qnighy
0
320
[Do iOS '24] Ship your app on a Friday...and enjoy your weekend!
polpielladev
0
100
광고 소재 심사 과정에 AI를 도입하여 광고 서비스 생산성 향상시키기
kakao
PRO
0
170
macOS でできる リアルタイム動画像処理
biacco42
9
2.4k
.NET のための通信フレームワーク MagicOnion 入門 / Introduction to MagicOnion
mayuki
1
1.6k
OSSで起業してもうすぐ10年 / Open Source Conference 2024 Shimane
furukawayasuto
0
100
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
5 minutes of I Can Smell Your CMS
philhawksworth
202
19k
Done Done
chrislema
181
16k
The Pragmatic Product Professional
lauravandoore
31
6.3k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
KATA
mclloyd
29
14k
How to Ace a Technical Interview
jacobian
276
23k
Navigating Team Friction
lara
183
14k
A better future with KSS
kneath
238
17k
BBQ
matthewcrist
85
9.3k
For a Future-Friendly Web
brad_frost
175
9.4k
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!