SlideShare a Scribd company logo
Node.js Postmortem
Working Group Update
Yunong Xiao, Netflix
Michael Dawson, IBM
Yunong Xiao
Platform Architect, Netflix
@yunongx
http://yunong.io
About Michael
About The Postmortem Workgroup
Howard Hellyer
@hhellyer
David Pacheco
@davepacheco
Julien Gilli
@mistredjules
Michael Dawson
@mhdawson
Chris Bailey
@seabaylea
Daniel Khan
@danielkhan
Joshua Clulow
@jclulow
Yunong Xiao
@yunong
James Bellenger
@jbellenger
Bradley Meck
@bmeck
Luca Maraschi
@lucamaraschi
David Clements
@davidmarkclements
Richard Chamberlain
@rnchamberlain
Mission Statement
The working group is dedicated to the support and improvement of
postmortem debugging for Node.js.
Debugging Node.js
Debugging Node.js
Test Environment
What about production?
Post mortem talk - Node Interactive EU
Post mortem talk - Node Interactive EU
“The method described in this article was designed to
provide a core dump… with a minimal impact on the
spacecraft… as the resumption of data acquisition from
the spacecraft is the highest priority.”
- Chafin, R. "Pioneer F & G Telemetry and Command Processor Core Dump
Program." JPL Technical Report XVI, no. 32-1526 (1971): 174.
Core Dumps: Brief History
● Magnetic core memory
● Dump out the contents
of “core” memory for
debugging
● “Core dump” was coined
● Initially printed on paper
● Postmortem debugging
was born
Production Constraints
● Uptime is critical
● Not easily reproducible
● Can’t simulate environment
● Resume normal operations ASAP
Postmortem Debugging
└─[0] <> node --abort_on_uncaught_exception throw.js
Uncaught Error
FROM
Object.<anonymous> (/Users/yunong/throw.js:1:63)
Module._compile (module.js:435:26)
Object.Module._extensions..js (module.js:442:10)
Module.load (module.js:356:32)
Function.Module._load (module.js:311:12)
Function.Module.runMain (module.js:467:10)
startup (node.js:134:18)
node.js:961:3
[1] 4131 illegal hardware instruction (core dumped) node
--abort_on_uncaught_exception throw.js
Where: Inspect stack trace
Why: Inspect heap and stack variable state
Generate Core Dump Ad-hoc
root@demo:~# gcore `pgrep node`
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7facaeffd700 (LWP 5650)]
[New Thread 0x7facaf7fe700 (LWP 5649)]
[New Thread 0x7facaffff700 (LWP 5648)]
[New Thread 0x7facbc967700 (LWP 5647)]
[New Thread 0x7facbd168700 (LWP 5617)]
[New Thread 0x7facbd969700 (LWP 5616)]
[New Thread 0x7facbe16a700 (LWP 5615)]
[New Thread 0x7facbe96b700 (LWP 5614)]
0x00007facbea5b5a9 in syscall () from /lib/x86_64-linux-gnu/libc.so.6
Saved corefile core.5602
Example
Netflix API Request
Node to API RPC
[2016-09-09T16:25:48.388Z] WARN: reactive
socket/rs-pool/17352 on lgud-yunong:
TcpLoadBalancer._connect: no more free
connections
Postmortem Debugging
Connection Pool State
> ::findjsobjects -p _connections | ::jsprint
{
"connected": {
},
"connecting": {},
"free": {
"100.82.188.185:7001": [...],
"100.82.37.181:7001": [...],
"100.82.41.121:7001": [...],
"100.82.102.157:7001": [...],
"100.82.106.115:7001": [...],
"100.82.129.239:7001": [...],
"100.82.102.158:7001": [...],
"100.82.74.237:7001": [...],
...
}
}
Postmortem Debugging is Critical to Large Scale
Production Node Deployments
Postmortem WG
github.com/nodejs/post-mortem/
Postmortem WG - Mission
Guide improvements in postmortem
● Interfaces/APIs
● Dump formats
● Tools and Techniques
State of key tools today
Heap dump - snapshot of heap
● heapdump module - https://github.com/bnoordhuis/node-heapdump
● Chrome developer tools
● Limitations
● Need to modify application
● Slow to generate (minutes or hours)
● O(N) memory usage
● Limited content
● Output is large
State of key tools today
Core dump - memory image
● Creation
○ Crash, signal
○ --abort-on-uncaught-exception
○ Fast (relative to heap dumps)
○ Size matches process memory
● OS debuggers
○ Examination at C/C++ or assembler level
○ No knowledge of Node/v8 structures
● Node core dump inspectors
○ MDB (limited platform support)
○ IDDE (IBM SDK specific)
○ LLNODE (newer, less complete)
Example commands
MDB_V8 command LLNODE command IDDE
Print a stack trace jsstack, jsframe v8 bt !stack, !frame
Find objects findjsobjects v8 findjsobjects,
v8 findjsinstances <type>
!jslistobjects
!jsgroupobjects
!jsfindbyproperty
!jsobjectsmatching
Print an object jsprint v8 inspect !jsobject
Print function source jssource v8 source (prints source for a stack
frame)
!jsobject, !string + work
Find constructor for an
object
jsconstructor n/a !jsconstructor
Print elements of a
FixedArray
v8array v8 inspect <instance> !array
Find native memory
backing a buffer
nodebuffer v8 inspect <instance> !nodebuffers
How to make this better?
● Improve ease of use
● Common APIs to introspect dumps
● Cross platform support
● Common command set
● Lightweight dump
The Postmortem WG is working on...
Common Heap Dump Format
Improved Core Dump Analysis
● Library in C & JS
● Tools: mdb_v8(mdb), llnode(lldb), ...
Node Report
Common Heap Dump Format
Enabler for new tools
Generation
● mdb
● llnode
Consumption
● Conversion to existing v8 format - > chrome dev tools
● C/Javascript APIs
Core Dump Analysis
Currently working on
● Platform coverage
● Re-use of command implementation
● Common APIs
Soon to be
nodejs/llnode !
https://github.com/nodejs/post-mortem/issues/37
Working to get to….
Node Report
Lightweight Dump
● Fast
● Small
● Human readable
● Key information to start investigating
● Triggers: exception, fatal error, signal, JavaScript API
NodeReport
example - heap out
of memory error
NodeReport content:
● Event summary
● Node.js and OS versions
● JavaScript stack trace
● Native stack trace
● Heap and GC statistics
● Resource usage
● libuv handle summary
● Environment variables
● OS ulimit settings
Javascript API
API in Javascript
● More accessible
● Leverages
○ llnode
○ Common Heap Dump (future)
JavaScript API - example application
Summary
What is postmortem debugging
Example of where it’s helpful
Activities of the working group
● Common heap format
● APIs (C/JS)
● Tools(lldb, mdb_v8, NodeReport)
Get Involved !
Great chance to learn
● Low level machine details
● Key debugging techniques
● Different platforms/operating systems
Where
● Most work done through GitHub issues/Pull Requests
● http://github.com/nodejs/post-mortem/
Postmortem Debugging is Critical to Large Scale
Production Node Deployments
Some production problems are otherwise impossible
Save complete process state for debugging later
Copyrights and Trademarks
IBM, the IBM logo, ibm.com are trademarks or registered
trademarks of International Business Machines Corp.,
registered in many jurisdictions worldwide. Other product and
service names might be trademarks of IBM or other companies.
A current list of IBM trademarks is available on the Web at
“Copyright and trademark information” at
www.ibm.com/legal/copytrade.shtml
Node.js is an official trademark of Joyent. IBM SDK for Node.js is not formally related to or endorsed by the official
Joyent Node.js open source or commercial project.
Java, JavaScript and all Java-based trademarks and logos are trademarks or registered trademarks of Oracle and/or
its affiliates.
Linux is a registered trademark of Linus Torvalds in the United States, other countries, or both.
Microsoft, Windows, Windows NT, and the Windows logo are trademarks of Microsoft Corporation in the United
States, other countries, or both.

