마지막 업데이트 2026-09-16
LiveKit에서 방(room)과 분신(job)은 수업마다 새로 태어납니다. 그런데 워커(worker)는 며칠씩 계속 살아 있습니다. 그 “안 바뀌는 쪽”이 시간이 갈수록 느려지는 것 — 이것이 워커 열화 현상입니다.
왼쪽은 아이들이 들어가는 방. 오른쪽은 방 밖에서 대기하는 선생님들입니다.
각자 얼마나 오래 사는지가 이 이야기의 핵심입니다.
PPI_AGENT_MAX_JOBS_PER_WORKER=2). 분신은 미리 2개를 예열해 둡니다(num_idle_processes=2) — 그래서 아동이 들어오면 바로 말을 걸 수 있습니다.
다섯 걸음이면 끝납니다.
POST /api/livekit/call 이 ppi-{userId}-{avatarId}-{voiceSessionId} 형태로 이름만 만듭니다. 방을 만드는 게 아니라 이름표만 뽑는 단계입니다.RoomAgentDispatch({ agentName: "ppi-agent" }) 를 토큰 안에 넣습니다. 이 쪽지가 나중에 워커를 부르는 유일한 근거입니다.createRoom 호출은 아예 없습니다 — 방의 생사는 전적으로 LiveKit 서버가 관리합니다.assigned job to worker 가 이 순간입니다. 누구에게 갈지는 부하(load)로 정해집니다 — 건강한지는 보지 않습니다.agent-<jobID> 라는 이름으로 방에 참가합니다. 정상이면 여기서 2~4초 안에 첫 목소리가 나옵니다.매번 새것으로 바뀌는 쪽과, 바뀌지 않는 쪽을 나란히 보세요.
문제가 생겨도 다음 수업엔 깨끗한 상태로 다시 시작합니다. 누적될 수가 없습니다.
방을 계속 받아내며 무언가가 쌓입니다. 여기가 느려지면 그 워커에 걸린 수업이 전부 느려집니다.
2026-09-15 17:00~18:00, 한 아동의 19개 세션을 워커별로 갈라 봤습니다.
AW_eg5RnPhNXC2r)증거 ① — 지연이 한 워커에만 몰렸다
세션 첫 응답 지연 — 게스트 로그의 LiveKit session descriptor created → Set latestAiAudioLogIdRef 구간
증거 ② — 그 워커만 시간이 갈수록 느려졌다
워커가 방 배정을 받고 실제로 방에 붙기까지 — assigned job to worker → 같은 jobID의 starting RTC session
z=5.35, p≈8.8e-8. 결정적인 건 절대값이 아니라 같은 시간대에 다른 워커는 그대로인데 이 워커만 악화됐다는 점 — 호스트 전체 부하가 아니라 그 프로세스 개별 문제라는 뜻입니다.
로그에 자주 뜨지만 열화와 무관한 것들입니다.
| 로그에서 보이는 것 | 진짜 의미 | 판정 |
|---|---|---|
| not dispatching agent job since no worker is available 1시간에 586건 |
jobType 이 JT_PUBLISHER/JT_PARTICIPANT 인 노이즈. ppi-agent 는 JT_ROOM 으로만 등록되므로 해당 없음. |
오탐 |
| job ended … JS_FAILED "agent worker left the room" 1시간에 292건 |
수업이 정상 종료될 때 매번 남는 문구. 전 세션 공통 패턴. | 오탐 |
| job ended … error: "" (빈 문자열) | 이건 진짜 사고 — 분신 프로세스가 SIGSEGV(exit -11)로 죽은 것. 열화(느림)가 아니라 소멸(말이 끊김)입니다. |
다른 현상 |
No response from OpenAI within 5 seconds 경고를 띄울 수 있어 로그 문구만으로는 갈리지 않습니다.
jobID 를 CloudWatch /ppi/livekit/{env}/agent 로그그룹에서 조회해 LLM·TTS 구간의 실제 소요를 봐야 합니다.| 무엇 | 위치 |
|---|---|
| 방 이름 생성 | apps/web/app/api/livekit/call/route.ts:71 createRoomName() |
| 워커 호출 쪽지 | apps/web/lib/voice-agent/livekit-token.ts:113 token.roomConfig = RoomConfiguration({ agents: [RoomAgentDispatch] }) |
| 디스패치 이름 | apps/web/lib/voice-agent/livekit-token.ts:24 LIVEKIT_AGENT_NAME (기본 ppi-agent) |
| 워커 1개당 방 수 | apps/livekit-agent/agent.py:344 PPI_AGENT_MAX_JOBS_PER_WORKER (기본 2) |
| 부하 계산식 | apps/livekit-agent/agent.py:355 _ppi_agent_load() — CPU 대신 활성 job 수 기준 |
| 워커 등록 | apps/livekit-agent/agent.py:370 AgentServer(...), :4492 @server.rtc_session(agent_name=PPI_AGENT_NAME) |
| 배포 대상 | ECS/Fargate — cluster·service ppi-livekit-prod-agent |
| 첫 응답 측정 지점 | apps/web/entities/guest-session/model/use-ai-session.ts:291 → :4194 |