jlfwong / jlfwong/speedscope

node12 inspector data doesn't render idle time correctly

Open
#389 1 comment 1 reaction 0 assignees View on GitHub
Dominant language
TypeScript
Stars
6.8k
Forks
320
PR merge metrics
No merged PRs in 30d

Description

Thanks for speedscope; use it frequently! This issue seems to be fixed in Node16, but I wanted to record the issue in case others are running into it.

The application I work on has historically been using https://github.com/hyj1991/v8-profiler-next. I've tried using v8's inspector API instead, and I've found that the idle time of the application isn't being rendered. To illustrate:

Incorrect:
image

Correct:
image

To narrow this down a bit, I wrote the following to get some profiles. The intention is that this alternates a busy loop for 100ms with idleness for 100ms, and does so ten times.

```
const inspector = require('inspector')
const fs = require('fs')
const session = new inspector.Session()
session.connect()
session.post('Profiler.enable', () => {
session.post('Profiler.start', () => {
;(async () => {
for (let i = 0; i < 10; ++i) {
const s = Date.now()
while (Date.now() < s + 100) {}
await new Promise((resolve, reject) => setTimeout(resolve, 100))
}
})().then(() => {
session.post('Profiler.stop', (err, {profile}) => {
// Write profile to disk, upload, etc.
if (!err) {
fs.writeFileSync('profile.cpuprofile', JSON.stringify(profile))
}
})
})
})
})
```

The produces the following profile:

image

In Chrome DevTools or when using node18 (and 16) you get the more expected result.

image

The issue seems to be that node12 doesn't mark things as `(idle)` and the idle stack frame is `(root) <- (program)` which gets rendered as the previous stack, perhaps. (I'm trying to read `shouldPlaceOnTopOfPreviousStack()` and its callers in `chrome.ts`; I don't know why the diff from #71 decided to put `(program)` with the previous stack.)

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.