More Related Content

PDF
Design choices of golang for high scalability
PDF
HKG15-300: Art's Quick Compiler: An unofficial overview
PDF
LAS16-307: Benchmarking Schedutil in Android
PPTX
Introduction to GraalVM
ODP
Embedded recipes 2018 - End-to-end software production for embedded - Guy Lun...
PDF
LAS16-305: Smart City Big Data Visualization on 96Boards
PDF
BKK16-302: Android Optimizing Compiler: New Member Assimilation Guide
PDF
How to write a well-behaved Python command line application
Design choices of golang for high scalability
HKG15-300: Art's Quick Compiler: An unofficial overview
LAS16-307: Benchmarking Schedutil in Android
Introduction to GraalVM
Embedded recipes 2018 - End-to-end software production for embedded - Guy Lun...
LAS16-305: Smart City Big Data Visualization on 96Boards
BKK16-302: Android Optimizing Compiler: New Member Assimilation Guide
How to write a well-behaved Python command line application

What's hot (20)

PDF
LAS16-301: OpenStack on Aarch64, running in production, upstream improvements...
PDF
Kernel Recipes 2018 - Live (Kernel) Patching: status quo and status futurus -...
PDF
[OSSummitEU2017]Ten Llayers of Linux Container Security
PDF
Native Java with GraalVM
PDF
gcma: guaranteed contiguous memory allocator
PDF
LCE13: Test and Validation Mini-Summit: Review Current Linaro Engineering Pro...
PDF
Fosdem'20_Past, present & future of DRLM project
PDF
A165 tools for java and javascript
PDF
Evaluating GPU programming Models for the LUMI Supercomputer
PDF
Building Android for the Cloud: Android as a Server (Mobile World Congress 2014)
PDF
Las16 309 - lua jit arm64 port - status
PDF
The GPGPU Continuum
PDF
Best practices for optimizing Red Hat platforms for large scale datacenter de...
PDF
Red Hat Summit 2018 5 New High Performance Features in OpenShift
PDF
Let's make it flow ... one way
PDF
Introduction to OpenVX
PDF
Newbie’s guide to_the_gpgpu_universe
PDF
The Self-Service Developer - GOTOCon CPH
PDF
Trace kernel code tips
PPTX
Java applications containerized and deployed
LAS16-301: OpenStack on Aarch64, running in production, upstream improvements...
Kernel Recipes 2018 - Live (Kernel) Patching: status quo and status futurus -...
[OSSummitEU2017]Ten Llayers of Linux Container Security
Native Java with GraalVM
gcma: guaranteed contiguous memory allocator
LCE13: Test and Validation Mini-Summit: Review Current Linaro Engineering Pro...
Fosdem'20_Past, present & future of DRLM project
A165 tools for java and javascript
Evaluating GPU programming Models for the LUMI Supercomputer
Building Android for the Cloud: Android as a Server (Mobile World Congress 2014)
Las16 309 - lua jit arm64 port - status
The GPGPU Continuum
Best practices for optimizing Red Hat platforms for large scale datacenter de...
Red Hat Summit 2018 5 New High Performance Features in OpenShift
Let's make it flow ... one way
Introduction to OpenVX
Newbie’s guide to_the_gpgpu_universe
The Self-Service Developer - GOTOCon CPH
Trace kernel code tips
Java applications containerized and deployed
Ad

