diff --git a/.server-changes/docker-resource-monitor-parallel-inspect.md b/.server-changes/docker-resource-monitor-parallel-inspect.md new file mode 100644 index 00000000000..9ff25c750d6 --- /dev/null +++ b/.server-changes/docker-resource-monitor-parallel-inspect.md @@ -0,0 +1,6 @@ +--- +area: supervisor +type: improvement +--- + +Resource availability checks now update faster when many task containers are running. diff --git a/apps/supervisor/src/resourceMonitor.ts b/apps/supervisor/src/resourceMonitor.ts index 507a52bbf60..7cb9b0b3a22 100644 --- a/apps/supervisor/src/resourceMonitor.ts +++ b/apps/supervisor/src/resourceMonitor.ts @@ -132,17 +132,21 @@ export class DockerResourceMonitor extends ResourceMonitor { let cpuUsed = 0; let memoryUsed = 0; - for (const container of stats) { - if (container.State === "running") { - const c = this.docker.getContainer(container.Id); - const { HostConfig } = await c.inspect(); - - const cpu = this.resourceParser.cpu(HostConfig.NanoCpus ?? 0); - const memory = this.resourceParser.memory(HostConfig.Memory ?? 0); - - cpuUsed += cpu; - memoryUsed += memory; - } + const runningContainers = stats.filter((container) => container.State === "running"); + const inspectedResources = await Promise.all( + runningContainers.map(async (container) => { + const { HostConfig } = await this.docker.getContainer(container.Id).inspect(); + + return { + cpu: this.resourceParser.cpu(HostConfig.NanoCpus ?? 0), + memory: this.resourceParser.memory(HostConfig.Memory ?? 0), + }; + }) + ); + + for (const resources of inspectedResources) { + cpuUsed += resources.cpu; + memoryUsed += resources.memory; } this.cachedResources = this.applyOverrides({