TinyKVM - Varnish 위에서 실행되는 빠른 샌드박스

14 hours ago 2

  • KVM 기반의 단일 프로세스 샌드박스
    • 일반 리눅스 프로그램이나 특정 API를 사용하는 프로그램을 샌드박스에서 실행 가능
  • 하드웨어 가상화를 사용해 네이티브 성능을 제공
  • KVM API의 일부분만 사용 → 코드베이스가 작고 효율적임

TinyKVM의 설계

  • 정적 Linux ELF 프로그램 실행 지원
    • 동적 실행 파일 지원은 추후 추가 예정
    • 외부 HTTP 서버 또는 캐시에대한 액세스를 제공하기 위해 API로 확장도 가능
    • 현재 AMD64(x86_64)에서 작동하며, AArch64(64비트 ARM) 포팅 계획 중
  • Hugepage 지원
    • 게스트 페이지에 hugepage 생성 가능
    • 호스트에서도 hugepage 사용 가능 → 성능 개선 효과
    • 예: 2MB 페이지 할당 시 LLVM 컴파일 성능 5% 증가 확인
  • 빠른 함수 호출
    • 게스트에서 함수 호출 시 오버헤드는 2μs
    • 타이머 없이 실행 시 오버헤드는 1.2μs로 감소
  • 원격 디버깅 지원
    • GDB로 원격 디버깅 가능
    • 디버깅 후 정상적인 프로그램 재개 가능
  • Copy-on-Write 지원
    • 자체 fork 기능 지원 → 메모리 복제 최소화 가능
    • 예: 6GB 모델을 복제할 경우 인스턴스당 260MB 메모리만 필요
  • 빠른 상태 초기화
    • 게스트 상태를 빠르게 리셋 가능 → 보안 강화
    • 요청마다 리셋하면 상태 노출 위험 감소
  • 간소화된 코드베이스
    • KVM API에서 약 42k LOC 사용
    • TinyKVM 자체 코드베이스는 약 9k LOC → 경쟁 솔루션보다 훨씬 작음
    • 예: Wasmtime 350k LOC, FireCracker 165k LOC
  • 정적 페이지 테이블 생성
    • 런타임 중 페이지 테이블 수정 불가 → 보안 강화
    • 페이지 테이블 무결성 체크 수행
  • 분리된 프로세스 컨텍스트
    • KVM 게스트는 별도의 PCID/ASID 사용 → 스펙터(Spectre) 등 추측 실행 공격에 강함
  • 보안 강화된 커널
    • SMEP, SMAP 활성화
    • 사용자 모드에서 CPU 예외 처리 가능

시스템 콜 처리

  • 호스트와의 API 연결
    • SYSCALL/SYSRET 또는 OUT 명령어를 통해 시스템 콜 수행
    • 시스템 콜 수행 시 VM exit 발생 → 약 1μs 소요
    • 작은 호출을 줄이고 큰 입출력 단위의 API 설계 권장

벤치마크

  • VM 호출 오버헤드
    • VM 리셋 시 tail latency 측정
    • 리셋 없이 단순 호출 시 오버헤드는 낮음
  • 메모리 성능
    • 메모리 성능은 정상 수준
    • 예: HTTP 벤치마크에서 초당 1500개 AVIF 인코딩 가능
  • JPEG → AVIF 변환 성능
    • 초당 약 1582개 이미지 변환 가능
    • YUV 변환 경로를 사용해 무손실 변환 가능

빠른 샌드박스 성능의 이유

  • I/O 및 드라이버 미사용
    • I/O, 드라이버, 가상 장치 없음 → 성능 저하 방지
    • CPU 자원만 사용 → 네이티브 속도에 근접
  • Hugepage 최적화
    • hugepage 사용으로 페이지 워크 감소 → 성능 개선
    • 대규모 LLM 워크로드에서 99.7% 네이티브 성능 달성
  • 빠른 VM 호출
    • 게스트에서 함수 호출 시 오버헤드 최소화
    • 네이티브 CPU 속도로 데이터 처리 가능

한계점

  • vCPU 수 감소 불가
    • KVM API에서 vCPU 수 감소 불가능
    • 다중 프로세싱은 여러 VM을 병렬 실행해 해결 가능
  • 리셋 성능 저하 문제
    • VM 상태 리셋 시 성능 저하 발생 가능
    • 하지만 상태 공유 및 복제를 통해 해결 가능

향후 과제

  • Intel TDX 및 AMD SEV 지원 추가
  • AArch64 포팅
  • 메모리 잠금(KVM_MEM_READONLY) 기능 추가 → 보안 강화
  • 사용자 친화적인 API 개선
  • 동적 링크 로딩 지원 추가 → Varnish와 통합 강화

결론

  • TinyKVM은 가장 작고 빠른 샌드박스 솔루션 중 하나임
  • 보안 강화와 성능 최적화를 모두 달성
  • 코드베이스가 작아 유지 보수 용이
  • 오픈 소스 라이브러리로 제공 중 → 관심 있다면 코드 저장소 확인 가능

TinyKVM 저장소

Read Entire Article