Skip to content

Conversation

@mcollina
Copy link
Member

This PR adds support for building node with pointer compression enabled. From some preliminary tests, enabling pointer compression shrinks memory usage by 40%.

See: #26756

Note that building with this flag makes some of our addon tests fail:

=== release test === Path: addons/async-hooks-promise/test Command: out/Release/node /home/matteo/repositories/node/test/addons/async-hooks-promise/test.js --- CRASHED (Signal: 11) --- === release test === Path: addons/08_passing_wrapped_objects_around/test Command: out/Release/node /home/matteo/repositories/node/test/addons/08_passing_wrapped_objects_around/test.js --- CRASHED (Signal: 11) --- === release test === Path: addons/new-target/test Command: out/Release/node /home/matteo/repositories/node/test/addons/new-target/test.js --- CRASHED (Signal: 11) --- === release test === Path: addons/make-callback/test Command: out/Release/node /home/matteo/repositories/node/test/addons/make-callback/test.js --- CRASHED (Signal: 11) --- === release test === Path: addons/06_wrapping_c_objects/test Command: out/Release/node /home/matteo/repositories/node/test/addons/06_wrapping_c_objects/test.js --- CRASHED (Signal: 11) --- === release test === Path: addons/07_factory_of_wrapped_objects/test Command: out/Release/node /home/matteo/repositories/node/test/addons/07_factory_of_wrapped_objects/test.js --- CRASHED (Signal: 11) --- === release test-perf-hooks-timerify === Path: addons/non-node-context/test-perf-hooks-timerify Command: out/Release/node /home/matteo/repositories/node/test/addons/non-node-context/test-perf-hooks-timerify.js --- CRASHED (Signal: 11) --- [02:41|% 100|+ 2807|- 7]: Done Makefile:296: recipe for target 'jstest' failed make[1]: *** [jstest] Error 1 Makefile:316: recipe for target 'test' failed make: *** [test] Error 2 
Checklist
  • make -j4 test (UNIX), or vcbuild test (Windows) passes
  • commit message follows commit guidelines

@nodejs-github-botnodejs-github-bot added the build Issues and PRs related to build files or the CI. label Nov 13, 2019
@mcollina
Copy link
MemberAuthor

@addaleax
Copy link
Member

Note that building with this flag makes some of our addon tests fail:

Yeah, that’s expected. Enabling pointer compression changes the Node.js ABI, which is IIRC the reason why we haven’t done this so far.

Copy link
Member

@addaleaxaddaleax left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs a good story for our addon ABI

@codebytere
Copy link
Member

Electron feels similarly - the memory savings are positive especially considering they're per-isolate but we're concerned about ABI compat of native modules

@mcollina
Copy link
MemberAuthor

@gabrielschulhof can you confirm n-api can handle this case?

@mcollina
Copy link
MemberAuthor

This needs a good story for our addon ABI

@addaleax my goal for this is to make it easier for folks to experiment with address compression. If you are ok, I'll add the option as "(experimental)" in the ./configure help.

@addaleax
Copy link
Member

@gabrielschulhof can you confirm n-api can handle this case?

N-API is unaffected.

This needs a good story for our addon ABI

@addaleax my goal for this is to make it easier for folks to experiment with address compression. If you are ok, I'll add the option as "(experimental)" in the ./configure help.

That would be good, but I’d prefer to explicitly call out that this mode does not currently support addons (at all)?

@jasnell
Copy link
Member

Definite +1 on marking this experimental and documenting the impact on native addons. Assuming those changes, this LGTM

@hashseed
Copy link
Member

That would be good, but I’d prefer to explicitly call out that this mode does not currently support addons (at all)?

Yeah iirc the plan was to consider having a build flag in V8 that ensures ABI stability regardless of whether pointer compression is enabled or not, by sacrificing some performance, since inline-implemented APIs would need to be replaced by non-inline versions.

@mcollinamcollinaforce-pushed the enable-pointer-compression branch from d10e3d6 to 4ac9eb8CompareNovember 19, 2019 17:43
@mcollina
Copy link
MemberAuthor

Updated @jasnell@addaleax

Copy link
Member

@rvaggrvagg left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would be good to enable so we can at least start playing with it

@mcollinamcollinaforce-pushed the enable-pointer-compression branch from 4ac9eb8 to 7ec8e6dCompareNovember 22, 2019 19:17
@nodejs-github-bot
Copy link
Collaborator

@mcollina
Copy link
MemberAuthor

mcollina commented Nov 22, 2019

I've removed the config from common.gypi. Please review.

cc @targos

@nodejs-github-bot
Copy link
Collaborator

@addaleaxaddaleax added the author ready PRs that have at least one approval, no pending requests for changes, and a CI started. label Nov 30, 2019
@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

@jasnell
Copy link
Member

I'm wondering whether there should be a warning printed at runtime when the node.js process starts.

@nodejs-github-bot
Copy link
Collaborator

Copy link
Member

@tniessentniessen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM as an experimental build feature.

@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

@mcollina
Copy link
MemberAuthor

@nodejs/build @nodejs/testing I would need some help here, as tests that seems unrelated are failing, however this should not change the default config.

@nodejs-github-bot
Copy link
Collaborator

@BridgeAR
Copy link
Member

@mcollina we currently rarely have green builds. There are lots of infrastructure failures and flaky tests. That's what seemed to have happened here as well.

@nodejs-github-bot
Copy link
Collaborator

nodejs-github-bot commented Dec 10, 2019

@TrottTrott added the semver-minor PRs that contain new features and should be released in the next minor version. label Dec 10, 2019
@Trott
Copy link
Member

Landed in 086c7b4