Similar to Post mortem talk - Node Interactive EU (20)

PDF
Dynamic Languages in Production: Progress and Open Challenges
PDF
JS Fest 2019. Thomas Watson. Post-Mortem Debugging in Node.js
PDF
Surge2012
PDF
Node Interactive Debugging Node.js In Production
PDF
Debugging node in prod
PDF
Node.js post-mortem debugging with mdb and SmartOS
PPTX
Html5 devconf nodejs_devops_shubhra
PDF
A Taste of Monitoring and Post Mortem Debugging with Node
PDF
Node.js at Joyent: Engineering for Production
PDF
node.js in production: Reflections on three years of riding the unicorn
PDF
NodeJS: an Introduction
PDF
Here Be Dragons – Advanced JavaScript Debugging
PDF
FITC - Here Be Dragons: Advanced JavaScript Debugging
PDF
A295 nodejs-knowledge-accelerator
PDF
A164 enterprise javascript ibm node sdk
KEY
Dcjq node.js presentation
PDF
NodeJS for Beginner
PDF
Node in Real Time - The Beginning
PPTX
Node.js - Advanced Basics
PPTX
node.js.pptx
Dynamic Languages in Production: Progress and Open Challenges
JS Fest 2019. Thomas Watson. Post-Mortem Debugging in Node.js
Surge2012
Node Interactive Debugging Node.js In Production
Debugging node in prod
Node.js post-mortem debugging with mdb and SmartOS
Html5 devconf nodejs_devops_shubhra
A Taste of Monitoring and Post Mortem Debugging with Node
Node.js at Joyent: Engineering for Production
node.js in production: Reflections on three years of riding the unicorn
NodeJS: an Introduction
Here Be Dragons – Advanced JavaScript Debugging
FITC - Here Be Dragons: Advanced JavaScript Debugging
A295 nodejs-knowledge-accelerator
A164 enterprise javascript ibm node sdk
Dcjq node.js presentation
NodeJS for Beginner
Node in Real Time - The Beginning
Node.js - Advanced Basics
node.js.pptx
Ad

