chore(perception): trace Python GC pauses
This commit is contained in:
@@ -1,15 +1,14 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import importlib.util
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
from k1link.perception.detector import DetectorFrameTiming
|
||||
from k1link.perception.recorded_source import DecodedFrameTiming
|
||||
|
||||
REPOSITORY_ROOT = Path(__file__).resolve().parents[1]
|
||||
RUNNER_PATH = (
|
||||
REPOSITORY_ROOT / "experiments/perception/run_m48s_reference_graph_shadow_worker.py"
|
||||
)
|
||||
RUNNER_PATH = REPOSITORY_ROOT / "experiments/perception/run_m48s_reference_graph_shadow_worker.py"
|
||||
SPEC = importlib.util.spec_from_file_location("m48s_timed_shadow_runner", RUNNER_PATH)
|
||||
assert SPEC is not None and SPEC.loader is not None
|
||||
RUNNER = importlib.util.module_from_spec(SPEC)
|
||||
@@ -81,3 +80,24 @@ def test_pipeline_timing_metrics_preserve_single_pass_stage_breakdown() -> None:
|
||||
assert metrics["graph_unattributed_ms"]["maximum"] == 6.0
|
||||
assert metrics["maximum_graph_sequence"] == 3
|
||||
assert metrics["additional_inference_passes"] == 0
|
||||
|
||||
|
||||
def test_gc_pause_telemetry_attributes_collection_to_active_stage() -> None:
|
||||
telemetry = RUNNER.GcPauseTelemetry()
|
||||
telemetry.enter_stage("rolling", 3928)
|
||||
telemetry._observe("start", {"generation": 2})
|
||||
time.sleep(0.001)
|
||||
telemetry._observe(
|
||||
"stop",
|
||||
{"generation": 2, "collected": 17, "uncollectable": 0},
|
||||
)
|
||||
telemetry.exit_stage()
|
||||
|
||||
summary = RUNNER._gc_telemetry_summary(telemetry.events)
|
||||
|
||||
assert summary["event_count"] == 1
|
||||
assert summary["pipeline_attributed_event_count"] == 1
|
||||
assert summary["maximum_event"]["generation"] == 2
|
||||
assert summary["maximum_event"]["stage_id"] == "rolling"
|
||||
assert summary["maximum_event"]["sequence"] == 3928
|
||||
assert summary["maximum_event"]["duration_ms"] >= 1.0
|
||||
|
||||
Reference in New Issue
Block a user