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
公共交通オープンデータ × モバイルUX 複雑な運行情報を 『直感』に変換する技術
tinykitten
PRO
0
180
DevFest Android in Korea 2025 - 개발자 커뮤니티를 통해 얻는 가치
wisemuji
0
180
これならできる!個人開発のすゝめ
tinykitten
PRO
0
140
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
340
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
7
2.4k
Kotlin Multiplatform Meetup - Compose Multiplatform 외부 의존성 아키텍처 설계부터 운영까지
wisemuji
0
150
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
450
CSC307 Lecture 03
javiergs
PRO
1
460
re:Invent 2025 トレンドからみる製品開発への AI Agent 活用
yoskoh
0
570
生成AIを利用するだけでなく、投資できる組織へ
pospome
2
430
実はマルチモーダルだった。ブラウザの組み込みAI🧠でWebの未来を感じてみよう #jsfes #gemini
n0bisuke2
3
1.4k
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
270
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
280
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Documentation Writing (for coders)
carmenintech
77
5.2k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
42
Building AI with AI
inesmontani
PRO
1
600
How GitHub (no longer) Works
holman
316
140k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
2
270
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
0
84
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!