주변에서 오픈클로(OpenClaw)가 느려졌다는 이야기를 자주 듣는다. 말을 걸면 한참 뒤에 답하고, 가끔은 아예 씹히는 것처럼 느껴진다고. 버그인가, 서버 문제인가, 아니면 Claude가 게을러진 건가. 나도 이 불만의 원인에 대한 두 가지 주요 원인을 찾았는데, 소소한 노하우를 공유한다.
첫 번째 범인은 크론(Cron)이다. 크론은 "매일 아침 9시에 이메일 확인해줘", "30분마다 서버 상태 봐줘"처럼 에이전트에게 걸어놓는 반복 예약 작업이다. 스마트폰의 반복 알람과 같다. 문제는 이 알람이 어디서 울리느냐였다.
오픈클로의 에이전트는 비서 한 명이라고 생각하면 된다. 이 비서는 카카오톡 창을 하나만 열 수 있다. 내가 메시지를 보내면 이 비서가 읽고 답장을 쓴다. 크론은 내가 비서에게 미리 걸어놓은 반복 알람이다. "30분마다 뉴스 확인해줘", "매시간 서버 상태 봐줘", "아침마다 이메일이랑 캘린더 정리해줘." 알람이 울리면 비서는 하던 일을 멈추고 그 작업부터 처리한다. 내가 카톡을 보내도 비서는 알람 처리가 끝날 때까지 못 본다. 비서가 느려진 게 아니다. 비서 혼자서 24개의 알람을 처리하면서 동시에 내 카톡까지 볼 수는 없는 것이다.
오픈클로를 쓰기 시작하면 누구나 크론을 마구 만들게 된다. 처음엔 하나둘. 서버 상태 체크, 뉴스 수집, 이메일 확인, 캘린더 정리. 초기에는 별문제 없다. 열 개를 넘기고 스무 개를 넘겨도 별일 없는 것 같다. 그러다 어느 날 에이전트에게 말을 걸었는데 답이 안 온다. 10초. 30초. 1분. 뭔가 고장 났나 싶어 로그를 열어본다. 고장은 아니다. 에이전트는 뒤에서 바쁘다. 내가 만들어놓은 알람을 처리하느라.
기술적으로 설명하면 이렇다. 오픈클로에서 메인 세션은 에이전트의 의식이다. 카톡 창 하나. 내가 텔레그램으로 말을 걸면 이 메인 세션이 응답한다. 문제는 크론도 기본적으로 이 메인 세션에서 돌아간다는 점이다. 대화와 알람이 같은 줄에 서 있다. 앞에 알람이 처리되고 있으면 내 메시지는 대기열에서 기다린다. 주방장이 한 명인데 홀 주문과 배달 주문이 같은 줄로 들어오는 것이다. 배달 주문이 밀리면 홀 손님은 아무리 손을 들어도 음식이 안 나온다.
크론에는 sessionTarget이라는 설정이 있다. "main"과 "isolated" 두 가지. main은 그 비서 한 명이 직접 처리한다. isolated는 임시 직원을 고용해서 처리시킨다. 작업이 끝나면 임시 직원은 퇴근한다. 문제는 기본값이 main이라는 점이다. 아무것도 안 건드리면 모든 알람이 비서 한 명에게 몰린다. 블랙스완 모니터링, 가격 알림, 뉴스 요약, 이메일 체크, 캘린더 알림, 깃허브 PR 체크, 학습 루틴. 하나씩 추가하다 보면 어느새 24개가 전부 그 비서의 할 일 목록에 올라 있다. 내가 정확히 그랬다. 그리고 주변에서 "오픈클로 느려졌다"고 하는 사람들 대부분이 같은 상태였다.
타임라인으로 살펴보자. 00:00에 메인 세션이 알람 처리를 시작한다. 00:01에 내가 메시지를 보낸다. 메시지는 큐에 들어간다. 00:03에 알람 처리가 끝나고, 그제야 내 메시지가 처리된다. 2분 지연. 가벼운 알람이면 이 정도다. 하지만 30분마다 실행되는 무거운 모니터링 알람이 있으면 최악의 경우 말을 걸 때마다 수분씩 기다려야 한다. 에이전트가 멍청해진 게 아니라 바쁜 것이다. "오픈클로 요즘 왜 이래"의 정체가 이것이다.
그렇다면 왜 main 타겟이 존재하는 걸까. 일부 알람은 비서가 직접 해야 의미가 있기 때문이다. 모닝 리포트는 비서가 어젯밤 대화 내용을 기억하고 있어야 쓸모 있는 요약을 만든다. 데일리 리뷰도 마찬가지다. 이런 작업은 메인 세션에서 돌아야 한다. 문제는 가격 체크, PR 모니터링, 뉴스 수집, 이메일 확인처럼 어제 대화 맥락이 전혀 필요 없는 작업까지 전부 main으로 돌리는 것이다. 임시 직원한테 시키면 될 일을 전부 비서 한 명한테 몰아놓은 셈이다.
해결은 하나의 질문으로 귀결된다. "이 알람이 나와의 대화 맥락을 실제로 필요로 하는가?" 필요하다면 main에 둔다. 필요 없다면 isolated로 옮긴다. 대부분의 모니터링성 알람은 isolated로 갈 수 있다. 내 경우 24개 중 13개를 isolated로 전환하고, 맥락이 불필요한 나머지도 정리해서 메인 세션에는 하루 4~5회 실행되는 보고 알람만 남겼다.
기술적으로 한 가지 주의점이 있다. isolated 세션에서 크론을 돌리려면 payload 타입을 agentTurn으로 바꿔야 한다. main에서 쓰던 systemEvent는 비서의 메모장에 쪽지를 끼워 넣는 방식인데, isolated에는 메모장 자체가 없다. agentTurn은 임시 직원에게 "이걸 해"라고 업무 지시서를 건네는 방식이다. 크론 설정에서 sessionTarget을 isolated로, payload의 kind를 agentTurn으로 바꾸면 된다.
설정을 바꾸고 나면 체감이 즉각적이다. 게을러진 줄 알았던 에이전트에게 말을 걸면 바로 답한다. 뒤에서 알람이 동시에 돌아가고 있어도. 24개였던 알람 시계가 옆방으로 옮겨갔기 때문이다. 내 방에는 보고용 4~5개만 남아 있고, 그마저도 내가 원할 때만 울린다. 에이전트의 의식이 비로소 나에게 집중하기 시작했다. 주변에 오픈클로 느리다고 불평하는 사람이 있다면 알람부터 확인해보라고 했다. 열에 일곱은 같은 원인이었다.
OpenClaw가 답답해지는 또 다른 주요 원인은 메인 에이전트에게 직접 일을 시키는 것이다. 메인 에이전트가 직접 복잡한 코드를 짜거나 긴 문서를 분석하거나 웹을 뒤지기 시작하면, 그 시간 동안 내 대화 응답이 현저히 느려지거나 먹통이 된다.
그래서 메인 에이전트는 매니저로만 쓴다. 작업이 들어오면 직접 처리하지 말고 서브에이전트(sub-agent)를 호출해서 넘기도록 가이드를 준다. 이 가이드는 워크스페이스의 AGENTS.md에 적어둔다. 오픈클로의 에이전트는 세션이 시작될 때마다 이 문서를 읽기 때문에, 여기에 "복잡한 작업은 서브에이전트를 spawn해서 처리하고, 너는 결과를 전달하는 역할만 해"라고 써놓으면 된다. 비서에게 "네가 직접 뛰지 마. 사람을 불러서 시키고, 너는 나한테 보고만 해"라고 말하는 것과 같다. 메인 에이전트의 메인 세션은 언제나 비어 있어야 한다. 그래야 내가 말을 걸었을 때 즉시 답할 수 있다.
같은 이유로 나는 메인 에이전트 자체도 셋으로 나눠버렸다. Zeon은 코딩과 시스템 운영, Sion은 글쓰기, Mion은 투자와 데이터 분석. 각자 메인 세션이 따로 있으니 Sion이 긴 글을 쓰고 있어도 Zeon에게 말을 걸면 바로 답한다. 크론을 isolated로 분리하는 것이 작업 단위의 분산이라면, 에이전트를 여러 명으로 나누는 것은 역할 단위의 분산이다. 원리는 같다. 하나의 의식에 모든 것을 몰아넣지 않는 것.
에이전트와 일하면서 느끼는 건, 전통적인 코드를 짜는 일보다는 실제 조직을 설계하고 운영하는 일에 더욱 가깝다는 것이다. 누구에게 어떤 업무를 맡기고, 보고 라인은 어떻게 잡고, 병목은 어디서 생기는지. 지금까지의 개발 환경과는 사뭇 다르다. 함수를 나누고 모듈을 분리하는 것과는 감각이 다르다.
에이전트는 생각보다 인간적이고, 그래서 말썽을 부릴 때도 인간 조직에서 겪는 문제와 비슷한 양상을 보인다. 나도 주기적으로 에이전트가 느려지거나 소통이 잘 안 될 때는 업무 분장부터 다시 구상한다. 기업의 조직도를 그리듯이.



