Node.js V8 Options

Node.js V8 Build Option

Node.js는 기본적으로 JavaScript Runtime이다. JavaScript Runtime은 JavaScript를 실행시킬수 있는 환경을 뜻하며 코드를 해석하고 실행하는 핵심 역할을 담당한다. Node.js 에서 여러 JavaScript 엔진중에서 구글이 개발한 V8 엔진을 사용하고 있는데, Node.js 빌드시 V8 Option을 전달하여 Customization 할 수 있다.

V8 Option은 Node.js Core코드와 직접적으로 연관이 있는 제어 코드 외 deps/v8 에서 library 빌드 시 전달할 수 있는 옵션으로 나뉜다.

Node.js Options

Lite Mode

V8은 메모리 사용량 보다 성능 기본적으로 초점을 맞추고 있다. 그러한 개발 방향과 다소 반대의 상황에서 사용할 수 있는 옵션으로 기본적인 메모리 사용량을 줄이고 JIT (Just-In-Time) 컴파일을 꺼서 메모리 소비를 더욱 줄인다.

JIT(Just-In-Time) 컴파일은 프로그램을 실행하는 동안 실제로 필요한 코드 부분만 컴파일하는 기술이다. 일반적으로 JavaScript 코드는 한 줄씩 인터프리터에 의해 해석되지만, JIT 컴파일러는 자주 사용되는 함수나 루프 같은 핵심 코드를 미리 컴파일하고 최적화하여 실행 속도를 높인다.

관련 Configuration

configure.pylink
789
790
791
792
793
794
795
parser.add_argument('--v8-lite-mode',
action='store_true',
dest='v8_lite_mode',
default=False,
help='compile V8 in lite mode for constrained environments (lowers V8 '+
'memory footprint, but also implies no just-in-time compilation ' +
'support, thus much slower execution)')

CodeCache 기능

JavaScript 엔진은 CodeCache 기능을 제공한다. CodeCache는 컴파일된 코드를 캐시로 저장하는 공간이며, 반복적으로 사용되는 코드를 저장해두어 빠른 실행을 가능하게 한다. 이는 웹 애플리케이션의 성능을 향상시키는 데 도움이 된다.

관련 Configuration

configure.pylink
626
627
628
629
630
parser.add_argument('--without-node-code-cache',
action='store_true',
dest='without_node_code_cache',
default=None,
help='Turn off V8 Code cache integration.')

Snapshot

Snapshot은 초기 런타임 상태를 저장하고, 이를 나중에 다시 불러와 재사용할 수 있게 해준다. 이로써 애플리케이션의 시작 시간을 단축시키고 초기 로딩 시간을 최적화할 수 있다.

관련 Configuration

configure.pylink
612
613
614
615
616
617
618
619
620
621
622
623
624
parser.add_argument('--write-snapshot-as-array-literals',
action='store_true',
dest='write_snapshot_as_array_literals',
default=None,
help='Write the snapshot data as array literals for readability.'
'By default the snapshot data may be written as string literals on some '
'platforms to speed up compilation.')

parser.add_argument('--without-node-snapshot',
action='store_true',
dest='without_node_snapshot',
default=None,
help='Turn off V8 snapshot integration. Currently experimental.')
configure.pylink
823
824
825
826
827
parser.add_argument('--v8-enable-snapshot-compression',
action='store_true',
dest='v8_enable_snapshot_compression',
default=None,
help='Enable the built-in snapshot compression in V8.')

Pointer Compression

V8 엔진이 JavaScript 객체에 대한 포인터를 저장할 때 사용되는 메모리를 줄이기 위한 최적화 기능이다. 기본적으로 V8는 64비트 포인터를 사용하여 객체를 가리키지만, Pointer Compression을 활성화하면 객체 포인터를 더 작은 크기 (32비트)의 포인터로 압축하여 메모리를 절약할 수 있다. 작은 포인터 크기는 환경에 따라서 CPU 캐시에서 객체를 로드하는 데 더 효율적일 수 있으며, 이로 인해 더 빠른 실행 속도를 얻을 수도 있다. 다만 이 옵션을 크면 주소공간이 4GB로 제한되며 따라서 max heap 크기도 그 크기로 한정된다.

관련 Configuration

configure.pylink
488
489
490
491
492
parser.add_argument('--experimental-enable-pointer-compression',
action='store_true',
dest='enable_pointer_compression',
default=None,
help='[Experimental] Enable V8 pointer compression (limits max heap to 4GB and breaks ABI compatibility)')

Runtime V8 Options

Node.js 실행시점에도 V8 동작에 관한 세부 설정을 할 수 있는데 이러한 옵션을 빌드 시점에 default로 적용할 수 도 있다. 전체옵션을 보고싶다면 아래와 같이 실행하면 된다.

1
node --v8-options

관련 Configuration

configure.pylink
500
501
502
503
parser.add_argument('--v8-options',
action='store',
dest='v8_options',
help='v8 options to pass, see `node --v8-options` for examples.')

References

Share