More from Michael Dawson (17)

PDF
Index 2018 talk to your code
PDF
Index 2018 node.js what's next
PPTX
N api - node interactive 2017
PDF
N api-node summit-2017-final
PDF
Accelerate your digital transformation
PDF
Ask us anything v9
PDF
Node.js Community Benchmarking WG update
PDF
Cascon intro
PDF
A294 fips support in node
PDF
A301 ctu madrid2016-monitoring
PDF
Update from-build-workgroup
PDF
Node fips
PDF
Micro app-framework - NodeLive Boston
PDF
Node liveboston welcome
PDF
Micro app-framework
PDF
Node home automation with Node.js and MQTT
PDF
Java one 2015 - v1
Index 2018 talk to your code
Index 2018 node.js what's next
N api - node interactive 2017
N api-node summit-2017-final
Accelerate your digital transformation
Ask us anything v9
Node.js Community Benchmarking WG update
Cascon intro
A294 fips support in node
A301 ctu madrid2016-monitoring
Update from-build-workgroup
Node fips
Micro app-framework - NodeLive Boston
Node liveboston welcome
Micro app-framework
Node home automation with Node.js and MQTT
Java one 2015 - v1

Recently uploaded (20)

PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Electronic commerce courselecture one. Pdf
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
DOCX
The AUB Centre for AI in Media Proposal.docx
PPTX
Spectroscopy.pptx food analysis technology
PDF
cuic standard and advanced reporting.pdf
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
Cloud computing and distributed systems.
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
20250228 LYD VKU AI Blended-Learning.pptx
Assigned Numbers - 2025 - Bluetooth® Document
Electronic commerce courselecture one. Pdf
MIND Revenue Release Quarter 2 2025 Press Release
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
The AUB Centre for AI in Media Proposal.docx
Spectroscopy.pptx food analysis technology
cuic standard and advanced reporting.pdf
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
The Rise and Fall of 3GPP – Time for a Sabbatical?
Per capita expenditure prediction using model stacking based on satellite ima...
Cloud computing and distributed systems.
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
NewMind AI Weekly Chronicles - August'25-Week II
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
gpt5_lecture_notes_comprehensive_20250812015547.pdf
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Unlocking AI with Model Context Protocol (MCP)
Build a system with the filesystem maintained by OSTree @ COSCUP 2025

