본문으로 건너뛰기

JIT-less V8

· 약 3분
Jakob Gruber ([@schuay](https://twitter.com/schuay))

V8 v7.4는 이제 런타임 실행 코드 메모리를 할당하지 않고 자바스크립트를 실행할 수 있습니다.

기본 설정에서, V8은 실행 가능한 메모리를 런타임에 할당하고 수정하는 능력에 크게 의존합니다. 예를 들어, TurboFan 최적화 컴파일러는 뜨거운 자바스크립트(JS) 함수에 대해 즉석에서 네이티브 코드를 생성하며 대부분의 JS 정규 표현식은 irregexp 엔진에 의해 네이티브 코드로 컴파일됩니다. 런타임에 실행 가능한 메모리를 생성하는 것은 V8의 속도를 높이는 요인 중 하나입니다.

그러나 특정 상황에서는 실행 코드 메모리를 할당하지 않고 V8을 실행하는 것이 바람직할 수 있습니다:

  1. 일부 플랫폼(예: iOS, 스마트 TV, 게임 콘솔)에서는 비권한 앱이 실행 가능한 메모리에 대한 쓰기 접근을 금지하여 V8을 사용할 수 없었습니다.
  2. 실행 코드 메모리에 대한 쓰기를 금지하면 애플리케이션의 공격 표면을 줄일 수 있습니다.

V8의 새로운 JIT-less 모드는 이러한 문제를 해결하기 위한 것입니다. --jitless 플래그로 V8이 시작되면 V8은 실행 가능한 메모리를 런타임 할당 없이 실행됩니다.

작동 방식은 무엇입니까? 기본적으로 V8은 기존 기술을 기반으로 하는 인터프리터 모드로 전환합니다: 모든 JS 사용자 코드는 Ignition 인터프리터를 통해 실행되며, 정규 표현식 패턴 매칭도 같은 방식으로 해석됩니다. 웹어셈블리는 현재 지원되지 않지만, 해석도 가능성 있는 영역에 있습니다. V8의 내장 함수는 여전히 네이티브 코드로 컴파일되지만 더 이상 관리되는 JS 힙의 일부가 아니며, 최근 V8 바이너리에 포함하려는 작업 덕분입니다.

결과적으로 이러한 변화는 V8 힙을 메모리 영역에 대해 실행 권한을 요구하지 않으면서 생성할 수 있게 만들었습니다.

결과

JIT-less 모드는 최적화 컴파일러를 비활성화시키기 때문에 성능 저하를 동반합니다. V8의 성능 특성이 어떻게 변화하는지 확인하기 위해 다양한 벤치마크를 조사했습니다. Speedometer 2.0는 일반 웹 애플리케이션을 대표하며, Web Tooling 벤치마크는 일반적인 JS 개발 도구 세트를 포함하고 있습니다. 또한 Living Room YouTube 앱의 탐색 워크플로우를 시뮬레이트하는 벤치마크도 포함됩니다. 모든 측정은 x64 Linux 데스크탑에서 5번 실행하여 수행되었습니다.

JIT-less vs. 기본 V8. 점수는 V8의 기본 설정에 대해 100으로 정규화되었습니다.

Speedometer 2.0은 JIT-less 모드에서 약 40% 느리게 작동합니다. 성능 저하의 절반은 비활성화된 최적화 컴파일러에 기인할 수 있고 나머지 절반은 원래 디버깅 용도로 의도된 정규 표현식 인터프리터에 의해 발생하며 향후 성능 개선이 이루어질 예정입니다.

Web Tooling 벤치마크는 TurboFan으로 최적화된 코드에서 시간을 더 많이 소비하며, 따라서 JIT-less 모드가 활성화되었을 때 80%의 더 큰 성능 저하가 나타납니다.

마지막으로, Living Room YouTube 앱에서 비디오 재생과 메뉴 탐색을 포함하는 시뮬레이션된 탐색 세션을 측정했습니다. 여기서 JIT-less 모드는 대체로 동등하며 표준 V8 구성에 비해 JS 실행에서 6%의 느림만 나타납니다. 이 벤치마크는 최적화된 코드의 성능이 항상 실제 성능과 관련되지 않음을 보여주며, 많은 상황에서 임베더들은 JIT-less 모드에서도 합리적인 성능을 유지할 수 있습니다.

메모리 소비는 약간만 변경되었으며, 대표적인 웹사이트 세트를 로드할 때 V8 힙 크기가 중간값으로 1.7% 감소했습니다.

제한된 플랫폼 또는 특별한 보안 요구 사항이 있는 임베더들은 이제 V8 v7.4에서 사용할 수 있는 새로운 JIT-less 모드를 고려하기를 권장합니다. 질문과 의견은 언제든지 v8-users 토론 그룹에서 환영합니다.

FAQ

--jitless--no-opt의 차이는 무엇인가요?

--no-opt는 TurboFan 최적화 컴파일러를 비활성화합니다. --jitless는 실행 코드 메모리의 모든 런타임 할당을 비활성화합니다.