에이전트 런타임 서버 셋업
에이전트를 서버에서 상시 구동하면 그 나름대로의 문제가 따라온다. 서버에 달린 RAM은 양이 정해져 있다. 폭주한 프로그램 하나가 남김없이 먹어치우면 리눅스는 패닉에 빠져 프로세스를 거의 무작위로 죽이기 시작한다. 얘가 가끔 SSH 연결처럼 엉뚱한 걸 죽이면 서버 전체가 같이 내려간다. 그래서 욕심 많은 프로세스 하나가 전체를 무너뜨리기 전에 느려지는 선에서 그치도록 방어를 여러 겹 쌓아야 한다.
이 글은 에이전트 런타임 셋업을 다룬다. 에이전트 인터페이스나 추론 얘기가 아니다. 셋은 서로 다르다. Claude를 예로 들면, 에이전트 추론은 Anthropic 서버가 담당하고 에이전트 인터페이스는 휴대폰이어도 되지만, 에이전트 런타임은 Claude 로컬 바이너리(모델이 아니라 프로그램)가 접근할 수 있는 파일 시스템이어야 한다. 에이전트 런타임은 인터페이스 계층과는 분리될 수 있다. 종종 하나지만.
계층
1. 넘칠 때 받아줄 큰 공간 (swap)
RAM이 책상이라면 swap은 옆에 놓인 서류 캐비닛이다. 책상이 가득 차면 잘 안 쓰는 서류가 바닥에 내던져지는 대신 캐비닛으로 옮겨 간다.
서버 SSD에 128GB짜리 swap 파일을 만들어 두었다. RAM보다 느리지만 느린 쪽이 죽는 쪽보다 낫다. 셋업에 함정이 하나 숨어 있는데, 파일을 바이트 그대로 써 내려가는 dd로 만들어야 한다는 점이다. fallocate는 구멍 뚫린 파일을 만들고, 리눅스는 그런 파일을 swap으로 받아주지 않는다.
2. swap 앞단의 압축 버퍼 (zswap)
페이지가 느린 서류 캐비닛으로 가기 전에 리눅스가 먼저 zstd로 압축해 RAM 한구석에 쟁여 둔다. 옷을 상자에 넣기 전에 진공 압축팩으로 부피를 줄이는 셈이다. 스왑된 데이터는 대부분 디스크까지 내려가지도 않아서 속도가 유지된다.
사촌 격인 zram이 아니라 zswap을 고른 이유는 zswap의 사용량이 그걸 유발한 프로세스에 청구되기 때문이다. 이 성질이 4번 계층에서 중요해진다.