From 5545772754f8de9219700a561e3f332f4921e5ae Mon Sep 17 00:00:00 2001 From: nightcityblade Date: Sat, 8 Aug 2026 11:13:03 +0800 Subject: [PATCH] fix(docker): handle unlimited cgroup v2 memory --- deploy/docker/tests/test_utils_memory.py | 32 ++++++++++++++++++++++++ deploy/docker/utils.py | 11 +++++--- 2 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 deploy/docker/tests/test_utils_memory.py diff --git a/deploy/docker/tests/test_utils_memory.py b/deploy/docker/tests/test_utils_memory.py new file mode 100644 index 000000000..4c23227b4 --- /dev/null +++ b/deploy/docker/tests/test_utils_memory.py @@ -0,0 +1,32 @@ +from types import SimpleNamespace + +import psutil +import pytest + +import utils + + +def test_unlimited_cgroup_v2_uses_container_usage(monkeypatch): + values = { + "/sys/fs/cgroup/memory.current": "805306368\n", + "/sys/fs/cgroup/memory.max": "max\n", + } + + class FakeCgroupPath: + def __init__(self, path): + self.path = path + + def exists(self): + return self.path in values + + def read_text(self): + return values[self.path] + + monkeypatch.setattr(utils, "Path", FakeCgroupPath) + monkeypatch.setattr( + psutil, + "virtual_memory", + lambda: SimpleNamespace(total=16 * 1024**3, percent=50.3), + ) + + assert utils.get_container_memory_percent() == pytest.approx(4.6875) diff --git a/deploy/docker/utils.py b/deploy/docker/utils.py index 8f8ecb180..e3c8122b6 100644 --- a/deploy/docker/utils.py +++ b/deploy/docker/utils.py @@ -420,15 +420,20 @@ def get_container_memory_percent() -> float: limit_path = Path("/sys/fs/cgroup/memory/memory.limit_in_bytes") usage = int(usage_path.read_text()) - limit = int(limit_path.read_text()) + raw_limit = limit_path.read_text().strip() # Handle unlimited (v2: "max", v1: > 1e18) - if limit > 1e18: + if raw_limit == "max": import psutil limit = psutil.virtual_memory().total + else: + limit = int(raw_limit) + if limit > 1e18: + import psutil + limit = psutil.virtual_memory().total return (usage / limit) * 100 except: # Non-container or unsupported: fallback to host import psutil - return psutil.virtual_memory().percent \ No newline at end of file + return psutil.virtual_memory().percent