UNPKG

@acromedia/sloth

Version:

Resource profiler for node, utilizing child processes

83 lines (82 loc) 2.92 kB
"use strict"; 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); } });