Files
qinglong/scripts/ql3-cluster-control-benchmark.cjs
T

140 lines
4.0 KiB
JavaScript

#!/usr/bin/env node
const path = require('node:path');
const { performance } = require('node:perf_hooks');
const MIB = 1024 * 1024;
const args = new Map(
process.argv.slice(2).map((argument) => {
const separator = argument.indexOf('=');
return separator === -1
? [argument, true]
: [argument.slice(0, separator), argument.slice(separator + 1)];
}),
);
function numericArgument(name) {
const raw = args.get(name);
if (raw === undefined) return undefined;
const value = Number(raw);
if (!Number.isFinite(value) || value <= 0) {
throw new Error(`${name} must be a positive number`);
}
return value;
}
async function main() {
const nodeMajor = Number(process.versions.node.split('.')[0]);
if (nodeMajor < 24) {
throw new Error('cluster-control benchmark requires Node.js 24 or newer');
}
const modulePath = path.resolve(
__dirname,
'../packages/ql3-cluster-control/dist/application-runtime/clusterControlRuntime.js',
);
const rssBeforeBytes = process.memoryUsage().rss;
const loadedAt = performance.now();
const { bootstrapClusterControlRuntime } = require(modulePath);
const rssAfterBytes = process.memoryUsage().rss;
const moduleLoadMs = performance.now() - loadedAt;
let databaseOpenCount = 0;
let assemblyCount = 0;
const auditStates = [];
const startedAt = performance.now();
const activation = await bootstrapClusterControlRuntime({
enabled: false,
profile: 'cluster-control',
async openDatabase() {
databaseOpenCount += 1;
throw new Error('disabled cluster-control opened PostgreSQL');
},
create() {
assemblyCount += 1;
throw new Error('disabled cluster-control assembled a runtime stack');
},
audit(record) {
auditStates.push(record.state);
},
});
const disabledActivationMs = performance.now() - startedAt;
if (activation.status !== 'disabled') {
throw new Error(
'cluster-control disabled benchmark unexpectedly activated',
);
}
if ((await activation.stop()) !== 'stopped') {
throw new Error('cluster-control disabled stop did not converge');
}
if (
databaseOpenCount !== 0 ||
assemblyCount !== 0 ||
auditStates.length !== 1 ||
auditStates[0] !== 'disabled'
) {
throw new Error(
'cluster-control disabled boundary widened during benchmark',
);
}
const report = {
schemaVersion: 1,
profile: 'cluster-control',
node: process.version,
platform: process.platform,
architecture: process.arch,
moduleLoad: {
durationMs: Number(moduleLoadMs.toFixed(3)),
rssBeforeBytes,
rssAfterBytes,
rssDeltaBytes: Math.max(0, rssAfterBytes - rssBeforeBytes),
},
disabledActivation: {
durationMs: Number(disabledActivationMs.toFixed(3)),
databaseOpenCount,
assemblyCount,
auditStates,
},
};
const maxRssDeltaMb = numericArgument('--max-rss-delta-mb');
const maxDisabledActivationMs = numericArgument(
'--max-disabled-activation-ms',
);
const violations = [];
if (
maxRssDeltaMb !== undefined &&
report.moduleLoad.rssDeltaBytes > maxRssDeltaMb * MIB
) {
violations.push(
`module RSS delta ${report.moduleLoad.rssDeltaBytes} exceeded ${maxRssDeltaMb} MiB`,
);
}
if (
maxDisabledActivationMs !== undefined &&
report.disabledActivation.durationMs > maxDisabledActivationMs
) {
violations.push(
`disabled activation ${report.disabledActivation.durationMs}ms exceeded ${maxDisabledActivationMs}ms`,
);
}
report.gates = {
maxRssDeltaMb: maxRssDeltaMb ?? null,
maxDisabledActivationMs: maxDisabledActivationMs ?? null,
passed: violations.length === 0,
violations,
};
process.stdout.write(
`${JSON.stringify(report, null, args.has('--json') ? 0 : 2)}\n`,
);
if (violations.length > 0) process.exitCode = 1;
}
main().catch((error) => {
process.stderr.write(
`ql3 cluster-control benchmark failed: ${
error instanceof Error ? error.message : String(error)
}\n`,
);
process.exitCode = 1;
});