forkd

따뜻한 부모 스냅숏에서 마이크로VM 을 복제하는 샌드박스 런타임

pip install forkd

에이전트를 여러 갈래로 펼칠 때 쓰는 마이크로VM 런타임입니다. 파이어크래커 위에 올려서, 부모 VM 을 한 번만 부팅해 파이썬과 의존성이나 이미 올려 둔 모델까지 넣은 뒤 디스크로 멈춰 둡니다. 자식은 각자 별도 프로세스로 뜨면서 부모의 메모리 이미지를 사적 매핑으로 붙이고, 커널이 페이지 단위 기록 시 복사를 처리하므로 갈라지기 전까지는 부모의 메모리를 공유합니다. 그래서 자식마다 KVM 격리를 유지하면서도 생성 비용이 콜드 부팅보다 프로세스 복제 쪽에 가깝습니다. 100개를 101밀리초에 띄우고 살아 있는 VM 을 56밀리초에 갈라 냅니다.

판단

이럴 때 씁니다

  • 같은 환경에서 에이전트를 수십 갈래로 동시에 펼쳐야 할 때
  • 무거운 런타임이나 모델을 매번 다시 올리는 비용이 클 때
  • 신뢰할 수 없는 코드를 VM 격리로 돌려야 할 때

이럴 땐 쓰지 마세요

  • KVM 이 필요해서 리눅스가 아니면 쓸 수 없습니다
  • 갈래가 하나뿐이면 일반 컨테이너가 더 간단합니다
  • 부모 스냅숏을 만들고 관리하는 절차가 추가로 붙습니다

차별점

  • 콜드 부팅 대신 부모 메모리를 기록 시 복사로 물려받아 생성 비용을 프로세스 복제 수준으로 낮춥니다.
  • 자식마다 별도 프로세스와 KVM 격리를 유지합니다.
  • 살아 있는 VM 을 그 자리에서 갈라 내는 모드가 있습니다.

워크플로

  1. 01KVM 이 켜진 리눅스 호스트를 준비합니다.
  2. 02부모 VM 을 한 번 부팅해 런타임과 의존성을 올린 뒤 스냅숏으로 멈춥니다.
  3. 03그 스냅숏에서 자식을 필요한 수만큼 갈라 냅니다.
  4. 04의존성이 달라지는 지점마다 스냅숏 차이를 따로 태그해 두고 재사용합니다.

주요 명령

명령설명
pip install forkd런타임을 설치합니다.
forkd pull이식 가능한 스냅숏을 받아 옵니다.
forkd snapshot-diff --from py-base --tag py-numpy --exec "pip install numpy==2.0.2"기존 스냅숏 위에 변경분만 얹어 새 태그를 만듭니다.

함정

설치 전에 확인하세요

  • KVM 을 요구하므로 리눅스 호스트가 필요합니다. 맥이나 윈도우에서는 돌지 않습니다.
  • 첫 스냅숏을 받을 때 루트 파일시스템을 한 번 더 내려받습니다. 이후에는 캐시를 씁니다.
  • 자식은 부모의 메모리를 갈라지기 전까지 공유합니다. 부모 스냅숏에 자격 증명이 남아 있으면 모든 자식이 그것을 물려받습니다.

비교

샌드박스 런타임 대부분은 요청마다 컨테이너나 VM 을 새로 띄웁니다. 이쪽은 무거운 준비를 부모에 한 번만 하고 자식은 메모리를 공유하며 시작해서, 같은 환경을 여러 갈래로 펼칠 때 시간 차이가 큽니다. 대신 부모 스냅숏을 설계하고 관리하는 일이 새로 생깁니다.

최근 변경

v0.5.3 까지 CLI 와 문서 정비가 이어졌습니다. 설치 스크립트를 파이프로 실행해도 되는 이유를 문서에 명시했고, 다시 올린 태그가 실패로 잡히지 않도록 배포 단계에서 기존 버전을 건너뛰게 바꿨습니다.