Limit daemon-wide Git process pressure (#2797)

* perf(server): bound Git process starts

Git refresh bursts could keep creating short-lived processes at the concurrency ceiling, causing sustained process churn on constrained hosts. Apply one daemon-global start-rate and concurrency policy to every Git command while preserving the legacy concurrency environment variable.

* build(nix): update npm dependency hash

* fix(server): hold Git slots until process exit

* fix(server): enforce Git limits across process lifetime

* fix(server): align Git metrics with process exit

* Fix Git limiter test deadlocks

* Tune default Git process rate
This commit is contained in:
Mohamed Boudra
2026-08-02 19:59:43 +02:00
committed by GitHub
parent f682156302
commit 2e188787ff
23 changed files with 822 additions and 225 deletions
@@ -7,6 +7,7 @@ export interface GitCommandDurationStats {
export interface GitCommandRuntimeMetricsSnapshot {
concurrencyLimit: number;
maxProcessesPerSecond: number;
active: number;
pending: number;
peakActive: number;
@@ -44,7 +45,10 @@ export class GitCommandRuntimeMetricsWindow {
private readonly operationCounts = new Map<string, number>();
constructor(
private readonly concurrencyLimit: number,
private readonly limits: {
concurrencyLimit: number;
maxProcessesPerSecond: number;
},
private readonly clock: Clock = Date.now,
) {}
@@ -98,7 +102,8 @@ export class GitCommandRuntimeMetricsWindow {
...Array.from(this.pendingCommands, (metric) => metric.queuedAtMs),
);
const snapshot: GitCommandRuntimeMetricsSnapshot = {
concurrencyLimit: this.concurrencyLimit,
concurrencyLimit: this.limits.concurrencyLimit,
maxProcessesPerSecond: this.limits.maxProcessesPerSecond,
active: limiter.active,
pending: limiter.pending,
peakActive: this.peakActive,