원문 캡처 · kapteko.com
원문 캡처 · kapteko.com

한 엔지니어가 Codex CLI 1,000만 개를 서버 한 대에서 실행할 수 있을지 알아보려는 과정에서, LLVM의 경량 오류 격리(Lightweight Fault Isolation, LFI)와 맞춤형 런타임으로 샌드박스 12억 개를 만든 실험을 소개했다. 다만 이 수치는 동시에 실행되는 Codex 인스턴스가 아니라, 최소한의 가상 작업을 순차 처리하는 실험에서 나온 것이며 글에서도 실제 목표를 달성한 것은 아니라고 밝힌다.

처음에는 16 CPU, RAM 100GB, SSD 1TB인 서버에서 리눅스 프로세스 1,000만 개를 돌리는 방안을 살폈다. Rust의 최소 프로그램도 프로세스 하나당 약 70KB의 RAM을 썼다. 글은 그중 커널 페이지 테이블과 스택, 프로세스 정보 등이 큰 비중을 차지해, 빈 프로세스만으로도 메모리 예산을 넘는다고 설명한다.

가상 머신과 gVisor, 컨테이너도 검토했지만, 각각 별도 커널이나 런타임, 격리 기능에 필요한 자원이 추가된다는 점에서 이 실험의 목표와 맞지 않는다고 봤다. 대안으로 제시한 LFI는 어셈블리 코드를 다시 써서 샌드박스의 메모리 접근을 제한하고, 시스템 호출을 호스트 프로세스 안의 함수로 전달한다. 따라서 기존 바이너리를 그대로 쓰는 대신 다시 빌드해야 한다.

일반적인 LFI 런타임으로 샌드박스 100개를 실행했을 때 메모리 사용량은 15MB였다. 글에서 비교한 프로세스 100개의 사용량 7MB보다 오히려 많았다. 런타임의 테이블과 라이브러리, 코드·데이터 등이 추가 메모리를 차지했기 때문이다.

이에 실험자는 특정 벤치마크만을 위해 자체 최소 런타임을 만들었다. 이 런타임은 getpid, print, ppoll 세 시스템 호출만 처리하고, 게스트를 스레드 없이 차례로 실행한다. 이 조건에서 10GB RAM 가상머신에 샌드박스 12억 개를 만들었으며, 생성에는 3.26초가 걸렸다고 보고했다. 모든 게스트를 실행하는 데는 291초가 걸렸고, 초당 처리량은 440만 개였다. 메모리는 샌드박스당 8바이트였으며, 출력에 쓰인 시간을 포함해 실행 시간의 64%는 커널에서 보냈다.

이 결과는 Codex 1,000만 개를 실행할 수 있음을 입증하지 않는다. 글은 실제 적용을 위해 동시 실행, 인터럽트 처리, 스케줄러와 스레드, 메모리 재사용·압축, 스냅샷과 가상 파일 시스템·네트워크, 수백 가지 시스템 호출 구현 등이 더 필요하다고 열거한다. 따라서 이번 수치는 범용 환경에서의 성능 결과라기보다, 극도로 제한된 작업에 맞춘 런타임의 이론적 가능성을 살펴본 예비 실험이다.

실험의 저장소는 AI10M이다. 참고 자료로 LFI 논문, Arca 관련 논문, 유니커널 논문, Nanvix 논문, seL4 백서, 경량 실행 문맥 논문을 제시했다. 구현 및 관련 설명으로는 gVisor, gVisor의 CNCF 기증 소식, Cloudflare Workers 보안 모델, V8의 isolate 설명, LLVM의 LFI 문서, lfi-runtime 저장소도 연결했다. 글은 Firecracker 작동 영상, Unikraft 사례, V8 엔진 관련 설명, Daytona도 언급한다.