fix: 复核 cgroup 回收优先级漂移

This commit is contained in:
pikastech
2026-07-21 17:23:00 +02:00
parent b3fa6c9d76
commit c268ea00bc
2 changed files with 18 additions and 2 deletions
+17 -1
View File
@@ -166,18 +166,34 @@ process_start_ticks = lambda pid: 987654
read_cgroup_integer = lambda path, name: 6 * 1024 * 1024 * 1024
read_cgroup_memory_stat = lambda path: {"inactive_anon": 2 * 1024 * 1024 * 1024}
candidates = collect_memory_reclaim_candidates()
memory_reclaim_write_attempts = []
original_open = open
def tracked_open(path, *args, **kwargs):
if str(path).endswith("/memory.reclaim"):
memory_reclaim_write_attempts.append(path)
return original_open(path, *args, **kwargs)
open = tracked_open
MEMORY_CONFIG["cgroupReclaim"]["targets"][0]["priority"] = 11
try:
execute_cgroup_reclaim_candidate(candidates[0])
priority_revalidation_error = None
except RuntimeError as error:
priority_revalidation_error = str(error)
MEMORY_CONFIG["cgroupReclaim"]["targets"][0]["priority"] = 10
process_start_ticks = lambda pid: 987655
try:
execute_cgroup_reclaim_candidate(candidates[0])
revalidation_error = None
except RuntimeError as error:
revalidation_error = str(error)
print(json.dumps({"ids": [item["id"] for item in candidates], "swappiness": [item["swappiness"] for item in candidates], "systemd": [item["resolvedSystemdUnit"] for item in candidates], "revalidationError": revalidation_error, "diagnostics": memory_reclaim_scan_diagnostics()}))
print(json.dumps({"ids": [item["id"] for item in candidates], "swappiness": [item["swappiness"] for item in candidates], "systemd": [item["resolvedSystemdUnit"] for item in candidates], "priorityRevalidationError": priority_revalidation_error, "memoryReclaimWriteAttempts": memory_reclaim_write_attempts, "revalidationError": revalidation_error, "diagnostics": memory_reclaim_scan_diagnostics()}))
`);
assert.deepEqual(result.ids, ["cgroup-memory-reclaim:file-pages", "cgroup-memory-reclaim:inactive-anon"]);
assert.deepEqual(result.swappiness, [0, 100]);
assert.deepEqual((result.systemd as Array<Record<string, unknown>>).map((item) => item.unit), ["k3s.service", "k3s.service"]);
assert.deepEqual((result.systemd as Array<Record<string, unknown>>).map((item) => item.startTicks), [987654, 987654]);
assert.equal(result.priorityRevalidationError, "cgroup reclaim candidate no longer matches YAML: priority");
assert.deepEqual(result.memoryReclaimWriteAttempts, []);
assert.equal(result.revalidationError, "cgroup reclaim candidate identity changed before execution");
assert.equal(((result.diagnostics as Record<string, unknown>).cgroupReclaim as Record<string, unknown>).eligibleCount, 2);
assert.match(webObserveSource, /minimum SwapFree reserve/u);
+1 -1
View File
@@ -869,7 +869,7 @@ def execute_cgroup_reclaim_candidate(candidate):
configured = next((item for item in configured_cgroup_reclaim_targets() if item.get("id") == config_id), None)
if configured is None:
raise RuntimeError("cgroup reclaim candidate is no longer present in YAML allowlist")
for key in ["workloadSelector", "systemdUnitSelector", "reclaimBytes", "swappiness", "minimumInactiveAnonBytes", "targetMemAvailableBytes", "minimumSwapFreeBytesAfterReclaim"]:
for key in ["workloadSelector", "systemdUnitSelector", "reclaimBytes", "swappiness", "minimumInactiveAnonBytes", "targetMemAvailableBytes", "minimumSwapFreeBytesAfterReclaim", "priority"]:
if configured.get(key) != candidate.get(key):
raise RuntimeError("cgroup reclaim candidate no longer matches YAML: %s" % key)
_CGROUP_RECLAIM_RUNTIME_INVENTORY = None