






















@@ -1,4 +1,4 @@
1-/** @typedef {{ cpuCount?: number, loadAverage1m?: number, totalMemoryBytes?: number }} VitestHostInfo */
1+/** @typedef {{ cpuCount?: number, loadAverage1m?: number, totalMemoryBytes?: number, freeMemoryBytes?: number }} VitestHostInfo */
22/** @typedef {{ maxWorkers: number, fileParallelism: boolean, throttledBySystem: boolean }} LocalVitestScheduling */
3344import os from "node:os";
@@ -30,9 +30,24 @@ export function detectVitestHostInfo() {
3030typeof os.availableParallelism === "function" ? os.availableParallelism() : os.cpus().length,
3131loadAverage1m: os.loadavg()[0] ?? 0,
3232totalMemoryBytes: os.totalmem(),
33+freeMemoryBytes: os.freemem(),
3334};
3435}
353637+function resolveMemoryPressureWorkerLimit(system) {
38+const freeMemoryGb = (system.freeMemoryBytes ?? 0) / 1024 ** 3;
39+if (!Number.isFinite(freeMemoryGb) || freeMemoryGb <= 0) {
40+return null;
41+}
42+if (freeMemoryGb <= 4) {
43+return 1;
44+}
45+if (freeMemoryGb <= 8) {
46+return 2;
47+}
48+return null;
49+}
50+3651export function resolveLocalVitestMaxWorkers(
3752env = process.env,
3853system = detectVitestHostInfo(),
@@ -112,6 +127,16 @@ export function resolveLocalVitestScheduling(
112127};
113128}
114129130+const memoryPressureLimit = resolveMemoryPressureWorkerLimit(system);
131+if (memoryPressureLimit !== null && inferred > memoryPressureLimit) {
132+const maxWorkers = memoryPressureLimit;
133+return {
134+ maxWorkers,
135+fileParallelism: maxWorkers > 1,
136+throttledBySystem: true,
137+};
138+}
139+115140if (loadRatio >= 1) {
116141const maxWorkers = Math.max(1, Math.floor(inferred / 2));
117142return {
@@ -149,6 +174,22 @@ export function shouldUseLargeLocalFullSuiteProfile(
149174}
150175151176export function resolveLocalFullSuiteProfile(env = process.env, system = detectVitestHostInfo()) {
177+if (!isSystemThrottleDisabled(env)) {
178+const memoryPressureLimit = resolveMemoryPressureWorkerLimit(system);
179+if (memoryPressureLimit === 1) {
180+return {
181+shardParallelism: 1,
182+vitestMaxWorkers: 1,
183+};
184+}
185+if (memoryPressureLimit === 2) {
186+return {
187+shardParallelism: 2,
188+vitestMaxWorkers: 1,
189+};
190+}
191+}
192+152193if (shouldUseLargeLocalFullSuiteProfile(env, system)) {
153194return {
154195shardParallelism: LARGE_LOCAL_FULL_SUITE_PARALLELISM,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。