Skip to content

Instantly share code, notes, and snippets.

@krisselden
Created February 19, 2021 01:09
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save krisselden/f9e4d7316162f836ebc3514c2dbb7b47 to your computer and use it in GitHub Desktop.
Save krisselden/f9e4d7316162f836ebc3514c2dbb7b47 to your computer and use it in GitHub Desktop.
Profile node with child processes
/* eslint-env node */
const { Session } = require('inspector');
const fs = require('fs');
const captureExit = require('capture-exit');
captureExit.captureExit();
/** @param exitPromise {Promise<void>} */
async function runProfile(exitPromise) {
const session = new Session();
const waitingForDisconnect = new Promise(resolve => {
session.once('NodeRuntime.waitingForDisconnect', resolve);
});
session.connect();
await new Promise((resolve, reject) => {
session.post(
'NodeRuntime.notifyWhenWaitingForDisconnect',
{
enabled: true,
},
err => {
if (err) reject(err);
else resolve();
}
);
});
await new Promise((resolve, reject) => {
session.post('Profiler.enable', { enabled: true }, err => {
if (err) reject(err);
else resolve();
});
});
console.log(`STARTING PROFILE IN ${process.pid}`);
await new Promise((resolve, reject) => {
session.post('Profiler.start', err => {
if (err) reject(err);
else resolve();
});
});
console.log(`PROFILE STARTED ${process.pid}`);
await Promise.race([waitingForDisconnect, exitPromise]);
console.log(`WAITING FOR DISCONNECT ${process.pid}`);
const profile = await new Promise((resolve, reject) => {
session.post('Profiler.stop', (err, { profile }) => {
if (err) reject(err);
else resolve(profile);
});
});
console.log(`PROFILE STOPPED ${process.pid}`);
fs.writeFileSync(`${__dirname}/${process.pid}.cpuprofile`, JSON.stringify(profile));
session.disconnect();
}
const profilePromise = runProfile(
new Promise(resolve => {
captureExit.onExit(async () => {
resolve();
await profilePromise;
});
})
);
NODE_OPTIONS="-r $(pwd)/profile.js" ember build
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment