fix: budget workers for expensive captures

This commit is contained in:
Miguel Ángel
2026-04-27 22:53:27 -04:00
parent 37827cdaec
commit 36b3fc8cd9
10 changed files with 978 additions and 101 deletions
+5 -13
View File
@@ -35,11 +35,6 @@ const FORMAT_EXT: Record<string, string> = { mp4: ".mp4", webm: ".webm", mov: ".
const CPU_CORE_COUNT = cpus().length;
/** 3/4 of CPU cores, capped at 8. Each worker spawns a Chrome process (~256 MB). */
function defaultWorkerCount(): number {
return Math.max(1, Math.min(Math.floor((CPU_CORE_COUNT * 3) / 4), 8));
}
export default defineCommand({
meta: {
name: "render",
@@ -216,12 +211,9 @@ export default defineCommand({
}
// ── Print render plan ─────────────────────────────────────────────────
const workerCount = workers ?? defaultWorkerCount();
if (!quiet) {
const workerLabel =
args.workers != null
? `${workerCount} workers`
: `${workerCount} workers (auto — ${CPU_CORE_COUNT} cores detected)`;
workers != null ? `${workers} workers` : `auto workers (${CPU_CORE_COUNT} cores detected)`;
console.log("");
console.log(
c.accent("\u25C6") +
@@ -307,7 +299,7 @@ export default defineCommand({
fps,
quality,
format,
workers: workerCount,
workers,
gpu: useGpu,
hdr: args.hdr ?? false,
crf,
@@ -319,7 +311,7 @@ export default defineCommand({
fps,
quality,
format,
workers: workerCount,
workers,
gpu: useGpu,
hdr: args.hdr ?? false,
crf,
@@ -335,7 +327,7 @@ interface RenderOptions {
fps: 24 | 30 | 60;
quality: "draft" | "standard" | "high";
format: "mp4" | "webm" | "mov";
workers: number;
workers?: number;
gpu: boolean;
hdr: boolean;
crf?: number;
@@ -604,7 +596,7 @@ function trackRenderMetrics(
durationMs: elapsedMs,
fps: options.fps,
quality: options.quality,
workers: options.workers,
workers: options.workers ?? perf?.workers,
docker,
gpu: options.gpu,
compositionDurationMs,
+1 -1
View File
@@ -8,7 +8,7 @@ export function trackRenderComplete(props: {
durationMs: number;
fps: number;
quality: string;
workers: number;
workers?: number;
docker: boolean;
gpu: boolean;
// Composition metadata
+14 -4
View File
@@ -5,7 +5,6 @@ const BASE: DockerRenderOptions = {
fps: 30,
quality: "standard",
format: "mp4",
workers: 4,
gpu: false,
hdr: false,
crf: undefined,
@@ -43,17 +42,28 @@ describe("buildDockerRunArgs", () => {
"standard",
"--format",
"mp4",
"--workers",
"4",
]
`);
});
it("omits --workers when auto sizing should happen inside the container", () => {
const args = buildDockerRunArgs({ ...FIXED_INPUT, options: BASE });
expect(args).not.toContain("--workers");
});
it("matches snapshot when every renderer flag is enabled", () => {
expect(
buildDockerRunArgs({
...FIXED_INPUT,
options: { ...BASE, gpu: true, hdr: true, crf: 18, videoBitrate: undefined, quiet: true },
options: {
...BASE,
workers: 4,
gpu: true,
hdr: true,
crf: 18,
videoBitrate: undefined,
quiet: true,
},
}),
).toMatchInlineSnapshot(`
[
+2 -3
View File
@@ -22,7 +22,7 @@ export interface DockerRenderOptions {
fps: 24 | 30 | 60;
quality: "draft" | "standard" | "high";
format: "mp4" | "webm" | "mov";
workers: number;
workers?: number;
gpu: boolean;
hdr: boolean;
crf?: number;
@@ -54,8 +54,7 @@ export function buildDockerRunArgs(input: DockerRunArgsInput): string[] {
options.quality,
"--format",
options.format,
"--workers",
String(options.workers),
...(options.workers != null ? ["--workers", String(options.workers)] : []),
...(options.crf != null ? ["--crf", String(options.crf)] : []),
...(options.videoBitrate ? ["--video-bitrate", options.videoBitrate] : []),
...(options.quiet ? ["--quiet"] : []),