본문으로 건너뛰기

[hermes-agent] Python 백엔드 콜드 스타트 성능 개선: 14초 GIL 스톨 해결하기

PR 링크: NousResearch/hermes-agent#77814 상태: Merged | 변경: +290 / -6

들어가며

Python 기반의 백엔드 서비스에서 '콜드 스타트(Cold Start)'는 사용자 경험에 큰 영향을 미칩니다. 특히 Windows 환경에서는 .pyc 컴파일과 Windows Defender의 실시간 스캔이 맞물려, 첫 WS(WebSocket) 연결 시점에 무거운 모듈을 임포트하면 이벤트 루프가 최대 14초 이상 멈추는(GIL Stall) 현상이 발생합니다. 본 PR은 이러한 병목 현상을 해결하기 위해 모듈 사전 로딩, 비동기 스레드 활용, 그리고 불필요한 서브프로세스 호출 제거라는 세 가지 전략을 도입했습니다.

코드 분석

1. 모듈 사전 로딩 (hermes_cli/web_server.py)

기존에는 첫 WS 연결 시점에 hermes_cli.gateway 등 무거운 모듈들이 동적으로 임포트되면서 메인 이벤트 루프를 점유했습니다. 이를 방지하기 위해 서버 시작 시점에 해당 모듈들을 미리 로드하도록 변경했습니다.

# Before
def _warm_gateway_module() -> None:
    try:
        import hermes_cli.gateway
    except Exception:
        pass

# After
def _warm_gateway_module() -> None:
    for mod in (
        "hermes_cli.gateway",
        "hermes_cli.auth",
        "hermes_cli.copilot_auth",
        "hermes_cli.runtime_provider",
        "hermes_cli.skin_engine",
        "hermes_cli.inventory",
        "hermes_cli.model_switch",
    ):
        try:
            __import__(mod)
        except Exception:
            pass

2. 불필요한 서브프로세스 호출 방지 (hermes_cli/copilot_auth.py)

사용자가 환경 변수로 토큰을 설정했음에도 불구하고, gh auth token 명령어를 호출하여 최대 5초가 소요되는 서브프로세스를 실행하던 문제를 수정했습니다. 환경 변수가 설정되어 있다면 CLI 호출을 건너뛰어 성능을 최적화했습니다.

# After
    if any_env_var_set:
        logger.debug("Skipping `gh auth token` fallback to honor explicit env-var intent.")
        return "", ""

    token = _try_gh_cli_token()

왜 이게 좋은가

이 최적화는 '이벤트 루프의 비차단(Non-blocking)' 원칙을 철저히 준수합니다.

  1. 성능 개선: Windows 환경에서 발생하는 14초의 지연 시간을 제거했습니다. 특히 asyncio.to_thread를 통해 resolve_skin()과 같은 CPU 집약적인 작업을 별도 스레드로 분리함으로써, 이벤트 루프가 멈추지 않고 즉각적으로 응답할 수 있게 되었습니다.
  2. 의도 명확화: 환경 변수가 설정된 경우 CLI 호출을 강제하지 않음으로써, 사용자의 설정 의도를 존중하고 불필요한 I/O 비용을 줄였습니다.
  3. 교훈: Python의 import 문은 단순히 모듈을 가져오는 것이 아니라 실제 코드를 실행하는 행위입니다. 따라서 성능이 중요한 애플리케이션에서는 무거운 모듈을 이벤트 루프 외부에서 미리 로드(Warm-up)하는 전략이 필수적입니다.

테스트 강화

단순한 소스 코드 검사를 넘어, threading.get_ident()를 사용하여 실제 작업이 메인 스레드가 아닌 별도 스레드에서 수행되는지 검증하는 테스트 코드를 추가하여 재발 방지를 도모했습니다.

참고 자료

⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글