fix: 复核 cgroup 回收优先级漂移
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user