@acromedia/sloth
Version:
Resource profiler for node, utilizing child processes
83 lines (82 loc) • 2.92 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = __importDefault(require("fs"));
const pidusage_1 = __importDefault(require("pidusage"));
const pid = process.argv[2];
const timestep = Number(process.argv[3]) || 100;
const wait = Number(process.argv[4]) || 0;
const writeToFile = process.argv[5] === 'true';
const trim = process.argv[6] === 'true';
// Base memory object.
const memObj = {
start: Date.now(),
end: 0,
time_elapsed: 0,
timestep_ms: Number(timestep),
mem_list: [],
start_usage_bytes: 0,
peak_usage_bytes: 0,
end_usage_bytes: 0,
base_process_bytes: 0,
};
function emergencyStop() {
if (process.send)
process.send(memObj);
// Make sure we don't leave the process hanging, in case we got disconnected
process.exit();
}
// Check cycle
// eslint-disable-next-line @typescript-eslint/no-misused-promises
setInterval(async () => {
// @ts-expect-error Status typing issue
const data = await (0, pidusage_1.default)(pid).catch((e) => {
console.error(e);
emergencyStop();
});
// First check?
if (memObj.mem_list.length === 0) {
memObj.base_process_bytes = data.memory;
memObj.start_usage_bytes = trim ? 0 : data.memory;
}
if (trim)
data.memory -= memObj.base_process_bytes;
// Push current memory usage
memObj.mem_list.push(data.memory);
// Is this our highest amount of memory usage?
if (memObj.peak_usage_bytes < data.memory) {
memObj.peak_usage_bytes = data.memory;
}
}, memObj.timestep_ms);
process.on('message', (message) => {
if (message === 'stop') {
setTimeout(() => {
var _a;
memObj.end = Date.now();
memObj.time_elapsed = memObj.end - memObj.start;
// Use callbacks since exit handler doesn't like async.
(_a = (0, pidusage_1.default)(pid, (err, data) => {
if (err) {
console.error(err);
emergencyStop();
return;
}
// Set end usage bytes
memObj.end_usage_bytes = trim ? data.memory - memObj.base_process_bytes : data.memory;
// TODO: Send back data OR write to file.
if (writeToFile) {
fs_1.default.writeFile('./memstats.json', JSON.stringify(memObj), 'utf8', () => {
if (process.send)
process.send(memObj);
});
}
if (process.send)
process.send(memObj);
})) === null || _a === void 0 ? void 0 : _a.catch((e) => {
console.error(e);
});
}, wait);
}
});