node/tools/v8_gypfiles/features.gypi
Keyhan Vakil 7eafd2f7e8 child_process: improve spawn performance on Linux
Speed up child_process.spawn by enabling the new V8 build flag which
makes fork/exec faster.

Here are the results of running the existing benchmark. Note that this
optimization helps more for applications with larger heaps, so this is
somewhat of an underestimate of the real world performance benefits.

```console
$ ./node benchmark/compare.js --runs 15 \
        --new ./node \
        --old ~/node-v20/out/Release/node \
        --filter params child_process > cpr
$ node-benchmark-compare cpr
                                 confidence improvement  (***)
methodName='exec' n=1000                ***     60.84 % ±5.43%
methodName='execFile' n=1000            ***     53.72 % ±3.33%
methodName='execFileSync' n=1000        ***      9.10 % ±0.84%
methodName='execSync' n=1000            ***     10.44 % ±0.97%
methodName='spawn' n=1000               ***     53.10 % ±2.90%
methodName='spawnSync' n=1000           ***      8.64 % ±1.22%

  0.01 false positives, when considering a 0.1% risk acceptance (***)
```

Fixes: https://github.com/nodejs/node/issues/25382
Fixes: https://github.com/nodejs/node/issues/14917
Refs: https://github.com/nodejs/performance/issues/93
Refs: https://github.com/nodejs/performance/issues/89
PR-URL: https://github.com/nodejs/node/pull/48523
Refs: 1a782f6543
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com>
Reviewed-By: Debadree Chatterjee <debadree333@gmail.com>
2023-06-24 17:34:44 +00:00

509 lines
17 KiB
Python

