서버가 꺼져 있어도 단말 수집은 계속돼야 한다 — 에이전트 시작을 13초 붙잡던 동기 서버 등록 대기 제거

Windows 엔드포인트 에이전트가 시작할 때 첫 SETTINGS 회차를 무한 대기하는데, 그 회차가 서버 등록을 품고 있어 커널 드라이버 로드와 이벤트 수집 시작이 서버 상태에 묶여 있었다. 서버가 꺼진 폐쇄망에서 매 시작마다 접속 실패 비용을 내던 CAgentHelper3::Start 13초 대기를, 대기가 지키던 전제가 이미 앞쪽으로 옮겨졌음을 코드로 확인하고 삭제한 과정.

현상

에이전트 시작 경로의 CAgentHelper3::Start가 첫 SETTINGS 회차를 무한 대기했다. 그 회차가 서버 등록을 품고 있어, 커널 드라이버 로드와 이벤트 수집 시작(INITIALIZED)이 서버 상태에 묶였다.

개발 PC 실측(2026-09-03 11:13):

등록 시도 1: 원격 후보 서버:3181 → 8.1초 실패
4초 대기 → 시도 2: 192.168.0.2:3181 → 성공
CAgentHelper3::Start  13,355.9 ms

서버가 꺼져 있으면 매 시작마다 "후보 수 × 접속 실패 비용"을 낸다. 납품처는 폐쇄망이라 서버 점검·장애 중에도 단말 수집은 계속돼야 한다.

원인

이 대기는 저장소 최초 커밋부터 있던 잔재다. 대기가 지키던 전제들은 이후 보강으로 전부 코드 앞쪽으로 옮겨졌다.

  • 로컬 설정 적용: Create 초입의 ApplySettings("INITIALIZE")가 이미 수행한다.
  • 구독 토픽 구성: Start 초입이 캐시로 이미 구성한다("전송 못 해도 나중에 나가도록"이라는 주석이 남아 있다).
  • 전송: 저장 후 전송 구조(CMessagePool)가 서버 부재를 흡수한다.

첫 회차의 실제 내용도 로컬 값 재적용 33ms + 서버 등록 13초였다. Start 이후 초기화 사슬(CEventCallback2·커널 드라이버·CProcessCallback2)이 서버 신원·서버 설정을 참조하는 곳은 0건이고, 신호(hApplied)를 소비하는 곳도 이 대기 한 곳뿐이다.

조치

  • 대기 블록 삭제(CAgentHelper3.cpp). hApplied 멤버·생성·해제와 Manager 쪽 SetEvent는 잔재로 유지한다.
  • 삭제한 자리에서 IsAgentShutdown()을 확인한 뒤 반환한다(대기가 하던 종료 감지의 대체).

검증 (빌드 후)

조건기대 결과
정상 서버시작 시간·동작이 기존과 동일
첫 후보 실패 후 성공Start가 즉시 반환, 등록은 뒤에서 완료
전 서버 실패수집은 정상 시작, 데이터는 쌓였다가 연결 후 전송
완전 신규 설치 + 서버 부재로컬 수집 지속, 서버가 붙으면 등록·토픽 재구성
종료 중 시작삭제 자리의 종료 가드로 즉시 반환
User.exe첫 SETTINGS push 이후 접속해도 get.SETTINGS로 정상 초기화

핵심은 서버 도달 가능성과 단말의 수집 시작을 분리한 것이다. 서버가 없어도 커널 드라이버 로드와 이벤트 수집은 즉시 시작하고, 등록·토픽 재구성은 서버가 붙는 순간 뒤따른다.

Orange Platform 엔드포인트 에이전트의 시작 경로 분석 리포트입니다.