mirror of
https://github.com/denoland/deno.git
synced 2025-09-26 12:19:12 +00:00
![]() This change configures V8 isolates to respect memory limits imposed by cgroups on Linux. It adds support for detecting both cgroups v1 and v2 memory limits, enabling Deno to properly adapt to containerized environments with memory constraints. When cgroups information is unavailable or not applicable, it falls back to using the system's total memory as before. Closes #29077 ## Test For testing, I created a ubuntu VM with 1Gi memory. Within this VM, set up a cgroup with 512Mi memory limit, then ran the following script to see how much heap size limit the V8 isolate had. ```js import * as v8 from "node:v8"; console.log(v8.getHeapStatistics()); ``` ### Ubuntu 20.04 In this version of ubuntu, hybrid mode is enabled by default. ``` $ cat /proc/self/cgroup 12:rdma:/ 11:blkio:/user.slice 10:devices:/user.slice 9:cpu,cpuacct:/user.slice 8:pids:/user.slice/user-1000.slice/session-3.scope 7:memory:/user.slice/user-1000.slice/session-3.scope 6:perf_event:/ 5:freezer:/ 4:net_cls,net_prio:/ 3:hugetlb:/ 2:cpuset:/ 1:name=systemd:/user.slice/user-1000.slice/session-3.scope 0::/user.slice/user-1000.slice/session-3.scope ``` Create a new cgroup with 512Mi memory limit and run the above script in this cgroup: ``` $ sudo cgcreate -g memory:/mygroup $ sudo cgset -r memory.limit_in_bytes=$((512 * 1024 * 1024)) mygroup $ sudo cgexec -g memory:mygroup ./deno run main.mjs { total_heap_size: 7745536, total_heap_size_executable: 0, total_physical_size: 7090176, total_available_size: 266348216, used_heap_size: 6276752, heap_size_limit: 271581184, malloced_memory: 303200, peak_malloced_memory: 140456, does_zap_garbage: 0, number_of_native_contexts: 1, number_of_detached_contexts: 0, total_global_handles_size: 24576, used_global_handles_size: 22432, external_memory: 3232012 } ``` This indicates that the isolate was informed of cgroup-constrained memory limit (512Mi) and hence got ~270M heap limit. ### Ubuntu 22.04 In this version of ubuntu, cgroup v2 is used. ``` $ cat /proc/self/cgroup 0::/user.slice/user-1000.slice/session-3.scope ``` Run the above script using `systemd-run`: ``` $ sudo systemd-run --property=MemoryMax=512M --pty bash -c '/home/ubuntu/deno run /home/ubuntu/main.mjs' { total_heap_size: 7745536, total_heap_size_executable: 0, total_physical_size: 7090176, total_available_size: 266348184, used_heap_size: 6276784, heap_size_limit: 271581184, malloced_memory: 303200, peak_malloced_memory: 140456, does_zap_garbage: 0, number_of_native_contexts: 1, number_of_detached_contexts: 0, total_global_handles_size: 24576, used_global_handles_size: 22432, external_memory: 3232012 } ``` Again the isolate got ~270M heap limit properly. Note that it should have had bigger heap limit if the entire system memory, i.e. 1Gi, had been passed to V8. In fact, if we run the same script outside the cgroup, it does display larger `heap_size_limit` like below: ``` $ ./deno run main.mjs { total_heap_size: 7745536, total_heap_size_executable: 0, total_physical_size: 7090176, total_available_size: 546580152, used_heap_size: 6276752, heap_size_limit: 551813120, malloced_memory: 303200, peak_malloced_memory: 140456, does_zap_garbage: 0, number_of_native_contexts: 1, number_of_detached_contexts: 0, total_global_handles_size: 24576, used_global_handles_size: 22432, external_memory: 3232012 } ``` --------- Signed-off-by: Yusuke Tanaka <wing0920@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> |
||
---|---|---|
.. | ||
dts | ||
00_typescript.js | ||
97_ts_host.js | ||
98_lsp.js | ||
99_main_compiler.js | ||
_analyze_types_node.ts | ||
compiler.d.ts | ||
diagnostics.rs | ||
mod.rs | ||
README.md |
tsc
This directory contains the typescript compiler and a small compiler host for the runtime snapshot.
How to upgrade TypeScript.
The files in this directory are mostly from the TypeScript repository. We currently (unfortunately) have a rather manual process for upgrading TypeScript. It works like this currently:
- Checkout denoland/TypeScript repo in a separate directory.
- Add Microsoft/TypeScript as a remote and fetch its latest tags
- Checkout a new branch based on this tag.
- Cherry pick the custom commit we made in a previous release to the new one.
- This commit has a "deno.ts" file in it. Read the instructions in it.
- Copy typescript.js into Deno repo.
- Copy d.ts files into dts directory.
- Review the copied files, removing and reverting what's necessary
So that might look something like this:
git clone https://github.com/denoland/TypeScript.git
cd typescript
git remote add upstream https://github.com/Microsoft/TypeScript
git fetch upstream
git checkout v3.9.7
git checkout -b branch_v3.9.7
git cherry pick <previous-release-branch-commit-we-did>
npm install
npx hereby
rsync built/local/typescript.js ~/src/deno/cli/tsc/00_typescript.js
rsync --exclude=protocol.d.ts --exclude=tsserverlibrary.d.ts --exclude=typescriptServices.d.ts built/local/*.d.ts ~/src/deno/cli/tsc/dts/