동시에 몇 개 돌릴까

동시성 설정값이 없는 이유

"동시 실행 3개까지" 같은 칸을 찾고 계신다면 없습니다. 동시에 도는 세션 수의 천장이 곧 워커 개수입니다. 워커가 하나면 큐에 티켓이 아무리 쌓여도 한 번에 한 세션이고, 둘이면 둘입니다.

늘리는 방법은 워커 §워커 생성 한 번에 있습니다. 화면에서 누르면 끝납니다.

워커 락 — 한 번에 티켓 1건

워커는 동기 프로세스입니다. 한 번에 한 가지 일만 한다는 뜻이라, 잡은 티켓의 세션이 끝날 때까지 다음 티켓을 잡지 않습니다.

cron은 30초마다 그 워커를 부르지만, 앞 실행이 아직 세션을 쥐고 있으면 이번 호출은 그냥 넘어갑니다. 워커 락이 그 자리를 막기 때문입니다. 락은 "이 워커는 지금 일하는 중"이라고 걸어 두는 표시고, 덕분에 두 실행이 같은 티켓을 동시에 물 일도 한 워커가 세션 둘을 띄울 일도 없습니다.

w1이 티켓 하나를 30분 물고 있어도 w2는 그동안 다른 티켓을 집습니다. 워커 여럿을 두는 값이 정확히 그것입니다.

세션이 무한정 붙잡는 것도 막혀 있습니다. 기본 5400초를 넘기면 세션을 끊고 티켓은 대기로 돌아갑니다. 그다음 호출에서 같은 워커든 다른 워커든 다시 집습니다. 그 값을 바꾸는 것은 워커 환경변수TICKET_MAXRUN입니다.

워커 수보다 낮아지는 두 자리

워커가 다섯인데 세 개만 돌고 있다면 둘 중 하나입니다. 큐에 후보가 없거나, 아래 게이트에 걸렸습니다.

  • 페르소나 상한. 페르소나 §디스패치 정책의 상한입니다. 2로 두면 그 페르소나 티켓이 열 건 밀려 있어도 동시에 두 건까지만 돕니다. 상한에 걸린 워커는 다른 페르소나의 다음 후보로 넘어가므로, 한 페르소나가 막혔다고 나머지가 굶지는 않습니다.
  • 우선순위 1. 유효 우선순위가 1인 티켓은 진행중이 0건일 때만 후보입니다. 다른 티켓이 하나도 안 도는 조용한 때에만 집으라는 뜻이라, 워커를 여럿 켜 두면 오히려 늦게 돕니다. 급한 일에 1을 쓰지 마세요.

둘 다 로그에 SKIP 한 줄로 남습니다. SKIP 페르소나 상한 <이름> 2/2, SKIP 우선순위 1 <해시> — 진행중 3건처럼 사유가 그대로 적혀 있습니다. 워커 화면의 마지막 활동을 펼치면 왜 안 물어갔는지 그 자리에서 보입니다.

토큰과 충돌 — 늘리면 같이 늘어나는 것

워커를 늘리면 처리량만 늘어나지 않습니다.

  • 토큰. 워커 다섯이 동시에 돌면 토큰도 다섯 배로 나갑니다. 한도는 머신·계정당 하나라 워커 전원이 그 한 통을 나눠 씁니다. 워커별 한도 같은 것은 세상에 없습니다. 지금 얼마나 썼고 얼마나 남았는지는 화면 맨 아래 토큰 status bar에 있습니다(화면 소개 참고).
  • 같은 파일을 동시에 건드릴 위험. 서로 다른 티켓이라도 같은 소스 파일이나 공유 dev DB를 같이 밟을 수 있습니다(동시 4세션이 컬럼을 드롭한 사례가 있습니다). 워커마다 git 워크트리가 따로인 것이 소스 쪽은 갈라 주지만, 데이터베이스나 외부 서비스는 갈라지지 않습니다. 엔진이 막지 않는 영역이고, 몇 개를 둘지는 그 위험을 알고 사람이 정합니다.

토큰은 같은 일을 직접 하실 때보다 더 나갈 수 있습니다. 세션이 뜰 때마다 프롬프트가 처음부터 다시 조립되기 때문입니다. 페르소나 프로필과 프로토콜 전문이 매번 새로 실리고, 세션은 티켓 파일도 그 자리에서 처음 읽습니다(페르소나 §프롬프트 조립 순서). 사람이 한 대화를 이어 가면 그 맥락은 한 번만 실립니다. 티켓 열 건은 열 번 싣습니다. 티켓을 끝낼 때도 한 번 더 붙습니다. 세션은 남길 메모리가 있는지 보고, 아카이브 티켓이 따로 하나 더 돌면서 그만큼 더 읽고 더 씁니다(아카이빙과 온톨로지). 워커 수만큼 이 전부가 동시에 일어납니다.

크기는 이렇습니다. 워커 일곱을 쉬지 않고 최대로 돌렸을 때 평균 분당 2.0M 토큰이 나갔습니다. 직접 하시는 쪽은 재 본 적이 없어서 몇 배인지는 적지 않습니다.

둘부터 시작해서 대기 레인이 안 줄면 하나씩 늘리세요. 큐가 비어 있는데 워커만 다섯이면 아무 이득도 없이 cron만 다섯 배로 돕니다.

다음은 페르소나입니다.