docs/operations/container-resource-detection.md
RustFS automatically detects container resource limits (CPU and memory) from cgroup v1/v2. This ensures correct resource allocation and accurate metrics in containerized environments (Kubernetes, Docker, etc.).
When RustFS runs in a container, the underlying system libraries report the host's total CPU cores and memory, not the container's limits. This leads to:
rustfs_memory_usage_percent shows host-based percentageRustFS now detects cgroup limits directly from the filesystem:
/sys/fs/cgroup/cpu.max (v2) or /sys/fs/cgroup/cpu/cpu.cfs_quota_us (v1)/sys/fs/cgroup/memory.max (v2) or /sys/fs/cgroup/memory/memory.limit_in_bytes (v1)The effective resource limits are the minimum of host and cgroup values.
/sys/fs/cgroup/cpu.max
"$QUOTA $PERIOD" or "max" (unlimited)cores = ceil(quota / period)/sys/fs/cgroup/cpu/cpu.cfs_quota_us
cores = ceil(quota / period)sysinfo/sys/fs/cgroup/memory.max
"max" (unlimited)/sys/fs/cgroup/memory/memory.limit_in_bytes
sysinfoRUSTFS_DISABLE_CGROUP_DETECTION=1
Disables cgroup detection entirely. Useful for testing or when cgroup filesystem is not accessible.
RUSTFS_OVERRIDE_CPU_CORES=4
Overrides detected CPU cores. Takes precedence over cgroup detection.
RUSTFS_OVERRIDE_MEMORY_BYTES=2147483648
Overrides detected memory limit in bytes. Takes precedence over cgroup detection.
| Metric | Description |
|---|---|
rustfs_memory_effective_total_bytes | Effective memory total (host or cgroup) |
rustfs_cgroup_detected | Whether cgroup limits were detected (1=yes, 0=no) |
rustfs_cgroup_cpu_cores_limit | Detected CPU cores limit |
rustfs_cgroup_memory_limit_bytes | Detected memory limit |
| Metric | Change |
|---|---|
rustfs_memory_total_bytes | Now uses effective memory (cgroup-aware) |
rustfs_memory_usage_percent | Now calculated against effective memory |
RustFS logs detected container resources at startup:
INFO container resources (detected from cgroup) cpu_cores=2 memory_bytes=1073741824 memory_mib=1024
or
INFO container resources (overridden by environment variables) cpu_cores=4 memory_bytes=2147483648 memory_mib=2048
resources:
limits:
cpu: "2"
memory: "1Gi"
requests:
cpu: "500m"
memory: "512Mi"
RustFS will detect:
docker run --cpus=2 --memory=1g rustfs/rustfs:latest
RustFS will detect:
export RUSTFS_OVERRIDE_CPU_CORES=4
export RUSTFS_OVERRIDE_MEMORY_BYTES=2147483648
RustFS will use:
Check if cgroup filesystem is mounted:
ls -la /sys/fs/cgroup/
Check cgroup version:
stat -fc %T /sys/fs/cgroup/
cgroup2fs = cgroup v2tmpfs = cgroup v1Check if limits are set:
# cgroup v2
cat /sys/fs/cgroup/cpu.max
cat /sys/fs/cgroup/memory.max
# cgroup v1
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
If rustfs_memory_effective_total_bytes shows host memory instead of cgroup limit:
Verify cgroup detection is not disabled:
echo $RUSTFS_DISABLE_CGROUP_DETECTION
Check startup logs for cgroup detection:
grep "container resources" /logs/rustfs.log
Use environment variable override as workaround:
export RUSTFS_OVERRIDE_MEMORY_BYTES=1073741824
rustfs/src/cgroup_resources.rs - Core cgroup detection logicrustfs/src/container_config.rs - Container configuration with overridesrustfs/src/memory_observability.rs - Updated memory metricsrustfs/src/server/runtime.rs - Updated Tokio runtime configurationrustfs/src/startup_entrypoint.rs - Startup loggingAll detection functions are thread-safe and use OnceLock for caching.