N T I A L We do a lot of Node! (crazy right?) • N|Solid • NCM • ~18 companies trust our support team for inquiries and problems around node. • …expect more
N T I A L Things you can do on Runtime performance issues: • --perf-basic-prof-only-functions. • A system tool like Perf Events in Linux. • Spare the traces that are really important in your situation.
N T I A L Memory scheme (v8): • Resident Set • Code Segment • Stack • Heap • Used heap R E S ID E N T SE T CO DE S E GM E NT STACK H E AP RSS H E APTOTA L H E AP US E D E XT E R N AL
N T I A L Relation between GC and a memory leak? • Impossible to remove non referenced data. • Portion of memory allocated not released when no longer needed.
N T I A L Process to investigate an issue: • Think and construct an hypothesis • Collect data • Analyze the data (duh) • Draw a conclusion • Repeat (profit?)
N T I A L Strategy for Memory Leaks detection: • Inspect objects for more context. • Look for weird objects on heap • Growing object counts are likely leaking • Walk reverse references to find the root object • Compare object counts !important
N T I A L What is happening? • On the first snapshot, there are already/almost 5MB allocated before any request is processed. • Memory keeps growing while the server is running • Exactly # Date objects and # Objects have been allocated between the two load sessions.
N T I A L • As you can see, the memory growth is far slower! • This said, the API takes more time to respond. Reading and writing to the disk comes with a cost, so do other API calls or database requests.
N T I A L Blocking the Event Loop • Totally possible • Happens more times we want them to happen • Iterations and complex calculations would prevent the process from handling other events
N T I A L Succeed doing I/O operations: • Choose asynchronous over synchronous • Opt for parallel I/O wherever possible • Don't hog the JavaScript thread with long-running calculations and iterations
N T I A L What we can learn from this: • A running Node.js application uses asynchronous I/O for performance. • Node.js runs JavaScript in a single thread. Each JavaScript function runs until completion. • I/O operations can be performed synchronously, but will occupy the main thread and prevent events from being processed