Skip to content

Commit ce4102e

Browse files
kvakilnodejs-github-bot
authored andcommitted
deps: V8: cherry-pick 1a782f6543ae
Original commit message: [base] add build flag to use MADV_DONTFORK Embedders like Node.js and Electron expose fork(2)/execve(2) to their users. Unfortunately when the V8 heap is very large, these APIs become rather slow on Linux, due to the kernel needing to do all the bookkeeping for the forked process (in clone's dup_mmap and execve's exec_mmap). Of course, this is useless because the forked child thread will never actually need to access the V8 heap. Add a new build flag v8_enable_private_mapping_fork_optimization which marks all pages allocated by OS::Allocate as MADV_DONTFORK. This improves the performance of Node.js's fork/execve combination by 10x on a 600 MB heap. Fixed: v8:7381 Change-Id: Ib649f774d4a932b41886313ce89acc369923699d Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4602858 Commit-Queue: Michael Lippautz <[email protected]> Reviewed-by: Michael Lippautz <[email protected]> Cr-Commit-Position: refs/heads/main@{#88447} Refs: v8/v8@1a782f6 PR-URL: #48523 Fixes: #25382 Fixes: #14917 Refs: nodejs/performance#93 Refs: nodejs/performance#89 Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: Juan José Arboleda <[email protected]> Reviewed-By: Debadree Chatterjee <[email protected]>
1 parent e7a1fab commit ce4102e

File tree

3 files changed

+21
-1
lines changed

3 files changed

+21
-1
lines changed

common.gypi

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636

3737
# Reset this number to 0 on major V8 upgrades.
3838
# Increment by one for each non-official patch applied to deps/v8.
39-
'v8_embedder_string': '-node.9',
39+
'v8_embedder_string': '-node.10',
4040

4141
##### V8 defaults for Node.js #####
4242

deps/v8/BUILD.gn

+14
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,17 @@ declare_args() {
8383
# Sets -dENABLE_HUGEPAGE
8484
v8_enable_hugepage = false
8585

86+
# Sets -dV8_ENABLE_PRIVATE_MAPPING_FORK_OPTIMIZATION.
87+
#
88+
# This flag speeds up the performance of fork/execve on Linux systems for
89+
# embedders which use it (like Node.js). It works by marking the pages that
90+
# V8 allocates as MADV_DONTFORK. Without MADV_DONTFORK, the Linux kernel
91+
# spends a long time manipulating page mappings on fork and exec which the
92+
# child process doesn't generally need to access.
93+
#
94+
# See v8:7381 for more details.
95+
v8_enable_private_mapping_fork_optimization = false
96+
8697
# Sets -dENABLE_HANDLE_ZAPPING.
8798
v8_enable_handle_zapping = is_asan || is_debug
8899

@@ -971,6 +982,9 @@ config("features") {
971982
if (v8_enable_hugepage) {
972983
defines += [ "ENABLE_HUGEPAGE" ]
973984
}
985+
if (v8_enable_private_mapping_fork_optimization) {
986+
defines += [ "V8_ENABLE_PRIVATE_MAPPING_FORK_OPTIMIZATION" ]
987+
}
974988
if (v8_enable_object_print) {
975989
defines += [ "OBJECT_PRINT" ]
976990
}

deps/v8/src/base/platform/platform-posix.cc

+6
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ void* Allocate(void* hint, size_t size, OS::MemoryPermission access,
158158
int flags = GetFlagsForMemoryPermission(access, page_type);
159159
void* result = mmap(hint, size, prot, flags, kMmapFd, kMmapFdOffset);
160160
if (result == MAP_FAILED) return nullptr;
161+
162+
#if V8_ENABLE_PRIVATE_MAPPING_FORK_OPTIMIZATION
163+
// This is advisory, so we ignore errors.
164+
madvise(result, size, MADV_DONTFORK);
165+
#endif
166+
161167
#if ENABLE_HUGEPAGE
162168
if (result != nullptr && size >= kHugePageSize) {
163169
const uintptr_t huge_start =

0 commit comments

Comments
 (0)