@TrottTrott closed this Dec 12, 2019
Trott pushed a commit to Trott/io.js that referenced this pull request Dec 12, 2019
The --experimental-enable-pointer-compression is experimental as it breaks ABI compatibility. PR-URL: nodejs#30463 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]> Reviewed-By: Rod Vagg <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: David Carlier <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Denys Otrishko <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Tobias Nießen <[email protected]> Reviewed-By: Rich Trott <[email protected]>
MylesBorins pushed a commit that referenced this pull request Dec 13, 2019
The --experimental-enable-pointer-compression is experimental as it breaks ABI compatibility. PR-URL: #30463 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]> Reviewed-By: Rod Vagg <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: David Carlier <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Denys Otrishko <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Tobias Nießen <[email protected]> Reviewed-By: Rich Trott <[email protected]>
@MylesBorinsMylesBorins mentioned this pull request Dec 13, 2019
@mmarchini
Copy link
Contributor

@targos any concerns on backporting this to v12.x? I was testing it today, and if we add the following lines (pulled from dda658c) to common.gypi, it works:

diff --git a/common.gypi b/common.gypi index 8c9076b735..856c6aa6ff 100644 --- a/common.gypi+++ b/common.gypi@@ -339,6 +339,12 @@ }], ], }], + ['v8_enable_pointer_compression == 1',{+ 'defines': ['V8_COMPRESS_POINTERS'],+ }],+ ['v8_enable_pointer_compression == 1 or v8_enable_31bit_smis_on_64bit_arch == 1',{+ 'defines': ['V8_31BIT_SMIS_ON_64BIT_ARCH'],+ }], ['OS == "win"',{'defines': [ 'WIN32',

The changes are non-intrusive, since it only impacts builds using --experimental-enable-pointer-compression. I can send a PR to backport it, unless there are other concerns.

@tuananh
Copy link
Contributor

where can i download a built version with --experimental-enable-pointer-compression enabled?

@mhdawson
Copy link
Member

@tuananh I believe you have to build it yourself as it is not in any of the shipping binaries.

@richardlau
Copy link
Member

@targos any concerns on backporting this to v12.x? I was testing it today, and if we add the following lines (pulled from dda658c) to common.gypi, it works:

diff --git a/common.gypi b/common.gypi index 8c9076b735..856c6aa6ff 100644 --- a/common.gypi+++ b/common.gypi@@ -339,6 +339,12 @@ }], ], }], + ['v8_enable_pointer_compression == 1',{+ 'defines': ['V8_COMPRESS_POINTERS'],+ }],+ ['v8_enable_pointer_compression == 1 or v8_enable_31bit_smis_on_64bit_arch == 1',{+ 'defines': ['V8_31BIT_SMIS_ON_64BIT_ARCH'],+ }], ['OS == "win"',{'defines': [ 'WIN32',

The changes are non-intrusive, since it only impacts builds using --experimental-enable-pointer-compression. I can send a PR to backport it, unless there are other concerns.

If this does get backported it will need to land with #33688 to fix building addons.

@mmarchini
Copy link
Contributor

Probably not worth it. We have pointer compressions builds for v14 now, and the pointer compression implementation on v12 has bugs as well as performance issues.

richardlau added a commit to richardlau/node-1 that referenced this pull request Jun 4, 2020
`common.gypi` is used by `node-gyp` to compile addons. Default values must be provided for variables that may not exist on older versions of Node.js so that older versions of Node.js can be used to compile addons for later versions of Node.js. Add default values for `v8_enable_pointer_compression` and `v8_enable_31bit_smis_on_64bit_arch`. PR-URL: nodejs#33688 Refs: nodejs#30463 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: Matteo Collina <[email protected]> Signed-off-by: Richard Lau <[email protected]>
codebytere pushed a commit that referenced this pull request Jun 18, 2020
`common.gypi` is used by `node-gyp` to compile addons. Default values must be provided for variables that may not exist on older versions of Node.js so that older versions of Node.js can be used to compile addons for later versions of Node.js. Add default values for `v8_enable_pointer_compression` and `v8_enable_31bit_smis_on_64bit_arch`. PR-URL: #33688 Refs: #30463 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: Matteo Collina <[email protected]> Signed-off-by: Richard Lau <[email protected]>
codebytere pushed a commit that referenced this pull request Jun 30, 2020
`common.gypi` is used by `node-gyp` to compile addons. Default values must be provided for variables that may not exist on older versions of Node.js so that older versions of Node.js can be used to compile addons for later versions of Node.js. Add default values for `v8_enable_pointer_compression` and `v8_enable_31bit_smis_on_64bit_arch`. PR-URL: #33688 Refs: #30463 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: Matteo Collina <[email protected]> Signed-off-by: Richard Lau <[email protected]>
codebytere pushed a commit that referenced this pull request Jul 9, 2020
`common.gypi` is used by `node-gyp` to compile addons. Default values must be provided for variables that may not exist on older versions of Node.js so that older versions of Node.js can be used to compile addons for later versions of Node.js. Add default values for `v8_enable_pointer_compression` and `v8_enable_31bit_smis_on_64bit_arch`. PR-URL: #33688 Refs: #30463 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: Matteo Collina <[email protected]> Signed-off-by: Richard Lau <[email protected]>
@richardlaurichardlau mentioned this pull request Jul 14, 2020
@jdmarshall
Copy link

Why wouldn’t this be useful now that we’re on node 18?

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs that have at least one approval, no pending requests for changes, and a CI started.buildIssues and PRs related to build files or the CI.semver-minorPRs that contain new features and should be released in the next minor version.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

20 participants

@mcollina@addaleax@codebytere@jasnell@hashseed@nodejs-github-bot@gireeshpunathil@targos@BridgeAR@Trott@mmarchini@tuananh@mhdawson@richardlau@jdmarshall@rvagg@cjihrig@tniessen@devnexen@lundibundi