Skip to content

RADAR deployment capacity

Each managed monitor is one Docker workload with a bounded database pool. Default budgets are:

Setting Default
Docker memory hard limit and Swarm reservation 512 MiB
Docker CPU limit and Swarm reservation 0.5 CPU
RADAR internal RSS alert/cleanup target 384 MiB
MQTT queue capacity 256 messages
Maximum MQTT payload 65,536 bytes
Concurrent active or pending monitors 20
PostgreSQL pool per worker At most 2 connections, no overflow

Swarm reserves CPU and memory before scheduling each worker. Reservations default to the configured hard limits. Explicit smaller positive reservations are allowed but permit more workloads to share a node; size these from measured concurrent workloads. Invalid, zero, nonfinite, or malformed resource quantities fail configuration validation. Reservations cannot exceed limits, and RADAR's internal target must remain below the Docker memory limit.

TACTIC_RADAR_MAX_ACTIVE_MONITORS limits the fleet under the same database lock that serializes sensor claims. Pending creations and unresolved Docker outcomes consume a slot. Retrying the same accepted monitor does not consume another slot. The limit does not represent an automatic measurement of available fleet capacity. Set it to fit both eligible Swarm nodes and PostgreSQL connection headroom after accounting for API/controller pools, migrations, and operational access. Twenty monitors can consume forty database connections. The second worker connection allows a health heartbeat to report a blocked evidence transaction.

Configure limits with TACTIC_DOCKER_DEFAULT_MEMORY_LIMIT and TACTIC_DOCKER_DEFAULT_CPU_LIMIT. Override reservations with the corresponding TACTIC_DOCKER_DEFAULT_MEMORY_RESERVATION and TACTIC_DOCKER_DEFAULT_CPU_RESERVATION variables. Unset/empty reservation settings inherit the limits. Configure the internal target and ingress bounds with TACTIC_RADAR_DEFAULT_MEMORY_LIMIT_MB, TACTIC_RADAR_DEFAULT_MAX_QUEUE_SIZE, and TACTIC_RADAR_DEFAULT_MAX_PAYLOAD_BYTES. These are forwarded to every worker.

At default ingress limits, queued payload bytes are bounded to 16 MiB. Configuration rejects a raw payload capacity that reaches the internal memory target. This bound excludes Python object overhead, topics, decoded data, model state, evidence queues, training/calibration buffers, and checkpoint serialization copies. The internal target triggers observation/cleanup; Docker enforces the actual memory limit.

Profile representative sensor counts, data rates, detector parameters, full fitting, and checkpoint peaks before admitting a deployment workload. The accepted model parameter/window ranges do not establish that every configuration fits the default worker budget. A large model can exhaust its memory limit even with a small queue. Increase the measured worker budget and its reservation together, or reduce model size, before increasing the fleet limit. No static calibration-memory estimate is used to promise safety for arbitrary models.

Every deployment, local development included, runs RADAR as Swarm services, so the scheduler admits each worker against its reservation.