# Copyright 2013 the V8 project authors. All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# Compile time controlled V8 features.
{
'variables': {
'v8_target_arch%': '<(target_arch)',
'v8_current_cpu%': '<(target_arch)',
# Emulate GN variables
# https://chromium.googlesource.com/chromium/src/build/+/556c524beb09c332698debe1b47b065d5d029cd0/config/BUILDCONFIG.gn#269
'conditions': [
['OS == "win" or OS == "winuwp"', {
'is_win': 1,
}, {
'is_win': 0,
}],
['OS == "fuchsia"', {
'is_fuchsia': 1,
}, {
'is_fuchsia': 0,
}],
['OS=="android"', { # GYP reverts OS to linux so use `-D OS=android`
'is_android': 1,
}, {
'is_android': 0,
}],
# flattened (!is_win && !is_fuchsia) because of GYP evaluation order
['not (OS == "win" or OS == "winuwp") and not (OS == "fuchsia")', {
'is_posix': 1,
}, {
'is_posix': 0,
}],
['component and "library" in component', {
'is_component_build': 1,
}, {
'is_component_build': 0,
}],
['OS == "win" or OS == "mac"', {
# Sets -DENABLE_SYSTEM_INSTRUMENTATION. Enables OS-dependent event tracing
'v8_enable_system_instrumentation': 1,
}, {
'v8_enable_system_instrumentation': 0,
}],
['OS == "win"', {
'v8_enable_etw_stack_walking': 1,
}, {
'v8_enable_etw_stack_walking': 0,
}],
['OS=="linux"', {
# Sets -dV8_ENABLE_PRIVATE_MAPPING_FORK_OPTIMIZATION.
#
# This flag speeds up the performance of fork/execve on Linux systems for
# embedders which use it (like Node.js). It works by marking the pages that
# V8 allocates as MADV_DONTFORK. Without MADV_DONTFORK, the Linux kernel
# spends a long time manipulating page mappings on fork and exec which the
# child process doesn't generally need to access.
#
# See v8:7381 for more details.
'v8_enable_private_mapping_fork_optimization': 1,
}, {
'v8_enable_private_mapping_fork_optimization': 0,
}],
],
'is_debug%': 0,
# Variables from BUILD.gn
# Set to 1 to enable DCHECKs in release builds.
'dcheck_always_on%': 0,
# Sets -DV8_ENABLE_FUTURE.
'v8_enable_future%': 0,
# Sets -DVERIFY_HEAP.
'v8_enable_verify_heap%': 0,
# Sets -DVERIFY_PREDICTABLE
'v8_enable_verify_predictable%': 0,
# Enable compiler warnings when using V8_DEPRECATED apis.
'v8_deprecation_warnings%': 0,
# Enable compiler warnings when using V8_DEPRECATE_SOON apis.
'v8_imminent_deprecation_warnings%': 0,
# Allows the embedder to add a custom suffix to the version string.
'v8_embedder_string%': '',
# Sets -dENABLE_DISASSEMBLER.
'v8_enable_disassembler%': 0,
# Sets the number of internal fields on promise objects.
'v8_promise_internal_field_count%': 0,
# Sets -dENABLE_GDB_JIT_INTERFACE.
'v8_enable_gdbjit%': 0,
# Sets -dENABLE_HUGEPAGE
'v8_enable_hugepage%': 0,
# Sets -dENABLE_VTUNE_JIT_INTERFACE.
'v8_enable_vtunejit%': 0,
# Currently set for node by common.gypi, avoiding default because of gyp file bug.
# Should be turned on only for debugging.
#'v8_enable_handle_zapping%': 0,
# Enable fast mksnapshot runs.
'v8_enable_fast_mksnapshot%': 0,
# Enable the registration of unwinding info for Windows/x64 and ARM64.
'v8_win64_unwinding_info%': 1,
# Enable code comments for builtins in the snapshot (impacts performance).
'v8_enable_snapshot_code_comments%': 0,
# Enable native counters from the snapshot (impacts performance, sets
# -dV8_SNAPSHOT_NATIVE_CODE_COUNTERS).
# This option will generate extra code in the snapshot to increment counters,
# as per the --native-code-counters flag.
'v8_enable_snapshot_native_code_counters%': 0,
# Use pre-generated static root pointer values from static-roots.h.
'v8_enable_static_roots%': 0,
# Enable code-generation-time checking of types in the CodeStubAssembler.
'v8_enable_verify_csa%': 0,
# Enable pointer compression (sets -dV8_COMPRESS_POINTERS).
'v8_enable_pointer_compression%': 0,
'v8_enable_31bit_smis_on_64bit_arch%': 0,
# Sets -dV8_SHORT_BUILTIN_CALLS
'v8_enable_short_builtin_calls%': 0,
# Sets -dOBJECT_PRINT.
'v8_enable_object_print%': 0,
# Sets -dV8_TRACE_MAPS.
'v8_enable_trace_maps%': 0,
# Sets -dV8_ENABLE_CHECKS.
'v8_enable_v8_checks%': 0,
# Sets -dV8_TRACE_IGNITION.
'v8_enable_trace_ignition%': 0,
# Sets -dV8_TRACE_FEEDBACK_UPDATES.
'v8_enable_trace_feedback_updates%': 0,
# Sets -dV8_ATOMIC_OBJECT_FIELD_WRITES and turns all field write operations
# into relaxed atomic operations.
'v8_enable_atomic_object_field_writes%': 1,
# Has no effect in Node.js. Here for completeness with V8's config.
'v8_enable_concurrent_marking%': 1,
# Enables various testing features.
'v8_enable_test_features%': 0,
# With post mortem support enabled, metadata is embedded into libv8 that
# describes various parameters of the VM for use by debuggers. See
# tools/gen-postmortem-metadata.py for details.
'v8_postmortem_support%': 0,
# Use Siphash as added protection against hash flooding attacks.
'v8_use_siphash%': 0,
# Use Perfetto (https://perfetto.dev) as the default TracingController. Not
# currently implemented.
'v8_use_perfetto%': 0,
# Controls the threshold for on-heap/off-heap Typed Arrays.
'v8_typed_array_max_size_in_heap%': 64,
# Enable sharing read-only space across isolates.
# Sets -DV8_SHARED_RO_HEAP.
'v8_enable_shared_ro_heap%': 0,
# Enable lazy source positions by default.
'v8_enable_lazy_source_positions%': 1,
# Enable third party HEAP library
'v8_enable_third_party_heap%': 0,
# Libaries used by third party heap
'v8_third_party_heap_libs%': [],
# Source code used by third party heap
'v8_third_party_heap_files%': [],
# Disable write barriers when GCs are non-incremental and
# heap has single generation.
'v8_disable_write_barriers%': 0,
# Redirect allocation in young generation so that there will be
# only one single generation.
'v8_enable_single_generation%': 0,
# Use token threaded dispatch for the regular expression interpreter.
# Use switch-based dispatch if this is false.
'v8_enable_regexp_interpreter_threaded_dispatch%': 1,
# Disable all snapshot compression.
'v8_enable_snapshot_compression%': 0,
# Enable control-flow integrity features, such as pointer authentication
# for ARM64.
'v8_control_flow_integrity%': 0,
# Enable V8 zone compression experimental feature.
# Sets -DV8_COMPRESS_ZONES.
'v8_enable_zone_compression%': 0,
# Enable the experimental V8 sandbox.
# Sets -DV8_ENABLE_SANDBOX.
'v8_enable_sandbox%': 0,
# Experimental feature for collecting per-class zone memory stats.
# Requires use_rtti = true
'v8_enable_precise_zone_stats%': 0,
# Experimental feature that uses SwissNameDictionary instead of NameDictionary
# as the backing store for all dictionary mode objects.
'v8_enable_swiss_name_dictionary%': 0,
# Experimental feature for tracking constness of properties in non-global
# dictionaries. Enabling this also always keeps prototypes in dict mode,
# meaning that they are not switched to fast mode.
# Sets -DV8_DICT_PROPERTY_CONST_TRACKING
'v8_dict_property_const_tracking%': 0,
# Allow for JS promise hooks (instead of just C++).
'v8_enable_javascript_promise_hooks%': 0,
# Enable allocation folding globally (sets -dV8_ALLOCATION_FOLDING).
# When it's disabled, the --turbo-allocation-folding runtime flag will be ignored.
'v8_enable_allocation_folding%': 1,
# Enable runtime verification of heap snapshots produced for devtools.
'v8_enable_heap_snapshot_verify%': 0,
# Enable global allocation site tracking.
'v8_allocation_site_tracking%': 1,
'v8_scriptormodule_legacy_lifetime%': 1,
# Change code emission and runtime features to be CET shadow-stack compliant
# (incomplete and experimental).
'v8_enable_cet_shadow_stack%': 0,
# Compile V8 using zlib as dependency.
# Sets -DV8_USE_ZLIB
'v8_use_zlib%': 1,
# Variables from v8.gni
# Enable ECMAScript Internationalization API. Enabling this feature will
# add a dependency on the ICU library.
'v8_enable_i18n_support%': 1,
# Lite mode disables a number of performance optimizations to reduce memory
# at the cost of performance.
# Sets --DV8_LITE_MODE.
'v8_enable_lite_mode%': 0,
# Enable the Turbofan compiler.
# Sets -dV8_ENABLE_TURBOFAN
'v8_enable_turbofan%': 1,
# Enable the Maglev compiler.
# Sets -dV8_ENABLE_MAGLEV
'v8_enable_maglev%': 0,
# Include support for WebAssembly. If disabled, the 'WebAssembly' global
# will not be available, and embedder APIs to generate WebAssembly modules
# will fail. Also, asm.js will not be translated to WebAssembly and will be
# executed as standard JavaScript instead.
# Sets -dV8_ENABLE_WEBASSEMBLY.
'v8_enable_webassembly%': 1,
# Enable advanced BigInt algorithms, costing about 10-30 KiB binary size
# depending on platform.
'v8_advanced_bigint_algorithms%': 1
},
'target_defaults': {
'conditions': [
['v8_embedder_string!=""', {
'defines': ['V8_EMBEDDER_STRING="<(v8_embedder_string)"',],
}],
['v8_enable_disassembler==1', {
'defines': ['ENABLE_DISASSEMBLER',],
}],
['v8_promise_internal_field_count!=0', {
'defines': ['V8_PROMISE_INTERNAL_FIELD_COUNT=<(v8_promise_internal_field_count)'],
}],
['v8_enable_future==1', {
'defines': ['V8_ENABLE_FUTURE',],
}],
['v8_enable_lite_mode==1', {
'defines': ['V8_LITE_MODE',],
}],
['v8_enable_gdbjit==1', {
'defines': ['ENABLE_GDB_JIT_INTERFACE',],
}],
['v8_enable_hugepage==1', {
'defines': ['ENABLE_HUGEPAGE',],
}],
['v8_enable_private_mapping_fork_optimization==1', {
'defines': ['V8_ENABLE_PRIVATE_MAPPING_FORK_OPTIMIZATION'],
}],
['v8_enable_vtunejit==1', {
'defines': ['ENABLE_VTUNE_JIT_INTERFACE',],
}],
['v8_enable_pointer_compression==1', {
'defines': [
'V8_COMPRESS_POINTERS',
'V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE',
],
}],
['v8_enable_pointer_compression==1 or v8_enable_31bit_smis_on_64bit_arch==1', {
'defines': ['V8_31BIT_SMIS_ON_64BIT_ARCH',],
}],
['v8_enable_short_builtin_calls==1', {
'defines': ['V8_SHORT_BUILTIN_CALLS',],
}],
['v8_enable_zone_compression==1', {
'defines': ['V8_COMPRESS_ZONES',],
}],
['v8_enable_sandbox==1', {
'defines': ['V8_ENABLE_SANDBOX',],
}],
['v8_enable_object_print==1', {
'defines': ['OBJECT_PRINT',],
}],
['v8_enable_verify_heap==1', {
'defines': ['VERIFY_HEAP',],
}],
['v8_enable_verify_predictable==1', {
'defines': ['VERIFY_PREDICTABLE',],
}],
['v8_enable_trace_maps==1', {
'defines': ['V8_TRACE_MAPS',],
}],
['v8_enable_trace_ignition==1', {
'defines': ['V8_TRACE_IGNITION',],
}],
['v8_enable_trace_feedback_updates==1', {
'defines': ['V8_TRACE_FEEDBACK_UPDATES',],
}],
['v8_enable_test_features==1', {
'defines': [
'V8_ENABLE_ALLOCATION_TIMEOUT',
'V8_ENABLE_FORCE_SLOW_PATH',
'V8_ENABLE_DOUBLE_CONST_STORE_CHECK',
],
}],
['v8_enable_v8_checks==1', {
'defines': ['V8_ENABLE_CHECKS',],
}],
['v8_deprecation_warnings==1', {
'defines': ['V8_DEPRECATION_WARNINGS',],
},{
'defines!': ['V8_DEPRECATION_WARNINGS',],
}],
['v8_imminent_deprecation_warnings==1', {
'defines': ['V8_IMMINENT_DEPRECATION_WARNINGS',],
},{
'defines!': ['V8_IMMINENT_DEPRECATION_WARNINGS',],
}],
['v8_enable_i18n_support==1', {
'defines': ['V8_INTL_SUPPORT',],
}],
# Refs: https://github.com/nodejs/node/pull/23801
# ['v8_enable_handle_zapping==1', {
# 'defines': ['ENABLE_HANDLE_ZAPPING',],
# }],
['v8_enable_heap_snapshot_verify==1', {
'defines': ['V8_ENABLE_HEAP_SNAPSHOT_VERIFY',],
}],
['v8_enable_snapshot_native_code_counters==1', {
'defines': ['V8_SNAPSHOT_NATIVE_CODE_COUNTERS',],
}],
['v8_enable_single_generation==1', {
'defines': ['V8_ENABLE_SINGLE_GENERATION',],
}],
['v8_disable_write_barriers==1', {
'defines': ['V8_DISABLE_WRITE_BARRIERS',],
}],
['v8_enable_third_party_heap==1', {
'defines': ['V8_ENABLE_THIRD_PARTY_HEAP',],
}],
['v8_enable_atomic_object_field_writes==1', {
'defines': ['V8_ATOMIC_OBJECT_FIELD_WRITES',],
}],
['v8_enable_lazy_source_positions==1', {
'defines': ['V8_ENABLE_LAZY_SOURCE_POSITIONS',],
}],
['v8_use_siphash==1', {
'defines': ['V8_USE_SIPHASH',],
}],
['v8_enable_shared_ro_heap==1', {
'defines': ['V8_SHARED_RO_HEAP',],
}],
['dcheck_always_on!=0', {
'defines': ['DEBUG',],
}],
['v8_enable_verify_csa==1', {
'defines': ['ENABLE_VERIFY_CSA',],
}],
['v8_use_perfetto==1', {
'defines': ['V8_USE_PERFETTO',],
}],
['v8_win64_unwinding_info==1', {
'defines': ['V8_WIN64_UNWINDING_INFO',],
}],
['v8_enable_regexp_interpreter_threaded_dispatch==1', {
'defines': ['V8_ENABLE_REGEXP_INTERPRETER_THREADED_DISPATCH',],
}],
['v8_enable_snapshot_compression==1', {
'defines': ['V8_SNAPSHOT_COMPRESSION',],
}],
['v8_control_flow_integrity==1', {
'defines': ['V8_ENABLE_CONTROL_FLOW_INTEGRITY',],
}],
['v8_enable_cet_shadow_stack==1', {
'defines': ['V8_ENABLE_CET_SHADOW_STACK',],
}],
['v8_enable_static_roots==1', {
'defines': ['V8_STATIC_ROOTS',],
}],
['v8_use_zlib==1', {
'defines': ['V8_USE_ZLIB',],
}],
['v8_enable_precise_zone_stats==1', {
'defines': ['V8_ENABLE_PRECISE_ZONE_STATS',],
}],
['v8_enable_maglev==1', {
'defines': ['V8_ENABLE_MAGLEV',],
}],
['v8_enable_turbofan==1', {
'defines': ['V8_ENABLE_TURBOFAN',],
}],
['v8_enable_swiss_name_dictionary==1', {
'defines': ['V8_ENABLE_SWISS_NAME_DICTIONARY',],
}],
['v8_enable_system_instrumentation==1', {
'defines': ['V8_ENABLE_SYSTEM_INSTRUMENTATION',],
}],
['v8_enable_etw_stack_walking==1', {
'defines': ['V8_ENABLE_ETW_STACK_WALKING',],
}],
['v8_enable_webassembly==1', {
'defines': ['V8_ENABLE_WEBASSEMBLY',],
}],
['v8_dict_property_const_tracking==1', {
'defines': ['V8_DICT_PROPERTY_CONST_TRACKING',],
}],
['v8_enable_javascript_promise_hooks==1', {
'defines': ['V8_ENABLE_JAVASCRIPT_PROMISE_HOOKS',],
}],
['v8_enable_allocation_folding==1', {
'defines': ['V8_ALLOCATION_FOLDING',],
}],
['v8_allocation_site_tracking==1', {
'defines': ['V8_ALLOCATION_SITE_TRACKING',],
}],
['v8_scriptormodule_legacy_lifetime==1', {
'defines': ['V8_SCRIPTORMODULE_LEGACY_LIFETIME',],
}],
['v8_advanced_bigint_algorithms==1', {
'defines': ['V8_ADVANCED_BIGINT_ALGORITHMS',],
}],
], # conditions
'defines': [
'V8_GYP_BUILD',
'V8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=<(v8_typed_array_max_size_in_heap)',
], # defines
}, # target_defaults
}