nodejs / nodejs/node

Dynamic V8 Heap Resizing for Kubernetes In-Place Scaling (--max-old-space-size-percentage)

オープン
#65,235 コメント 1 件 リアクション 7 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

feature request
主要言語
JavaScript
スター
122k
フォーク
37.3k
平均マージ
4日 2時間
マージ済み PR(30日)
283

説明

What is the problem this feature will solve?

Node.js supports percentage-based heap configuration via --max-old-space-size-percentage. However, this flag currently calculates V8's maximum old space size only once at process startup based on initial system or cgroup memory limits.

Kubernetes supports in-place resource resizing (InPlacePodVerticalScaling), which alters container memory limits dynamically at runtime without restarting the container. Because --max-old-space-size-percentage evaluates only at startup, it cannot react to runtime cgroup changes:

  1. Memory Upscaling: If Kubernetes increases a running container's memory limit, Node.js remains restricted to the initial V8 heap limit calculated at startup, failing to utilize the newly available RAM.
  2. Memory Downscaling: If Kubernetes decreases the container's memory limit below the initial V8 heap allocation, the container risks being terminated by the Linux Out-Of-Memory (OOM) killer before V8 triggers garbage collection or lowers its heap boundary.

To fully support zero-downtime Kubernetes in-place resizing, --max-old-space-size-percentage needs to dynamically recalculate and apply heap limits when cgroup memory parameters change at runtime.

What is the feature you are proposing to solve the problem?

Extend --max-old-space-size-percentage to actively monitor cgroup memory limit changes and adjust the V8 heap size dynamically during process execution.

Example Workflow
# Enable percentage-based allocation
node --max-old-space-size-percentage=80 app.js

  1. Initialization: Container starts with a 2 GiB memory limit. Node.js evaluates --max-old-space-size-percentage=80 and sets V8 max old space to ~1.6 GiB.
  2. Kubernetes Event: Kubernetes resizes the running pod in-place from 2 GiB to 4 GiB memory limit.
  3. Event Detection: Node.js detects the cgroup change event.
  4. Runtime Update: Node.js recalculates 80% of 4 GiB (~3.2 GiB) and adjusts V8's isolate limits dynamically while the application continues processing traffic.
What alternatives have you considered?

No response

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

まず --max-old-space-size-percentage の実装と、それが読み取る cgroup メモリパラメータから始め、次に V8 isolate の制限を実行時に更新する方法を調査します。Kubernetes InPlacePodVerticalScaling、およびメモリの増加と減少の両方に対して設計を検証します。完了の条件は、再起動せずに実行時の制限が変更された後、パーセンテージが再適用されることです。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
javascript, kubernetes, nodejs
領域
backend, cloud, operating-systems, performance
issue の種類
機能追加
難易度
5/5
見積もり時間
1週間以上
活発さ
活発
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。