v8-isolate

v8 isolate class reference

isolate은 v8엔진의 일종의 복사본으로, 격리된 환경에서 독립적인 병렬 실행이 가능하도록 도와주는 기능이다.

하나의 프로세스 내에서 여러 작업들이 서로 간섭 없이 실행되도록 한다.

특히 서버리스 환경에서 조금 더 작은 단위의 여러 작업들을 병렬 실행하고자 할 때, 프로세스를 여러 격리된 환경으로 분리하는 것에 탁월하다.

실제 Cloudflare Workers 는 모든 동작에 대해 http call 을 통해 서비스를 제공하는데, 이 경우 v8-isolate를 사용하여 경량 작업들을 하나의 인스턴스에서 병렬로 실행하게 만들어두었다. Cloudflare Docs 이와 같은 작업을 통해 서버리스 환경에서 한 번의 콜드스타트 만으로 여러 작업들의 병렬 실행이 가능하도록 하였다.

이러한 구조를 Cloudflare에서는 Nanoservice라고 부른다.

v8-isolate은 내부적인 구현을 통해 독립적인 heap과 Garbage Collector를 가지는 등의 방법을 통해 하나의 독립 개체를 생성한다.

그러나 이는 물리적으로 격리된 환경(컴퓨팅 자원 차원에서의 격리)까지 제공하지는 못하기 때문에, 정말 독립적인 실행 환경을 위해서는 추가적으로 물리적인 격리가 가능한 환경을 만들어 감싸줄 필요가 있다고 생각했다.

해당 기능은 별도의 heap 메모리 공간, 별도의 garbage collector 등 격리된 환경을 조성하게 된다는 것에 매우 큰 장점을 가진다. Javascript에서 비동기 제어를 위해 동작하는 Event Loop 및 Call Stack 또한 별도로 가지게 되며, 이는 단일 스레드 내에 격리 환경을 조성하도록 돕는 기반이된다.

일반적으로는 격리된 환경 조성을 위해서는 새로운 환경 초기화가 필수적으로 다가온다. 혹은 타 언어의 경량 스레드를 사용하게 되는 상황이라면 GC를 공유하거나, 메모리 독립적이지 못한 경우를 맞이하게 된다. V8-isolate을 사용하면 이러한 단점을 보완하며, 아주 작은 오버헤드로 격리환경을 조성할 수 있다.

V8-isolate에서는 메모리 제한을 걸 수 있지만, CPU 점유율을 조정할 수 없다. 만일 조정이 필요하다면 해당 V8 Isolate 단위가 실행되는 스레드 혹은 프로세스를 통해 간접적인 조정이 필요하다. 혹은, 실제 운영체제 단에서의 스레드를 생성하여 CPU 점유율을 명확하게 관리하고, 병렬처리를 진행할 수 있다.

헷갈리는 부분을 조금 더 정리하면 다음과 같다.

  1. 싱글 스레드 환경에서 여러 v8-isolate를 생성하여 비동기 작업을 처리하는 것은 격리된 환경 조성에 탁월하다.
  • v8-isolate는 독립적인 힙과 실행 컨텍스트를 가지므로, 여러 isolate가 하나의 스레드에서 동작하고 있을 때에도 서로 상태나 메모리에 영향을 주지 않는다.
  1. 이 경우 v8-isoalte에 대한 스케쥴링은 부모 스레드에서 담당한다.
  • 여러 isolate가 있을 때, 이 isolate들이 어떤 순서로 또는 어떤 방식으로 실행될지에 대한 결정은 해당 isolate를 실행하는 스레드에 달려 있다.
  • 부모 스레드는 각 isolate 작업을 스케쥴링하고, 필요 시 작업 교체 및 종료를 진행한다.
  1. v8-isolate는 각각 독립적인 실행 컨텍스트를 가지지만, 이벤트 루프와 같이 스케쥴링은 부모가 진행한다.
  • 각 isolate는 자체적인 실행 context(힙과 스택)를 가지지만, 이벤트 루프나 스케쥴링과 관련한 작업은 부모 스레드에서 이뤄진다.
  • 멀티 스레딩 환경에서는 각각이 부모 스레드 없이 동작하기 때문에 각각의 런타임에서 스케쥴링을 진행한다.
  • 또한 비동기 작업의 경우, v8자체의 이벤트 루프나 외부 작업 큐와 연계하여 비동기 작업을 수행한다.