From edc21cc8ae0eb931de78374223db75a2a4823e7a Mon Sep 17 00:00:00 2001 From: fzyzcjy <5236035+fzyzcjy@users.noreply.github.com> Date: Sun, 22 Jun 2025 12:40:02 +0800 Subject: [PATCH] Tiny add logging for GC (#7406) --- python/sglang/srt/managers/scheduler.py | 4 ++++ python/sglang/srt/utils.py | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/python/sglang/srt/managers/scheduler.py b/python/sglang/srt/managers/scheduler.py index 6dbb75182..34bca70db 100644 --- a/python/sglang/srt/managers/scheduler.py +++ b/python/sglang/srt/managers/scheduler.py @@ -140,6 +140,7 @@ from sglang.srt.utils import ( DeepEPMode, DynamicGradMode, broadcast_pyobj, + configure_gc_logger, configure_logger, disable_request_logging, get_available_gpu_memory, @@ -508,6 +509,9 @@ class Scheduler( ) self.init_disaggregation() + if get_bool_env_var("SGLANG_GC_LOG"): + configure_gc_logger() + def maybe_sleep_on_idle(self): if self.idle_sleeper is not None: self.idle_sleeper.maybe_sleep() diff --git a/python/sglang/srt/utils.py b/python/sglang/srt/utils.py index 0b3462567..ac8a55442 100644 --- a/python/sglang/srt/utils.py +++ b/python/sglang/srt/utils.py @@ -2485,3 +2485,28 @@ def dynamic_import(func_path: str): module = importlib.import_module(module_path) func = getattr(module, func_name) return func + + +def configure_gc_logger(): + logger.info("Enable GC Logger") + + import gc + + gc_start_time = {} + + def gc_callback(phase, info): + gen = info.get("generation", "?") + if phase == "start": + gc_start_time[gen] = time.time() + logger.info(f"GC start: Time {time.time()} | Generation {gen}") + elif phase == "stop": + duration = time.time() - gc_start_time.get(gen, time.time()) + collected = info.get("collected", "?") + uncollectable = info.get("uncollectable", "?") + logger.info( + f"GC end: Time {time.time()} | Generation {gen} | " + f"Duration: {duration:.4f}s | Collected: {collected} | Uncollectable: {uncollectable} " + f'{"(LONG GC)" if duration > 0.1 else ""}' + ) + + gc.callbacks.append(gc_callback)