forkd
따뜻한 부모 스냅숏에서 마이크로VM 을 복제하는 샌드박스 런타임
pip install forkd에이전트를 여러 갈래로 펼칠 때 쓰는 마이크로VM 런타임입니다. 파이어크래커 위에 올려서, 부모 VM 을 한 번만 부팅해 파이썬과 의존성이나 이미 올려 둔 모델까지 넣은 뒤 디스크로 멈춰 둡니다. 자식은 각자 별도 프로세스로 뜨면서 부모의 메모리 이미지를 사적 매핑으로 붙이고, 커널이 페이지 단위 기록 시 복사를 처리하므로 갈라지기 전까지는 부모의 메모리를 공유합니다. 그래서 자식마다 KVM 격리를 유지하면서도 생성 비용이 콜드 부팅보다 프로세스 복제 쪽에 가깝습니다. 100개를 101밀리초에 띄우고 살아 있는 VM 을 56밀리초에 갈라 냅니다.
판단
이럴 때 씁니다
- 같은 환경에서 에이전트를 수십 갈래로 동시에 펼쳐야 할 때
- 무거운 런타임이나 모델을 매번 다시 올리는 비용이 클 때
- 신뢰할 수 없는 코드를 VM 격리로 돌려야 할 때
이럴 땐 쓰지 마세요
- KVM 이 필요해서 리눅스가 아니면 쓸 수 없습니다
- 갈래가 하나뿐이면 일반 컨테이너가 더 간단합니다
- 부모 스냅숏을 만들고 관리하는 절차가 추가로 붙습니다
차별점
- 콜드 부팅 대신 부모 메모리를 기록 시 복사로 물려받아 생성 비용을 프로세스 복제 수준으로 낮춥니다.
- 자식마다 별도 프로세스와 KVM 격리를 유지합니다.
- 살아 있는 VM 을 그 자리에서 갈라 내는 모드가 있습니다.
워크플로
- 01KVM 이 켜진 리눅스 호스트를 준비합니다.
- 02부모 VM 을 한 번 부팅해 런타임과 의존성을 올린 뒤 스냅숏으로 멈춥니다.
- 03그 스냅숏에서 자식을 필요한 수만큼 갈라 냅니다.
- 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 와 문서 정비가 이어졌습니다. 설치 스크립트를 파이프로 실행해도 되는 이유를 문서에 명시했고, 다시 올린 태그가 실패로 잡히지 않도록 배포 단계에서 기존 버전을 건너뛰게 바꿨습니다.