Post mortem talk - Node Interactive EU

  • 1. Node.js Postmortem Working Group Update Yunong Xiao, Netflix Michael Dawson, IBM
  • 2. Yunong Xiao Platform Architect, Netflix @yunongx http://yunong.io
  • 4. About The Postmortem Workgroup Howard Hellyer @hhellyer David Pacheco @davepacheco Julien Gilli @mistredjules Michael Dawson @mhdawson Chris Bailey @seabaylea Daniel Khan @danielkhan Joshua Clulow @jclulow Yunong Xiao @yunong James Bellenger @jbellenger Bradley Meck @bmeck Luca Maraschi @lucamaraschi David Clements @davidmarkclements Richard Chamberlain @rnchamberlain
  • 5. Mission Statement The working group is dedicated to the support and improvement of postmortem debugging for Node.js.
  • 11. “The method described in this article was designed to provide a core dump… with a minimal impact on the spacecraft… as the resumption of data acquisition from the spacecraft is the highest priority.” - Chafin, R. "Pioneer F & G Telemetry and Command Processor Core Dump Program." JPL Technical Report XVI, no. 32-1526 (1971): 174.
  • 12. Core Dumps: Brief History ● Magnetic core memory ● Dump out the contents of “core” memory for debugging ● “Core dump” was coined ● Initially printed on paper ● Postmortem debugging was born
  • 13. Production Constraints ● Uptime is critical ● Not easily reproducible ● Can’t simulate environment ● Resume normal operations ASAP
  • 15. └─[0] <> node --abort_on_uncaught_exception throw.js Uncaught Error FROM Object.<anonymous> (/Users/yunong/throw.js:1:63) Module._compile (module.js:435:26) Object.Module._extensions..js (module.js:442:10) Module.load (module.js:356:32) Function.Module._load (module.js:311:12) Function.Module.runMain (module.js:467:10) startup (node.js:134:18) node.js:961:3 [1] 4131 illegal hardware instruction (core dumped) node --abort_on_uncaught_exception throw.js
  • 16. Where: Inspect stack trace Why: Inspect heap and stack variable state
  • 17. Generate Core Dump Ad-hoc root@demo:~# gcore `pgrep node` [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". [New Thread 0x7facaeffd700 (LWP 5650)] [New Thread 0x7facaf7fe700 (LWP 5649)] [New Thread 0x7facaffff700 (LWP 5648)] [New Thread 0x7facbc967700 (LWP 5647)] [New Thread 0x7facbd168700 (LWP 5617)] [New Thread 0x7facbd969700 (LWP 5616)] [New Thread 0x7facbe16a700 (LWP 5615)] [New Thread 0x7facbe96b700 (LWP 5614)] 0x00007facbea5b5a9 in syscall () from /lib/x86_64-linux-gnu/libc.so.6 Saved corefile core.5602
  • 20. Node to API RPC
  • 21. [2016-09-09T16:25:48.388Z] WARN: reactive socket/rs-pool/17352 on lgud-yunong: TcpLoadBalancer._connect: no more free connections
  • 23. Connection Pool State > ::findjsobjects -p _connections | ::jsprint { "connected": { }, "connecting": {}, "free": { "100.82.188.185:7001": [...], "100.82.37.181:7001": [...], "100.82.41.121:7001": [...], "100.82.102.157:7001": [...], "100.82.106.115:7001": [...], "100.82.129.239:7001": [...], "100.82.102.158:7001": [...], "100.82.74.237:7001": [...], ... } }
  • 24. Postmortem Debugging is Critical to Large Scale Production Node Deployments
  • 26. Postmortem WG - Mission Guide improvements in postmortem ● Interfaces/APIs ● Dump formats ● Tools and Techniques
  • 27. State of key tools today Heap dump - snapshot of heap ● heapdump module - https://github.com/bnoordhuis/node-heapdump ● Chrome developer tools ● Limitations ● Need to modify application ● Slow to generate (minutes or hours) ● O(N) memory usage ● Limited content ● Output is large
  • 28. State of key tools today Core dump - memory image ● Creation ○ Crash, signal ○ --abort-on-uncaught-exception ○ Fast (relative to heap dumps) ○ Size matches process memory ● OS debuggers ○ Examination at C/C++ or assembler level ○ No knowledge of Node/v8 structures ● Node core dump inspectors ○ MDB (limited platform support) ○ IDDE (IBM SDK specific) ○ LLNODE (newer, less complete)
  • 29. Example commands MDB_V8 command LLNODE command IDDE Print a stack trace jsstack, jsframe v8 bt !stack, !frame Find objects findjsobjects v8 findjsobjects, v8 findjsinstances <type> !jslistobjects !jsgroupobjects !jsfindbyproperty !jsobjectsmatching Print an object jsprint v8 inspect !jsobject Print function source jssource v8 source (prints source for a stack frame) !jsobject, !string + work Find constructor for an object jsconstructor n/a !jsconstructor Print elements of a FixedArray v8array v8 inspect <instance> !array Find native memory backing a buffer nodebuffer v8 inspect <instance> !nodebuffers
  • 30. How to make this better? ● Improve ease of use ● Common APIs to introspect dumps ● Cross platform support ● Common command set ● Lightweight dump
  • 31. The Postmortem WG is working on... Common Heap Dump Format Improved Core Dump Analysis ● Library in C & JS ● Tools: mdb_v8(mdb), llnode(lldb), ... Node Report
  • 32. Common Heap Dump Format Enabler for new tools Generation ● mdb ● llnode Consumption ● Conversion to existing v8 format - > chrome dev tools ● C/Javascript APIs
  • 33. Core Dump Analysis Currently working on ● Platform coverage ● Re-use of command implementation ● Common APIs Soon to be nodejs/llnode ! https://github.com/nodejs/post-mortem/issues/37
  • 34. Working to get to….
  • 35. Node Report Lightweight Dump ● Fast ● Small ● Human readable ● Key information to start investigating ● Triggers: exception, fatal error, signal, JavaScript API
  • 36. NodeReport example - heap out of memory error NodeReport content: ● Event summary ● Node.js and OS versions ● JavaScript stack trace ● Native stack trace ● Heap and GC statistics ● Resource usage ● libuv handle summary ● Environment variables ● OS ulimit settings
  • 37. Javascript API API in Javascript ● More accessible ● Leverages ○ llnode ○ Common Heap Dump (future)
  • 38. JavaScript API - example application
  • 39. Summary What is postmortem debugging Example of where it’s helpful Activities of the working group ● Common heap format ● APIs (C/JS) ● Tools(lldb, mdb_v8, NodeReport)
  • 40. Get Involved ! Great chance to learn ● Low level machine details ● Key debugging techniques ● Different platforms/operating systems Where ● Most work done through GitHub issues/Pull Requests ● http://github.com/nodejs/post-mortem/
  • 41. Postmortem Debugging is Critical to Large Scale Production Node Deployments
  • 42. Some production problems are otherwise impossible Save complete process state for debugging later
  • 43. Copyrights and Trademarks IBM, the IBM logo, ibm.com are trademarks or registered trademarks of International Business Machines Corp., registered in many jurisdictions worldwide. Other product and service names might be trademarks of IBM or other companies. A current list of IBM trademarks is available on the Web at “Copyright and trademark information” at www.ibm.com/legal/copytrade.shtml Node.js is an official trademark of Joyent. IBM SDK for Node.js is not formally related to or endorsed by the official Joyent Node.js open source or commercial project. Java, JavaScript and all Java-based trademarks and logos are trademarks or registered trademarks of Oracle and/or its affiliates. Linux is a registered trademark of Linus Torvalds in the United States, other countries, or both. Microsoft, Windows, Windows NT, and the Windows logo are trademarks of Microsoft Corporation in the United States, other countries, or both.