@overkill-dev/run 0.0.77 → 0.0.79
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assertion-protocol/assertion-node-shape.d.ts +2 -1
- package/assertion-protocol/assertion-node-shape.d.ts.map +1 -1
- package/bench/benchmark-host-assessment.js +38 -0
- package/bench/benchmark-host-assessment.js.map +1 -0
- package/bench/benchmark-host-snapshot.d.ts +157 -0
- package/bench/benchmark-host-snapshot.d.ts.map +1 -0
- package/bench/benchmark-host-snapshot.js +83 -0
- package/bench/benchmark-host-snapshot.js.map +1 -0
- package/bench/benchmark-run-report.js +30 -1
- package/bench/benchmark-run-report.js.map +1 -1
- package/config/benchmark-host.d.ts +26 -0
- package/config/benchmark-host.d.ts.map +1 -0
- package/config/benchmark-host.js +30 -0
- package/config/benchmark-host.js.map +1 -0
- package/config/config.d.ts.map +1 -1
- package/config/config.js +3 -1
- package/config/config.js.map +1 -1
- package/config/schema.d.ts +32 -0
- package/config/schema.d.ts.map +1 -1
- package/config/schema.js +3 -0
- package/config/schema.js.map +1 -1
- package/config/snapshot.js +2 -0
- package/config/snapshot.js.map +1 -1
- package/config/types.d.ts +4 -0
- package/config/types.d.ts.map +1 -1
- package/config/validation.js +7 -0
- package/config/validation.js.map +1 -1
- package/engine/benchmark-garbage-collection.d.ts +13 -0
- package/engine/benchmark-garbage-collection.d.ts.map +1 -0
- package/engine/benchmark-garbage-collection.js +4 -0
- package/engine/benchmark-garbage-collection.js.map +1 -0
- package/engine/benchmark-node.d.ts +3 -0
- package/engine/benchmark-node.d.ts.map +1 -1
- package/engine/benchmark-result.d.ts +63 -0
- package/engine/benchmark-result.d.ts.map +1 -1
- package/engine/benchmark-result.js +2 -0
- package/engine/benchmark-result.js.map +1 -0
- package/engine/case-body-execution.js +43 -1
- package/engine/case-body-execution.js.map +1 -1
- package/engine/case-execution.d.ts.map +1 -1
- package/engine/case-execution.js +8 -37
- package/engine/case-execution.js.map +1 -1
- package/engine/execution-options.d.ts.map +1 -1
- package/engine/execution-options.js +2 -2
- package/engine/execution-options.js.map +1 -1
- package/engine/execution-supervision-state.js +6 -0
- package/engine/execution-supervision-state.js.map +1 -1
- package/engine/execution-supervision.d.ts +2 -0
- package/engine/execution-supervision.d.ts.map +1 -1
- package/engine/execution-supervision.js +2 -7
- package/engine/execution-supervision.js.map +1 -1
- package/engine/execution.d.ts.map +1 -1
- package/engine/execution.js +2 -1
- package/engine/execution.js.map +1 -1
- package/package.json +6 -1
- package/packages/run/config.entry-point.d.ts +1 -0
- package/packages/run/config.entry-point.d.ts.map +1 -1
- package/packages/run/run.entry-point.d.ts +4 -1
- package/packages/run/run.entry-point.d.ts.map +1 -1
- package/readme.md +16 -4
- package/run/benchmark-baseline-run.js +33 -4
- package/run/benchmark-baseline-run.js.map +1 -1
- package/run/benchmark-definition-schema.js +2 -1
- package/run/benchmark-definition-schema.js.map +1 -1
- package/run/benchmark-execution-environment.js +21 -0
- package/run/benchmark-execution-environment.js.map +1 -0
- package/run/benchmark-garbage-collection.js +29 -0
- package/run/benchmark-garbage-collection.js.map +1 -0
- package/run/benchmark-host-capacity.js +121 -0
- package/run/benchmark-host-capacity.js.map +1 -0
- package/run/benchmark-host-darwin.js +77 -0
- package/run/benchmark-host-darwin.js.map +1 -0
- package/run/benchmark-host-observer.js +116 -0
- package/run/benchmark-host-observer.js.map +1 -0
- package/run/benchmark-host-platform.js +84 -0
- package/run/benchmark-host-platform.js.map +1 -0
- package/run/benchmark-host-process.js +94 -0
- package/run/benchmark-host-process.js.map +1 -0
- package/run/benchmark-host-reading.js +42 -0
- package/run/benchmark-host-reading.js.map +1 -0
- package/run/benchmark-host.js +48 -0
- package/run/benchmark-host.js.map +1 -0
- package/run/benchmark-placement.js +101 -0
- package/run/benchmark-placement.js.map +1 -0
- package/run/benchmark-report-metadata.js +9 -5
- package/run/benchmark-report-metadata.js.map +1 -1
- package/run/benchmark-result-schema.js +87 -18
- package/run/benchmark-result-schema.js.map +1 -1
- package/run/collected-placement.js +85 -0
- package/run/collected-placement.js.map +1 -0
- package/run/collected-run-execution.js +1 -1
- package/run/collected-run-execution.js.map +1 -1
- package/run/default-run-engine.js +1 -0
- package/run/default-run-engine.js.map +1 -1
- package/run/execution-session-supervised.js +13 -2
- package/run/execution-session-supervised.js.map +1 -1
- package/run/node-run-execution.js +1 -0
- package/run/node-run-execution.js.map +1 -1
- package/run/node-run-orchestrator-dependencies.js +4 -0
- package/run/node-run-orchestrator-dependencies.js.map +1 -1
- package/run/recorded-coverage-session.js +4 -1
- package/run/recorded-coverage-session.js.map +1 -1
- package/run/run-cancellation.js +1 -1
- package/run/run-cancellation.js.map +1 -1
- package/run/run-collected-planning.js +19 -61
- package/run/run-collected-planning.js.map +1 -1
- package/run/run-collected-resolution.js +4 -1
- package/run/run-collected-resolution.js.map +1 -1
- package/run/run-collection-error-result.js +3 -3
- package/run/run-collection-error-result.js.map +1 -1
- package/run/run-command-schema.js +1 -0
- package/run/run-command-schema.js.map +1 -1
- package/run/run-facts.js +24 -8
- package/run/run-facts.js.map +1 -1
- package/run/run-host-observations.d.ts +21 -0
- package/run/run-host-observations.d.ts.map +1 -0
- package/run/run-host-process.js +1 -1
- package/run/run-host-process.js.map +1 -1
- package/run/run-input-resolution.js +1 -0
- package/run/run-input-resolution.js.map +1 -1
- package/run/run-isolated-command.js +2 -0
- package/run/run-isolated-command.js.map +1 -1
- package/run/run-isolated-process.js +5 -1
- package/run/run-isolated-process.js.map +1 -1
- package/run/run-local-command.js +1 -1
- package/run/run-local-command.js.map +1 -1
- package/run/run-local-coverage.js +4 -1
- package/run/run-local-coverage.js.map +1 -1
- package/run/run-local-planning.js +6 -0
- package/run/run-local-planning.js.map +1 -1
- package/run/run-orchestrator-dependencies.d.ts +2 -13
- package/run/run-orchestrator-dependencies.d.ts.map +1 -1
- package/run/run-orchestrator-dependencies.js.map +1 -1
- package/run/run-supervised-process.js +5 -1
- package/run/run-supervised-process.js.map +1 -1
- package/run/run-support.js +2 -2
- package/run/run-support.js.map +1 -1
- package/run/run-types.d.ts +6 -3
- package/run/run-types.d.ts.map +1 -1
- package/run/run-types.js.map +1 -1
- package/run/supervised-child-execution.js +7 -1
- package/run/supervised-child-execution.js.map +1 -1
- package/run/supervised-child-process.js +1 -1
- package/run/supervised-child-process.js.map +1 -1
- package/run/supervised-child.js +1 -1
- package/run/supervised-child.js.map +1 -1
- package/run/supervised-protocol.js.map +1 -1
- package/run/worker-execution-engine.js +21 -0
- package/run/worker-execution-engine.js.map +1 -0
- package/run/worker-pool-command.js +1 -0
- package/run/worker-pool-command.js.map +1 -1
- package/run/worker-pool-lanes.js +1 -1
- package/run/worker-pool-lanes.js.map +1 -1
- package/run/worker-pool-placement-planning.js +3 -2
- package/run/worker-pool-placement-planning.js.map +1 -1
- package/run/worker-pool-protocol.js.map +1 -1
- package/run/worker-pool-worker.js +3 -15
- package/run/worker-pool-worker.js.map +1 -1
- package/software-bill-of-materials.cyclonedx.json +4 -4
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import { percentScale } from "../config/benchmark-host.js";
|
|
3
|
+
import { hostNumber, hostPercentage, observeHost, unavailableHostReading } from "./benchmark-host-reading.js";
|
|
4
|
+
export function readBenchmarkHostCapacity() {
|
|
5
|
+
return {
|
|
6
|
+
availableParallelism: hostNumber('os.availableParallelism()', 'process', 'count', os.availableParallelism),
|
|
7
|
+
logicalCpuCount: hostNumber('os.cpus()', 'host', 'count', function cpuCount() {
|
|
8
|
+
const count = os.cpus().length;
|
|
9
|
+
if (count === 0) {
|
|
10
|
+
throw new TypeError('Logical CPU count is unavailable.');
|
|
11
|
+
}
|
|
12
|
+
return count;
|
|
13
|
+
}),
|
|
14
|
+
cpuModels: observeHost('os.cpus()', 'host', 'model', function cpuModels() {
|
|
15
|
+
return Array
|
|
16
|
+
.from(new Set(os
|
|
17
|
+
.cpus()
|
|
18
|
+
.map(function model(cpu) {
|
|
19
|
+
return cpu.model;
|
|
20
|
+
})))
|
|
21
|
+
.toSorted(function alphabetical(left, right) {
|
|
22
|
+
return left.localeCompare(right);
|
|
23
|
+
});
|
|
24
|
+
}),
|
|
25
|
+
totalMemoryBytes: hostNumber('os.totalmem()', 'host', 'bytes', function totalMemory() {
|
|
26
|
+
const bytes = os.totalmem();
|
|
27
|
+
if (bytes === 0) {
|
|
28
|
+
throw new TypeError('Physical memory capacity is unavailable.');
|
|
29
|
+
}
|
|
30
|
+
return bytes;
|
|
31
|
+
}),
|
|
32
|
+
freeMemoryBytes: hostNumber('os.freemem()', 'host', 'bytes', os.freemem),
|
|
33
|
+
availableMemoryBytes: hostNumber('process.availableMemory()', 'process', 'bytes', process.availableMemory),
|
|
34
|
+
constrainedMemoryBytes: hostNumber('process.constrainedMemory()', 'process', 'bytes', function constraint() {
|
|
35
|
+
const value = process.constrainedMemory();
|
|
36
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
37
|
+
throw new TypeError('Memory constraint is unknown or not imposed.');
|
|
38
|
+
}
|
|
39
|
+
return value;
|
|
40
|
+
}),
|
|
41
|
+
loadAverage: observeHost('os.loadavg()', 'host', 'load', function loadAverage() {
|
|
42
|
+
const [one, five, fifteen] = os.loadavg();
|
|
43
|
+
if (process.platform === 'win32') {
|
|
44
|
+
throw new TypeError('Load average is unsupported on Windows.');
|
|
45
|
+
}
|
|
46
|
+
if (one === undefined || five === undefined || fifteen === undefined ||
|
|
47
|
+
[one, five, fifteen].some(function validLoad(value) {
|
|
48
|
+
return !(Number.isFinite(value) && value >= 0);
|
|
49
|
+
})) {
|
|
50
|
+
throw new TypeError('Load averages are unavailable.');
|
|
51
|
+
}
|
|
52
|
+
return [one, five, fifteen];
|
|
53
|
+
})
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function effectiveMemoryCapacity(capacity) {
|
|
57
|
+
const { totalMemoryBytes, constrainedMemoryBytes } = capacity;
|
|
58
|
+
if (totalMemoryBytes.availability === 'unavailable' || constrainedMemoryBytes.availability === 'unavailable') {
|
|
59
|
+
return totalMemoryBytes;
|
|
60
|
+
}
|
|
61
|
+
return { ...totalMemoryBytes, value: Math.min(totalMemoryBytes.value, constrainedMemoryBytes.value) };
|
|
62
|
+
}
|
|
63
|
+
export function availableMemoryPercent(capacity) {
|
|
64
|
+
const { availableMemoryBytes } = capacity;
|
|
65
|
+
const denominator = effectiveMemoryCapacity(capacity);
|
|
66
|
+
const reading = hostPercentage('process.availableMemory()/effectiveMemoryCapacity', 'process', availableMemoryBytes, denominator);
|
|
67
|
+
return reading.availability === 'available' && reading.value > percentScale
|
|
68
|
+
? unavailableHostReading(reading.source, reading.scope, reading.unit, 'Available memory exceeds known capacity.')
|
|
69
|
+
: reading;
|
|
70
|
+
}
|
|
71
|
+
export function hostLoadPerCpuPercent(capacity) {
|
|
72
|
+
const { loadAverage } = capacity;
|
|
73
|
+
const load = loadAverage.availability === 'available'
|
|
74
|
+
? { ...loadAverage, value: loadAverage.value[0] }
|
|
75
|
+
: loadAverage;
|
|
76
|
+
return hostPercentage('os.loadavg()[0]/os.cpus().length', 'host', load, capacity.logicalCpuCount);
|
|
77
|
+
}
|
|
78
|
+
function cpuTimeDelta(previous, cpu) {
|
|
79
|
+
if (previous?.model !== cpu.model) {
|
|
80
|
+
throw new TypeError('CPU set changed during observation.');
|
|
81
|
+
}
|
|
82
|
+
const counters = ['user', 'nice', 'sys', 'idle', 'irq'];
|
|
83
|
+
const deltas = counters.map(function counter(key) {
|
|
84
|
+
return cpu.times[key] - previous.times[key];
|
|
85
|
+
});
|
|
86
|
+
if (deltas.some(function reset(delta) {
|
|
87
|
+
return !Number.isFinite(delta) || delta < 0;
|
|
88
|
+
})) {
|
|
89
|
+
throw new TypeError('CPU counter reset during observation.');
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
total: deltas.reduce(function sum(total, delta) {
|
|
93
|
+
return total + delta;
|
|
94
|
+
}, 0),
|
|
95
|
+
idle: cpu.times.idle - previous.times.idle
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export function cpuBusyPercent(before, after) {
|
|
99
|
+
return hostNumber('os.cpus() CPU-time deltas', 'host', 'percent', function cpuTimeRatio() {
|
|
100
|
+
if (before.length === 0 || before.length !== after.length) {
|
|
101
|
+
throw new TypeError('CPU set changed or is unavailable.');
|
|
102
|
+
}
|
|
103
|
+
const deltas = after.map(function cpuDelta(cpu, index) {
|
|
104
|
+
return cpuTimeDelta(before[index], cpu);
|
|
105
|
+
});
|
|
106
|
+
const total = deltas.reduce(function sum(value, delta) {
|
|
107
|
+
return value + delta.total;
|
|
108
|
+
}, 0);
|
|
109
|
+
const idle = deltas.reduce(function sum(value, delta) {
|
|
110
|
+
return value + delta.idle;
|
|
111
|
+
}, 0);
|
|
112
|
+
if (total <= 0) {
|
|
113
|
+
throw new TypeError('No CPU-time observations were collected.');
|
|
114
|
+
}
|
|
115
|
+
return (total - idle) / total * percentScale;
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
export function readHostCpuTimes() {
|
|
119
|
+
return observeHost('os.cpus()', 'host', 'cpu-times', os.cpus);
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=benchmark-host-capacity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark-host-capacity.js","sourceRoot":"","sources":["../../../../source/run/benchmark-host-capacity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { z } from 'zod/v4';
|
|
3
|
+
import { percentScale } from "../config/benchmark-host.js";
|
|
4
|
+
import { hostNumber, unavailableHostReading } from "./benchmark-host-reading.js";
|
|
5
|
+
const maximumProbeBytes = 65_536;
|
|
6
|
+
const probeTimeoutMilliseconds = 250;
|
|
7
|
+
const normalPressureCode = 1;
|
|
8
|
+
const warningPressureCode = 2;
|
|
9
|
+
const criticalPressureCode = 4;
|
|
10
|
+
const memoryPressureCodeSchema = z.union([
|
|
11
|
+
z.literal(normalPressureCode),
|
|
12
|
+
z.literal(warningPressureCode),
|
|
13
|
+
z.literal(criticalPressureCode)
|
|
14
|
+
]);
|
|
15
|
+
const thermalSource = '/usr/bin/pmset -g therm';
|
|
16
|
+
const memorySource = '/usr/sbin/sysctl -n kern.memorystatus_vm_pressure_level';
|
|
17
|
+
export function parseDarwinCpuLimits(text) {
|
|
18
|
+
return Object.fromEntries(['CPU_Speed_Limit', 'CPU_Scheduler_Limit'].map(function cpuLimit(name) {
|
|
19
|
+
const matches = Array.from(text.matchAll(new RegExp(`^\\s*${name}\\s*=\\s*(\\d+)\\s*$`, 'gmu')));
|
|
20
|
+
const encoded = matches.length === 1 ? matches[0]?.[1] : undefined;
|
|
21
|
+
const reading = encoded !== undefined && Number(encoded) <= percentScale
|
|
22
|
+
? hostNumber(thermalSource, 'host', 'percent', function limit() {
|
|
23
|
+
return Number(encoded);
|
|
24
|
+
})
|
|
25
|
+
: unavailableHostReading(thermalSource, 'host', 'percent', `${name} is missing or invalid.`);
|
|
26
|
+
return [name, reading];
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
async function readProbe(executable, args, signal) {
|
|
30
|
+
return await new Promise(function executeProbe(resolve, reject) {
|
|
31
|
+
execFile(executable, args, {
|
|
32
|
+
signal,
|
|
33
|
+
timeout: probeTimeoutMilliseconds,
|
|
34
|
+
maxBuffer: maximumProbeBytes,
|
|
35
|
+
encoding: 'utf8'
|
|
36
|
+
}, function completed(error, stdout) {
|
|
37
|
+
if (error === null) {
|
|
38
|
+
resolve(stdout);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
reject(error);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
async function thermalPressure(signal) {
|
|
47
|
+
try {
|
|
48
|
+
return parseDarwinCpuLimits(await readProbe('/usr/bin/pmset', ['-g', 'therm'], signal));
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
52
|
+
return Object.fromEntries(['CPU_Speed_Limit', 'CPU_Scheduler_Limit'].map(function unavailable(name) {
|
|
53
|
+
return [name, unavailableHostReading(thermalSource, 'host', 'percent', reason)];
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function readMemoryPressure(signal) {
|
|
58
|
+
const output = await readProbe('/usr/sbin/sysctl', ['-n', 'kern.memorystatus_vm_pressure_level'], signal);
|
|
59
|
+
const encoded = z.string().regex(/^\d+$/u).parse(output.trim());
|
|
60
|
+
const value = memoryPressureCodeSchema.parse(Number(encoded));
|
|
61
|
+
return hostNumber(memorySource, 'host', 'native-code', function pressureCode() {
|
|
62
|
+
return value;
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async function memoryPressure(signal) {
|
|
66
|
+
try {
|
|
67
|
+
return await readMemoryPressure(signal);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
return unavailableHostReading(memorySource, 'host', 'native-code', error instanceof Error ? error.message : String(error));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export async function collectDarwinPressure(signal) {
|
|
74
|
+
const [thermal, memory] = await Promise.all([thermalPressure(signal), memoryPressure(signal)]);
|
|
75
|
+
return { ...thermal, darwinMemoryPressureCode: memory };
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=benchmark-host-darwin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark-host-darwin.js","sourceRoot":"","sources":["../../../../source/run/benchmark-host-darwin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { monitorEventLoopDelay, performance as runtimePerformance, PerformanceObserver as RuntimeObserver } from 'node:perf_hooks';
|
|
2
|
+
import { setTimeout as wait, setImmediate as nextTurn } from 'node:timers/promises';
|
|
3
|
+
import { cpuBusyPercent, readHostCpuTimes } from "./benchmark-host-capacity.js";
|
|
4
|
+
import { observeHost, observerMetric, unavailableHostReading } from "./benchmark-host-reading.js";
|
|
5
|
+
import { hostProcessMetrics, readHostProcessWindow } from "./benchmark-host-process.js";
|
|
6
|
+
import { RunCollectionError } from "./run-errors.js";
|
|
7
|
+
const observationMilliseconds = 250;
|
|
8
|
+
const nanosecondsPerMicrosecond = 1000;
|
|
9
|
+
const microsecondsPerMillisecond = 1000;
|
|
10
|
+
function disposeHealthWindow(window) {
|
|
11
|
+
try {
|
|
12
|
+
try {
|
|
13
|
+
window.histogram.disable();
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
window.observer.disconnect();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
throw new RunCollectionError('Benchmark host observer cleanup failed.', { cause: error }, 'measurement');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function beginHealthWindow() {
|
|
24
|
+
const histogram = monitorEventLoopDelay({ samplePerIteration: true });
|
|
25
|
+
const entries = [];
|
|
26
|
+
const observer = new RuntimeObserver(function recordGc(list) {
|
|
27
|
+
entries.push(...list.getEntries());
|
|
28
|
+
});
|
|
29
|
+
const window = {
|
|
30
|
+
histogram,
|
|
31
|
+
observer,
|
|
32
|
+
entries,
|
|
33
|
+
startTime: runtimePerformance.now(),
|
|
34
|
+
utilization: runtimePerformance.eventLoopUtilization()
|
|
35
|
+
};
|
|
36
|
+
try {
|
|
37
|
+
observer.observe({ entryTypes: ['gc'] });
|
|
38
|
+
histogram.enable();
|
|
39
|
+
return window;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
disposeHealthWindow(window);
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function healthMetric(value, source, unit, reason) {
|
|
47
|
+
const reading = value === null
|
|
48
|
+
? unavailableHostReading(source, 'process', unit, reason)
|
|
49
|
+
: observeHost(source, 'process', unit, function nativeValue() {
|
|
50
|
+
return value;
|
|
51
|
+
});
|
|
52
|
+
return observerMetric(reading, 'runtime');
|
|
53
|
+
}
|
|
54
|
+
function healthMetrics(window, stopTime, utilization) {
|
|
55
|
+
const entries = [...window.entries, ...window.observer.takeRecords()].filter(function withinWindow(entry) {
|
|
56
|
+
return entry.startTime >= window.startTime && entry.startTime <= stopTime;
|
|
57
|
+
});
|
|
58
|
+
const { histogram } = window;
|
|
59
|
+
const gcDuration = entries.reduce(function totalDuration(total, entry) {
|
|
60
|
+
return total + entry.duration;
|
|
61
|
+
}, 0);
|
|
62
|
+
return {
|
|
63
|
+
eventLoopDelayMeanMicroseconds: healthMetric(histogram.count === 0 ? null : histogram.mean / nanosecondsPerMicrosecond, 'monitorEventLoopDelay()', 'microseconds', 'No event-loop observations were collected.'),
|
|
64
|
+
eventLoopDelayMaximumMicroseconds: healthMetric(histogram.count === 0 ? null : histogram.max / nanosecondsPerMicrosecond, 'monitorEventLoopDelay()', 'microseconds', 'No event-loop observations were collected.'),
|
|
65
|
+
eventLoopUtilization: healthMetric(utilization, 'performance.eventLoopUtilization()', 'ratio', ''),
|
|
66
|
+
gcObservedCount: healthMetric(entries.length, 'PerformanceObserver(gc)', 'count', ''),
|
|
67
|
+
gcObservedDurationMicroseconds: healthMetric(gcDuration * microsecondsPerMillisecond, 'PerformanceObserver(gc)', 'microseconds', '')
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
async function recordWindow(window, signal) {
|
|
71
|
+
const before = readHostProcessWindow();
|
|
72
|
+
await wait(observationMilliseconds, undefined, { signal });
|
|
73
|
+
const after = readHostProcessWindow();
|
|
74
|
+
const stopTime = runtimePerformance.now();
|
|
75
|
+
const { utilization } = runtimePerformance.eventLoopUtilization(window.utilization);
|
|
76
|
+
await nextTurn(undefined, { signal });
|
|
77
|
+
await nextTurn(undefined, { signal });
|
|
78
|
+
return { ...hostProcessMetrics(before, after), ...healthMetrics(window, stopTime, utilization) };
|
|
79
|
+
}
|
|
80
|
+
async function observeRuntime(signal) {
|
|
81
|
+
const window = beginHealthWindow();
|
|
82
|
+
try {
|
|
83
|
+
return { complete: true, metrics: await recordWindow(window, signal) };
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
disposeHealthWindow(window);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function observeRuntimeOrUnavailable(signal) {
|
|
90
|
+
try {
|
|
91
|
+
return await observeRuntime(signal);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
if (error instanceof RunCollectionError) {
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
complete: false,
|
|
99
|
+
metrics: {
|
|
100
|
+
observation: observerMetric(unavailableHostReading('Node native host observation', 'process', 'status', error instanceof Error
|
|
101
|
+
? error.message
|
|
102
|
+
: String(error)), 'runtime')
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export async function observeBenchmarkHostWindow(signal) {
|
|
108
|
+
const before = readHostCpuTimes();
|
|
109
|
+
const observer = await observeRuntimeOrUnavailable(signal);
|
|
110
|
+
const after = readHostCpuTimes();
|
|
111
|
+
const cpuBusy = observer.complete && before.availability === 'available' && after.availability === 'available'
|
|
112
|
+
? cpuBusyPercent(before.value, after.value)
|
|
113
|
+
: unavailableHostReading('os.cpus() CPU-time deltas', 'host', 'percent', 'CPU observation window is incomplete.');
|
|
114
|
+
return { cpuBusy, metrics: observer.metrics };
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=benchmark-host-observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark-host-observer.js","sourceRoot":"","sources":["../../../../source/run/benchmark-host-observer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { z } from 'zod/v4';
|
|
3
|
+
import { percentScale } from "../config/benchmark-host.js";
|
|
4
|
+
import { hostNumber, unavailableHostReading } from "./benchmark-host-reading.js";
|
|
5
|
+
import { collectDarwinPressure } from "./benchmark-host-darwin.js";
|
|
6
|
+
const maximumProbeBytes = 65_536;
|
|
7
|
+
const pressureFieldNameSchema = z.enum(['avg10', 'avg60', 'avg300', 'total']);
|
|
8
|
+
const pressureFieldSchema = z.tuple([
|
|
9
|
+
pressureFieldNameSchema,
|
|
10
|
+
z.string().regex(/^\d+(?:\.\d+)?$/u)
|
|
11
|
+
]);
|
|
12
|
+
const pressureLevelSchema = z.enum(['some', 'full']);
|
|
13
|
+
const pressureFieldsSchema = z.record(pressureFieldNameSchema, z.number());
|
|
14
|
+
function pressureField(field) {
|
|
15
|
+
const [name, encoded] = pressureFieldSchema.parse(field.split('='));
|
|
16
|
+
const range = name === 'total'
|
|
17
|
+
? z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER)
|
|
18
|
+
: z.number().min(0).max(percentScale);
|
|
19
|
+
return [name, range.parse(Number(encoded))];
|
|
20
|
+
}
|
|
21
|
+
function pressureLine(line) {
|
|
22
|
+
const [level, ...fields] = line.trim().split(/\s+/u);
|
|
23
|
+
const entries = fields.map(pressureField);
|
|
24
|
+
const names = new Set(entries.map(function name(entry) {
|
|
25
|
+
return entry[0];
|
|
26
|
+
}));
|
|
27
|
+
if (names.size !== entries.length) {
|
|
28
|
+
throw new TypeError('Duplicate PSI pressure field.');
|
|
29
|
+
}
|
|
30
|
+
return [pressureLevelSchema.parse(level), pressureFieldsSchema.parse(Object.fromEntries(entries))];
|
|
31
|
+
}
|
|
32
|
+
export function parseLinuxPressure(text, source) {
|
|
33
|
+
const lines = text.trim().split('\n').map(pressureLine);
|
|
34
|
+
const levels = new Map(lines);
|
|
35
|
+
if (!levels.has('some') || levels.size !== lines.length) {
|
|
36
|
+
throw new TypeError('Missing or duplicate PSI pressure level.');
|
|
37
|
+
}
|
|
38
|
+
return Object.fromEntries(lines.flatMap(function pressureReadings([level, fields]) {
|
|
39
|
+
return Object.entries(fields).map(function pressureReading([name, value]) {
|
|
40
|
+
return [
|
|
41
|
+
`${level}.${name}`,
|
|
42
|
+
hostNumber(source, 'host', name === 'total' ? 'microseconds' : 'percent', function nativeValue() {
|
|
43
|
+
return value;
|
|
44
|
+
})
|
|
45
|
+
];
|
|
46
|
+
});
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
async function readPressureFile(source, signal) {
|
|
50
|
+
const text = await readFile(source, { encoding: 'utf8', signal });
|
|
51
|
+
if (Buffer.byteLength(text) > maximumProbeBytes) {
|
|
52
|
+
throw new TypeError('PSI probe exceeded its output limit.');
|
|
53
|
+
}
|
|
54
|
+
return parseLinuxPressure(text, source);
|
|
55
|
+
}
|
|
56
|
+
async function linuxPressure(resource, signal) {
|
|
57
|
+
const source = `/proc/pressure/${resource}`;
|
|
58
|
+
try {
|
|
59
|
+
return await readPressureFile(source, signal);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return {
|
|
63
|
+
'some.avg10': unavailableHostReading(source, 'host', 'percent', error instanceof Error
|
|
64
|
+
? error.message
|
|
65
|
+
: String(error))
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export async function collectPlatformPressure(platform, signal) {
|
|
70
|
+
if (platform === 'darwin') {
|
|
71
|
+
return await collectDarwinPressure(signal);
|
|
72
|
+
}
|
|
73
|
+
if (platform !== 'linux') {
|
|
74
|
+
return {};
|
|
75
|
+
}
|
|
76
|
+
const readings = await Promise.all(['cpu', 'memory', 'io'].map(async function pressure(resource) {
|
|
77
|
+
const values = await linuxPressure(resource, signal);
|
|
78
|
+
return Object.entries(values).map(function nameReading([key, value]) {
|
|
79
|
+
return [`linux.${resource}.${key}`, value];
|
|
80
|
+
});
|
|
81
|
+
}));
|
|
82
|
+
return Object.fromEntries(readings.flat());
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=benchmark-host-platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark-host-platform.js","sourceRoot":"","sources":["../../../../source/run/benchmark-host-platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { observeHost, observerMetric } from "./benchmark-host-reading.js";
|
|
2
|
+
const bytesPerBinaryKilobyte = 1024;
|
|
3
|
+
const resourceCounters = [
|
|
4
|
+
'minorPageFault',
|
|
5
|
+
'majorPageFault',
|
|
6
|
+
'fsRead',
|
|
7
|
+
'fsWrite',
|
|
8
|
+
'voluntaryContextSwitches',
|
|
9
|
+
'involuntaryContextSwitches'
|
|
10
|
+
];
|
|
11
|
+
const memoryFields = {
|
|
12
|
+
residentSetBytes: 'rss',
|
|
13
|
+
heapTotalBytes: 'heapTotal',
|
|
14
|
+
heapUsedBytes: 'heapUsed',
|
|
15
|
+
externalBytes: 'external',
|
|
16
|
+
arrayBufferBytes: 'arrayBuffers'
|
|
17
|
+
};
|
|
18
|
+
export function readHostProcessWindow() {
|
|
19
|
+
return {
|
|
20
|
+
activeResourceCount: observeHost('process.getActiveResourcesInfo()', 'process', 'count', function activeResources() {
|
|
21
|
+
return process.getActiveResourcesInfo().length;
|
|
22
|
+
}),
|
|
23
|
+
cpu: observeHost('process.cpuUsage()', 'process', 'microseconds', process.cpuUsage),
|
|
24
|
+
memory: observeHost('process.memoryUsage()', 'process', 'bytes', process.memoryUsage),
|
|
25
|
+
resources: observeHost('process.resourceUsage()', 'process', 'count', process.resourceUsage)
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function windowValue(reading) {
|
|
29
|
+
if (reading.availability === 'unavailable') {
|
|
30
|
+
throw new TypeError(reading.reason);
|
|
31
|
+
}
|
|
32
|
+
return reading.value;
|
|
33
|
+
}
|
|
34
|
+
function processMetric(source, unit, read, scope) {
|
|
35
|
+
return observerMetric(observeHost(source, 'process', unit, read), scope);
|
|
36
|
+
}
|
|
37
|
+
export function hostProcessMetrics(before, after) {
|
|
38
|
+
const cpu = Object.fromEntries(['user', 'system', 'total'].map(function cpuMetric(field) {
|
|
39
|
+
return [
|
|
40
|
+
`processCpu${field.charAt(0).toUpperCase()}${field.slice(1)}Microseconds`,
|
|
41
|
+
processMetric('process.cpuUsage() delta', 'microseconds', function elapsedCpu() {
|
|
42
|
+
const start = windowValue(before.cpu);
|
|
43
|
+
const end = windowValue(after.cpu);
|
|
44
|
+
if (field === 'total') {
|
|
45
|
+
return end.user + end.system - start.user - start.system;
|
|
46
|
+
}
|
|
47
|
+
return field === 'user' ? end.user - start.user : end.system - start.system;
|
|
48
|
+
}, 'process')
|
|
49
|
+
];
|
|
50
|
+
}));
|
|
51
|
+
const memory = Object.fromEntries(Object.entries(memoryFields).flatMap(function memoryMetric([name, field]) {
|
|
52
|
+
return [
|
|
53
|
+
[
|
|
54
|
+
name,
|
|
55
|
+
processMetric('process.memoryUsage()', 'bytes', function memoryValue() {
|
|
56
|
+
return windowValue(after.memory)[field];
|
|
57
|
+
}, field === 'rss' ? 'process' : 'thread')
|
|
58
|
+
],
|
|
59
|
+
[
|
|
60
|
+
`${name}Delta`,
|
|
61
|
+
processMetric('process.memoryUsage() delta', 'bytes', function memoryDelta() {
|
|
62
|
+
return windowValue(after.memory)[field] - windowValue(before.memory)[field];
|
|
63
|
+
}, field === 'rss' ? 'process' : 'thread')
|
|
64
|
+
]
|
|
65
|
+
];
|
|
66
|
+
}));
|
|
67
|
+
const resources = Object.fromEntries(resourceCounters.map(function resourceMetric(field) {
|
|
68
|
+
return [
|
|
69
|
+
`${field}Delta`,
|
|
70
|
+
processMetric('process.resourceUsage() delta', 'count', function resourceDelta() {
|
|
71
|
+
if (process.platform === 'win32' &&
|
|
72
|
+
['majorPageFault', 'voluntaryContextSwitches', 'involuntaryContextSwitches'].includes(field)) {
|
|
73
|
+
throw new TypeError('Counter unavailable on this platform.');
|
|
74
|
+
}
|
|
75
|
+
return windowValue(after.resources)[field] - windowValue(before.resources)[field];
|
|
76
|
+
}, 'process')
|
|
77
|
+
];
|
|
78
|
+
}));
|
|
79
|
+
return {
|
|
80
|
+
...cpu,
|
|
81
|
+
...memory,
|
|
82
|
+
...resources,
|
|
83
|
+
activeResourceCount: processMetric('process.getActiveResourcesInfo()', 'count', function activeResources() {
|
|
84
|
+
return windowValue(after.activeResourceCount);
|
|
85
|
+
}, 'process'),
|
|
86
|
+
activeResourceCountDelta: processMetric('process.getActiveResourcesInfo() delta', 'count', function resourceCountDelta() {
|
|
87
|
+
return windowValue(after.activeResourceCount) - windowValue(before.activeResourceCount);
|
|
88
|
+
}, 'process'),
|
|
89
|
+
processMaximumResidentSetBytes: processMetric('process.resourceUsage().maxRSS', 'bytes', function maximumResidentSet() {
|
|
90
|
+
return windowValue(after.resources).maxRSS * bytesPerBinaryKilobyte;
|
|
91
|
+
}, 'process')
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=benchmark-host-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark-host-process.js","sourceRoot":"","sources":["../../../../source/run/benchmark-host-process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { percentScale } from "../config/benchmark-host.js";
|
|
2
|
+
export function unavailableHostReading(source, scope, unit, reason) {
|
|
3
|
+
return { source, scope, unit, availability: 'unavailable', reason };
|
|
4
|
+
}
|
|
5
|
+
export function observeHost(source, scope, unit, read) {
|
|
6
|
+
try {
|
|
7
|
+
return { source, scope, unit, availability: 'available', value: read() };
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
return unavailableHostReading(source, scope, unit, error instanceof Error ? error.message : String(error));
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function hostNumber(source, scope, unit, read) {
|
|
14
|
+
return observeHost(source, scope, unit, function readFiniteValue() {
|
|
15
|
+
const value = read();
|
|
16
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
17
|
+
throw new TypeError('Host reading must be finite and nonnegative.');
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function hostPercentage(source, scope, numerator, denominator) {
|
|
23
|
+
if (numerator.availability === 'unavailable') {
|
|
24
|
+
return unavailableHostReading(source, scope, 'percent', numerator.reason);
|
|
25
|
+
}
|
|
26
|
+
if (denominator.availability === 'unavailable') {
|
|
27
|
+
return unavailableHostReading(source, scope, 'percent', denominator.reason);
|
|
28
|
+
}
|
|
29
|
+
return hostNumber(source, scope, 'percent', function divideCapacity() {
|
|
30
|
+
if (denominator.value <= 0) {
|
|
31
|
+
throw new TypeError('Host capacity denominator must be positive.');
|
|
32
|
+
}
|
|
33
|
+
return numerator.value / denominator.value * percentScale;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export function observerMetric(reading, scope) {
|
|
37
|
+
if (reading.availability === 'unavailable' || Number.isFinite(reading.value)) {
|
|
38
|
+
return { ...reading, scope };
|
|
39
|
+
}
|
|
40
|
+
return unavailableHostReading(reading.source, scope, reading.unit, 'Native observation is not finite.');
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=benchmark-host-reading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark-host-reading.js","sourceRoot":"","sources":["../../../../source/run/benchmark-host-reading.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,MAAM,UAAU,sBAAsB,CAClC,MAAc,EACd,KAAkC,EAClC,IAAY,EACZ,MAAc;IAEd,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,WAAW,CACvB,MAAc,EACd,KAAkC,EAClC,IAAY,EACZ,IAAiB;IAEjB,IAAI,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;IAC7E,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACtB,OAAO,sBAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/G,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CACtB,MAAc,EACd,KAAyB,EACzB,IAAY,EACZ,IAAkB;IAElB,OAAO,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,eAAe;QAC5D,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,cAAc,CAC1B,MAAc,EACd,KAAyB,EACzB,SAA8B,EAC9B,WAAgC;IAEhC,IAAI,SAAS,CAAC,YAAY,KAAK,aAAa,EAAE,CAAC;QAC3C,OAAO,sBAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,WAAW,CAAC,YAAY,KAAK,aAAa,EAAE,CAAC;QAC7C,OAAO,sBAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,cAAc;QAC/D,IAAI,WAAW,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,SAAS,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,GAAG,YAAY,CAAC;IAC9D,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAA4B,EAAE,KAAmC;IAC5F,IAAI,OAAO,CAAC,YAAY,KAAK,aAAa,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,mCAAmC,CAAC,CAAC;AAC5G,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import { availableMemoryPercent, hostLoadPerCpuPercent, readBenchmarkHostCapacity } from "./benchmark-host-capacity.js";
|
|
3
|
+
import { observeBenchmarkHostWindow } from "./benchmark-host-observer.js";
|
|
4
|
+
import { collectPlatformPressure } from "./benchmark-host-platform.js";
|
|
5
|
+
import { observeHost, unavailableHostReading } from "./benchmark-host-reading.js";
|
|
6
|
+
const maximumObservationMilliseconds = 1000;
|
|
7
|
+
const probeTimeoutMilliseconds = 250;
|
|
8
|
+
function platformSignal(pressure, key, source) {
|
|
9
|
+
return pressure[key] ??
|
|
10
|
+
unavailableHostReading(source, 'host', 'percent', 'Signal is unsupported on this platform.');
|
|
11
|
+
}
|
|
12
|
+
export async function collectBenchmarkHost(input, clock) {
|
|
13
|
+
const startedDate = new Date(clock.currentUnixEpochMilliseconds);
|
|
14
|
+
const startedAt = startedDate.toISOString();
|
|
15
|
+
const started = clock.currentMonotonicMicroseconds;
|
|
16
|
+
const signal = AbortSignal.timeout(Math.min(maximumObservationMilliseconds, input.timeoutMilliseconds));
|
|
17
|
+
const platformPressure = await collectPlatformPressure(process.platform, AbortSignal.any([signal, AbortSignal.timeout(probeTimeoutMilliseconds)]));
|
|
18
|
+
const observer = await observeBenchmarkHostWindow(signal);
|
|
19
|
+
const capacity = readBenchmarkHostCapacity();
|
|
20
|
+
return {
|
|
21
|
+
version: 1,
|
|
22
|
+
startedAt,
|
|
23
|
+
durationMicroseconds: Number(clock.currentMonotonicMicroseconds - started),
|
|
24
|
+
runtime: {
|
|
25
|
+
processId: process.pid,
|
|
26
|
+
nodeVersion: process.versions.node,
|
|
27
|
+
v8Version: process.versions.v8,
|
|
28
|
+
architecture: process.arch,
|
|
29
|
+
operatingSystem: process.platform,
|
|
30
|
+
operatingSystemRelease: observeHost('os.release()', 'host', 'release', os.release),
|
|
31
|
+
nodeArguments: Array.from(process.execArgv)
|
|
32
|
+
},
|
|
33
|
+
capacity,
|
|
34
|
+
signals: {
|
|
35
|
+
cpuBusyPercent: observer.cpuBusy,
|
|
36
|
+
hostLoadPerCpuPercent: hostLoadPerCpuPercent(capacity),
|
|
37
|
+
availableMemoryPercent: availableMemoryPercent(capacity),
|
|
38
|
+
linuxCpuStallPercent: platformSignal(platformPressure, 'linux.cpu.some.avg10', '/proc/pressure/cpu'),
|
|
39
|
+
linuxMemoryStallPercent: platformSignal(platformPressure, 'linux.memory.some.avg10', '/proc/pressure/memory'),
|
|
40
|
+
linuxIoStallPercent: platformSignal(platformPressure, 'linux.io.some.avg10', '/proc/pressure/io'),
|
|
41
|
+
darwinCpuSpeedPercent: platformSignal(platformPressure, 'CPU_Speed_Limit', '/usr/bin/pmset -g therm'),
|
|
42
|
+
darwinCpuSchedulerPercent: platformSignal(platformPressure, 'CPU_Scheduler_Limit', '/usr/bin/pmset -g therm')
|
|
43
|
+
},
|
|
44
|
+
platformPressure,
|
|
45
|
+
observer: observer.metrics
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=benchmark-host.js.map
|