OOM - Segmentation fault (not ulimit, not cgroups, not max-space, not exhausted RAM) #4474

Description

@riverego

Node.js Version

v22.7.0 & previous

NPM Version

v10.8.2 & previous

Operating System

Linux ip-10-8-1-229 6.1.0-23-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.99-1 (2024-07-15) x86_64 GNU/Linux

Subsystem

Other

Description

The code works as expected on my own computer : it crashes when max-old-space is reached around 32G...

But on cloud VMs (of Outscale) it always runs OOM around 20G.

The problem happens on all images that I have tested : Debian12, Debian 11 & Ubuntu 20 (outscale out of the box images) with same result on 128 and 64Go of RAM Vms and all tested node versions (22, 20 & 16)

$ cat /proc/<pid>/limits
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 257180 257180 processes
Max open files 1048576 1048576 files
Max locked memory unlimited unlimited bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 257180 257180 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us

I checked ulimits, cgroups (even if cgroups kills a process with oom reaper, it doesn't throws a segfault), I found nothing...
I tried to put 50G fixed value on ulimits to see if unlimited hides a low default value and it's the same.

I looked with /proc/sys/vm/overcommit_memory 0,1,2 values and its the same.
I tried to recompile nodejs on the VM.... Same....
I exhausted ChatGPT ideas....

I thought maybe this is a host limit applied on processes, so I tried this :

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>intmain(intargc,char*argv[]){
size_toneG=1024*1048576;
size_tmaxMem=17*oneG;
void*memPointer=NULL;
do{
if(memPointer!=NULL){
printf("Max Tested Memory = %zi\n",maxMem);
memset(memPointer,0,maxMem);
free(memPointer);
}
maxMem+=oneG;
memPointer=malloc(maxMem);
}while(memPointer!=NULL);
maxMem-=oneG;
printf("Max Usable Memory aprox = %zi\n",maxMem);
memPointer=malloc(maxMem);
memset(memPointer,1,maxMem);
sleep(30);
return0;
}

But this can reach the VM RAM limit (64G or 128G) without any problem.
Same for the stress command....

stress -m 1 --vm-bytes 32G --vm-keep

So I'm running out of ideas... I can't figure out what makes NodeJS run OOM around 20G on these VMs....

I hope someone here has a clue about what is happening....

Thank you.

Minimal Reproduction

constfill=newArray(1000).fill('o').join('')constbufs=[]leti=0while(true){++ibufs.push(Array.from({length: 10*1024*1024},(_,i)=>i+fill))// console.log(i)}

The code just have to reach the OOM point.

Output

$ node --max-old-space-size=32000 --trace-gc index.js
[...traces]
[12808:0x6f27120] 146468 ms: Scavenge 19279.2 (19571.3) -> 19263.9 (19571.3) MB, 50.10 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
[12808:0x6f27120] 146787 ms: Scavenge 19317.6 (19610.3) -> 19302.1 (19610.5) MB, 35.85 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
Segmentation fault

Before You Submit

  • I have looked for issues that already exist before submitting this
  • My issue follows the guidelines in the README file, and follows the 'How to ask a good question' guide at https://stackoverflow.com/help/how-to-ask

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
      Skip to content

      OOM - Segmentation fault (not ulimit, not cgroups, not max-space, not exhausted RAM) #4474

      Description

      @riverego

      Node.js Version

      v22.7.0 & previous

      NPM Version

      v10.8.2 & previous

      Operating System

      Linux ip-10-8-1-229 6.1.0-23-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.99-1 (2024-07-15) x86_64 GNU/Linux

      Subsystem

      Other

      Description

      The code works as expected on my own computer : it crashes when max-old-space is reached around 32G...

      But on cloud VMs (of Outscale) it always runs OOM around 20G.

      The problem happens on all images that I have tested : Debian12, Debian 11 & Ubuntu 20 (outscale out of the box images) with same result on 128 and 64Go of RAM Vms and all tested node versions (22, 20 & 16)

      $ cat /proc/<pid>/limits
      Max cpu time unlimited unlimited seconds
      Max file size unlimited unlimited bytes
      Max data size unlimited unlimited bytes
      Max stack size 8388608 unlimited bytes
      Max core file size 0 unlimited bytes
      Max resident set unlimited unlimited bytes
      Max processes 257180 257180 processes
      Max open files 1048576 1048576 files
      Max locked memory unlimited unlimited bytes
      Max address space unlimited unlimited bytes
      Max file locks unlimited unlimited locks
      Max pending signals 257180 257180 signals
      Max msgqueue size 819200 819200 bytes
      Max nice priority 0 0
      Max realtime priority 0 0
      Max realtime timeout unlimited unlimited us

      I checked ulimits, cgroups (even if cgroups kills a process with oom reaper, it doesn't throws a segfault), I found nothing...
      I tried to put 50G fixed value on ulimits to see if unlimited hides a low default value and it's the same.

      I looked with /proc/sys/vm/overcommit_memory 0,1,2 values and its the same.
      I tried to recompile nodejs on the VM.... Same....
      I exhausted ChatGPT ideas....

      I thought maybe this is a host limit applied on processes, so I tried this :

      #include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>intmain(intargc,char*argv[]){
      size_toneG=1024*1048576;
      size_tmaxMem=17*oneG;
      void*memPointer=NULL;
      do{
      if(memPointer!=NULL){
      printf("Max Tested Memory = %zi\n",maxMem);
      memset(memPointer,0,maxMem);
      free(memPointer);
      }
      maxMem+=oneG;
      memPointer=malloc(maxMem);
      }while(memPointer!=NULL);
      maxMem-=oneG;
      printf("Max Usable Memory aprox = %zi\n",maxMem);
      memPointer=malloc(maxMem);
      memset(memPointer,1,maxMem);
      sleep(30);
      return0;
      }

      But this can reach the VM RAM limit (64G or 128G) without any problem.
      Same for the stress command....

      stress -m 1 --vm-bytes 32G --vm-keep

      So I'm running out of ideas... I can't figure out what makes NodeJS run OOM around 20G on these VMs....

      I hope someone here has a clue about what is happening....

      Thank you.

      Minimal Reproduction

      constfill=newArray(1000).fill('o').join('')constbufs=[]leti=0while(true){++ibufs.push(Array.from({length: 10*1024*1024},(_,i)=>i+fill))// console.log(i)}

      The code just have to reach the OOM point.

      Output

      $ node --max-old-space-size=32000 --trace-gc index.js
      [...traces]
      [12808:0x6f27120] 146468 ms: Scavenge 19279.2 (19571.3) -> 19263.9 (19571.3) MB, 50.10 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
      [12808:0x6f27120] 146787 ms: Scavenge 19317.6 (19610.3) -> 19302.1 (19610.5) MB, 35.85 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
      Segmentation fault

      Before You Submit

      • I have looked for issues that already exist before submitting this
      • My issue follows the guidelines in the README file, and follows the 'How to ask a good question' guide at https://stackoverflow.com/help/how-to-ask

      Activity

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

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          OOM - Segmentation fault (not ulimit, not cgroups, not max-space, not exhausted RAM) #4474

          Description

          @riverego

          Node.js Version

          v22.7.0 & previous

          NPM Version

          v10.8.2 & previous

          Operating System

          Linux ip-10-8-1-229 6.1.0-23-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.99-1 (2024-07-15) x86_64 GNU/Linux

          Subsystem

          Other

          Description

          The code works as expected on my own computer : it crashes when max-old-space is reached around 32G...

          But on cloud VMs (of Outscale) it always runs OOM around 20G.

          The problem happens on all images that I have tested : Debian12, Debian 11 & Ubuntu 20 (outscale out of the box images) with same result on 128 and 64Go of RAM Vms and all tested node versions (22, 20 & 16)

          $ cat /proc/<pid>/limits
          Max cpu time unlimited unlimited seconds
          Max file size unlimited unlimited bytes
          Max data size unlimited unlimited bytes
          Max stack size 8388608 unlimited bytes
          Max core file size 0 unlimited bytes
          Max resident set unlimited unlimited bytes
          Max processes 257180 257180 processes
          Max open files 1048576 1048576 files
          Max locked memory unlimited unlimited bytes
          Max address space unlimited unlimited bytes
          Max file locks unlimited unlimited locks
          Max pending signals 257180 257180 signals
          Max msgqueue size 819200 819200 bytes
          Max nice priority 0 0
          Max realtime priority 0 0
          Max realtime timeout unlimited unlimited us

          I checked ulimits, cgroups (even if cgroups kills a process with oom reaper, it doesn't throws a segfault), I found nothing...
          I tried to put 50G fixed value on ulimits to see if unlimited hides a low default value and it's the same.

          I looked with /proc/sys/vm/overcommit_memory 0,1,2 values and its the same.
          I tried to recompile nodejs on the VM.... Same....
          I exhausted ChatGPT ideas....

          I thought maybe this is a host limit applied on processes, so I tried this :

          #include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>intmain(intargc,char*argv[]){
          size_toneG=1024*1048576;
          size_tmaxMem=17*oneG;
          void*memPointer=NULL;
          do{
          if(memPointer!=NULL){
          printf("Max Tested Memory = %zi\n",maxMem);
          memset(memPointer,0,maxMem);
          free(memPointer);
          }
          maxMem+=oneG;
          memPointer=malloc(maxMem);
          }while(memPointer!=NULL);
          maxMem-=oneG;
          printf("Max Usable Memory aprox = %zi\n",maxMem);
          memPointer=malloc(maxMem);
          memset(memPointer,1,maxMem);
          sleep(30);
          return0;
          }

          But this can reach the VM RAM limit (64G or 128G) without any problem.
          Same for the stress command....

          stress -m 1 --vm-bytes 32G --vm-keep

          So I'm running out of ideas... I can't figure out what makes NodeJS run OOM around 20G on these VMs....

          I hope someone here has a clue about what is happening....

          Thank you.

          Minimal Reproduction

          constfill=newArray(1000).fill('o').join('')constbufs=[]leti=0while(true){++ibufs.push(Array.from({length: 10*1024*1024},(_,i)=>i+fill))// console.log(i)}

          The code just have to reach the OOM point.

          Output

          $ node --max-old-space-size=32000 --trace-gc index.js
          [...traces]
          [12808:0x6f27120] 146468 ms: Scavenge 19279.2 (19571.3) -> 19263.9 (19571.3) MB, 50.10 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
          [12808:0x6f27120] 146787 ms: Scavenge 19317.6 (19610.3) -> 19302.1 (19610.5) MB, 35.85 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
          Segmentation fault

          Before You Submit

          • I have looked for issues that already exist before submitting this
          • My issue follows the guidelines in the README file, and follows the 'How to ask a good question' guide at https://stackoverflow.com/help/how-to-ask

          Activity

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

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              OOM - Segmentation fault (not ulimit, not cgroups, not max-space, not exhausted RAM) #4474

              Description

              @riverego

              Node.js Version

              v22.7.0 & previous

              NPM Version

              v10.8.2 & previous

              Operating System

              Linux ip-10-8-1-229 6.1.0-23-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.99-1 (2024-07-15) x86_64 GNU/Linux

              Subsystem

              Other

              Description

              The code works as expected on my own computer : it crashes when max-old-space is reached around 32G...

              But on cloud VMs (of Outscale) it always runs OOM around 20G.

              The problem happens on all images that I have tested : Debian12, Debian 11 & Ubuntu 20 (outscale out of the box images) with same result on 128 and 64Go of RAM Vms and all tested node versions (22, 20 & 16)

              $ cat /proc/<pid>/limits
              Max cpu time unlimited unlimited seconds
              Max file size unlimited unlimited bytes
              Max data size unlimited unlimited bytes
              Max stack size 8388608 unlimited bytes
              Max core file size 0 unlimited bytes
              Max resident set unlimited unlimited bytes
              Max processes 257180 257180 processes
              Max open files 1048576 1048576 files
              Max locked memory unlimited unlimited bytes
              Max address space unlimited unlimited bytes
              Max file locks unlimited unlimited locks
              Max pending signals 257180 257180 signals
              Max msgqueue size 819200 819200 bytes
              Max nice priority 0 0
              Max realtime priority 0 0
              Max realtime timeout unlimited unlimited us

              I checked ulimits, cgroups (even if cgroups kills a process with oom reaper, it doesn't throws a segfault), I found nothing...
              I tried to put 50G fixed value on ulimits to see if unlimited hides a low default value and it's the same.

              I looked with /proc/sys/vm/overcommit_memory 0,1,2 values and its the same.
              I tried to recompile nodejs on the VM.... Same....
              I exhausted ChatGPT ideas....

              I thought maybe this is a host limit applied on processes, so I tried this :

              #include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>intmain(intargc,char*argv[]){
              size_toneG=1024*1048576;
              size_tmaxMem=17*oneG;
              void*memPointer=NULL;
              do{
              if(memPointer!=NULL){
              printf("Max Tested Memory = %zi\n",maxMem);
              memset(memPointer,0,maxMem);
              free(memPointer);
              }
              maxMem+=oneG;
              memPointer=malloc(maxMem);
              }while(memPointer!=NULL);
              maxMem-=oneG;
              printf("Max Usable Memory aprox = %zi\n",maxMem);
              memPointer=malloc(maxMem);
              memset(memPointer,1,maxMem);
              sleep(30);
              return0;
              }

              But this can reach the VM RAM limit (64G or 128G) without any problem.
              Same for the stress command....

              stress -m 1 --vm-bytes 32G --vm-keep

              So I'm running out of ideas... I can't figure out what makes NodeJS run OOM around 20G on these VMs....

              I hope someone here has a clue about what is happening....

              Thank you.

              Minimal Reproduction

              constfill=newArray(1000).fill('o').join('')constbufs=[]leti=0while(true){++ibufs.push(Array.from({length: 10*1024*1024},(_,i)=>i+fill))// console.log(i)}

              The code just have to reach the OOM point.

              Output

              $ node --max-old-space-size=32000 --trace-gc index.js
              [...traces]
              [12808:0x6f27120] 146468 ms: Scavenge 19279.2 (19571.3) -> 19263.9 (19571.3) MB, 50.10 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
              [12808:0x6f27120] 146787 ms: Scavenge 19317.6 (19610.3) -> 19302.1 (19610.5) MB, 35.85 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
              Segmentation fault

              Before You Submit

              • I have looked for issues that already exist before submitting this
              • My issue follows the guidelines in the README file, and follows the 'How to ask a good question' guide at https://stackoverflow.com/help/how-to-ask

              Activity

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

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  OOM - Segmentation fault (not ulimit, not cgroups, not max-space, not exhausted RAM) #4474

                  Description

                  @riverego

                  Node.js Version

                  v22.7.0 & previous

                  NPM Version

                  v10.8.2 & previous

                  Operating System

                  Linux ip-10-8-1-229 6.1.0-23-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.99-1 (2024-07-15) x86_64 GNU/Linux

                  Subsystem

                  Other

                  Description

                  The code works as expected on my own computer : it crashes when max-old-space is reached around 32G...

                  But on cloud VMs (of Outscale) it always runs OOM around 20G.

                  The problem happens on all images that I have tested : Debian12, Debian 11 & Ubuntu 20 (outscale out of the box images) with same result on 128 and 64Go of RAM Vms and all tested node versions (22, 20 & 16)

                  $ cat /proc/<pid>/limits
                  Max cpu time unlimited unlimited seconds
                  Max file size unlimited unlimited bytes
                  Max data size unlimited unlimited bytes
                  Max stack size 8388608 unlimited bytes
                  Max core file size 0 unlimited bytes
                  Max resident set unlimited unlimited bytes
                  Max processes 257180 257180 processes
                  Max open files 1048576 1048576 files
                  Max locked memory unlimited unlimited bytes
                  Max address space unlimited unlimited bytes
                  Max file locks unlimited unlimited locks
                  Max pending signals 257180 257180 signals
                  Max msgqueue size 819200 819200 bytes
                  Max nice priority 0 0
                  Max realtime priority 0 0
                  Max realtime timeout unlimited unlimited us

                  I checked ulimits, cgroups (even if cgroups kills a process with oom reaper, it doesn't throws a segfault), I found nothing...
                  I tried to put 50G fixed value on ulimits to see if unlimited hides a low default value and it's the same.

                  I looked with /proc/sys/vm/overcommit_memory 0,1,2 values and its the same.
                  I tried to recompile nodejs on the VM.... Same....
                  I exhausted ChatGPT ideas....

                  I thought maybe this is a host limit applied on processes, so I tried this :

                  #include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>intmain(intargc,char*argv[]){
                  size_toneG=1024*1048576;
                  size_tmaxMem=17*oneG;
                  void*memPointer=NULL;
                  do{
                  if(memPointer!=NULL){
                  printf("Max Tested Memory = %zi\n",maxMem);
                  memset(memPointer,0,maxMem);
                  free(memPointer);
                  }
                  maxMem+=oneG;
                  memPointer=malloc(maxMem);
                  }while(memPointer!=NULL);
                  maxMem-=oneG;
                  printf("Max Usable Memory aprox = %zi\n",maxMem);
                  memPointer=malloc(maxMem);
                  memset(memPointer,1,maxMem);
                  sleep(30);
                  return0;
                  }

                  But this can reach the VM RAM limit (64G or 128G) without any problem.
                  Same for the stress command....

                  stress -m 1 --vm-bytes 32G --vm-keep

                  So I'm running out of ideas... I can't figure out what makes NodeJS run OOM around 20G on these VMs....

                  I hope someone here has a clue about what is happening....

                  Thank you.

                  Minimal Reproduction

                  constfill=newArray(1000).fill('o').join('')constbufs=[]leti=0while(true){++ibufs.push(Array.from({length: 10*1024*1024},(_,i)=>i+fill))// console.log(i)}

                  The code just have to reach the OOM point.

                  Output

                  $ node --max-old-space-size=32000 --trace-gc index.js
                  [...traces]
                  [12808:0x6f27120] 146468 ms: Scavenge 19279.2 (19571.3) -> 19263.9 (19571.3) MB, 50.10 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
                  [12808:0x6f27120] 146787 ms: Scavenge 19317.6 (19610.3) -> 19302.1 (19610.5) MB, 35.85 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
                  Segmentation fault

                  Before You Submit

                  • I have looked for issues that already exist before submitting this
                  • My issue follows the guidelines in the README file, and follows the 'How to ask a good question' guide at https://stackoverflow.com/help/how-to-ask

                  Activity

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

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      OOM - Segmentation fault (not ulimit, not cgroups, not max-space, not exhausted RAM) #4474

                      Description

                      @riverego

                      Node.js Version

                      v22.7.0 & previous

                      NPM Version

                      v10.8.2 & previous

                      Operating System

                      Linux ip-10-8-1-229 6.1.0-23-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.99-1 (2024-07-15) x86_64 GNU/Linux

                      Subsystem

                      Other

                      Description

                      The code works as expected on my own computer : it crashes when max-old-space is reached around 32G...

                      But on cloud VMs (of Outscale) it always runs OOM around 20G.

                      The problem happens on all images that I have tested : Debian12, Debian 11 & Ubuntu 20 (outscale out of the box images) with same result on 128 and 64Go of RAM Vms and all tested node versions (22, 20 & 16)

                      $ cat /proc/<pid>/limits
                      Max cpu time unlimited unlimited seconds
                      Max file size unlimited unlimited bytes
                      Max data size unlimited unlimited bytes
                      Max stack size 8388608 unlimited bytes
                      Max core file size 0 unlimited bytes
                      Max resident set unlimited unlimited bytes
                      Max processes 257180 257180 processes
                      Max open files 1048576 1048576 files
                      Max locked memory unlimited unlimited bytes
                      Max address space unlimited unlimited bytes
                      Max file locks unlimited unlimited locks
                      Max pending signals 257180 257180 signals
                      Max msgqueue size 819200 819200 bytes
                      Max nice priority 0 0
                      Max realtime priority 0 0
                      Max realtime timeout unlimited unlimited us

                      I checked ulimits, cgroups (even if cgroups kills a process with oom reaper, it doesn't throws a segfault), I found nothing...
                      I tried to put 50G fixed value on ulimits to see if unlimited hides a low default value and it's the same.

                      I looked with /proc/sys/vm/overcommit_memory 0,1,2 values and its the same.
                      I tried to recompile nodejs on the VM.... Same....
                      I exhausted ChatGPT ideas....

                      I thought maybe this is a host limit applied on processes, so I tried this :

                      #include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>intmain(intargc,char*argv[]){
                      size_toneG=1024*1048576;
                      size_tmaxMem=17*oneG;
                      void*memPointer=NULL;
                      do{
                      if(memPointer!=NULL){
                      printf("Max Tested Memory = %zi\n",maxMem);
                      memset(memPointer,0,maxMem);
                      free(memPointer);
                      }
                      maxMem+=oneG;
                      memPointer=malloc(maxMem);
                      }while(memPointer!=NULL);
                      maxMem-=oneG;
                      printf("Max Usable Memory aprox = %zi\n",maxMem);
                      memPointer=malloc(maxMem);
                      memset(memPointer,1,maxMem);
                      sleep(30);
                      return0;
                      }

                      But this can reach the VM RAM limit (64G or 128G) without any problem.
                      Same for the stress command....

                      stress -m 1 --vm-bytes 32G --vm-keep

                      So I'm running out of ideas... I can't figure out what makes NodeJS run OOM around 20G on these VMs....

                      I hope someone here has a clue about what is happening....

                      Thank you.

                      Minimal Reproduction

                      constfill=newArray(1000).fill('o').join('')constbufs=[]leti=0while(true){++ibufs.push(Array.from({length: 10*1024*1024},(_,i)=>i+fill))// console.log(i)}

                      The code just have to reach the OOM point.

                      Output

                      $ node --max-old-space-size=32000 --trace-gc index.js
                      [...traces]
                      [12808:0x6f27120] 146468 ms: Scavenge 19279.2 (19571.3) -> 19263.9 (19571.3) MB, 50.10 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
                      [12808:0x6f27120] 146787 ms: Scavenge 19317.6 (19610.3) -> 19302.1 (19610.5) MB, 35.85 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
                      Segmentation fault

                      Before You Submit

                      • I have looked for issues that already exist before submitting this
                      • My issue follows the guidelines in the README file, and follows the 'How to ask a good question' guide at https://stackoverflow.com/help/how-to-ask

                      Activity

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

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          OOM - Segmentation fault (not ulimit, not cgroups, not max-space, not exhausted RAM) #4474

                          Description

                          @riverego

                          Node.js Version

                          v22.7.0 & previous

                          NPM Version

                          v10.8.2 & previous

                          Operating System

                          Linux ip-10-8-1-229 6.1.0-23-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.99-1 (2024-07-15) x86_64 GNU/Linux

                          Subsystem

                          Other

                          Description

                          The code works as expected on my own computer : it crashes when max-old-space is reached around 32G...

                          But on cloud VMs (of Outscale) it always runs OOM around 20G.

                          The problem happens on all images that I have tested : Debian12, Debian 11 & Ubuntu 20 (outscale out of the box images) with same result on 128 and 64Go of RAM Vms and all tested node versions (22, 20 & 16)

                          $ cat /proc/<pid>/limits
                          Max cpu time unlimited unlimited seconds
                          Max file size unlimited unlimited bytes
                          Max data size unlimited unlimited bytes
                          Max stack size 8388608 unlimited bytes
                          Max core file size 0 unlimited bytes
                          Max resident set unlimited unlimited bytes
                          Max processes 257180 257180 processes
                          Max open files 1048576 1048576 files
                          Max locked memory unlimited unlimited bytes
                          Max address space unlimited unlimited bytes
                          Max file locks unlimited unlimited locks
                          Max pending signals 257180 257180 signals
                          Max msgqueue size 819200 819200 bytes
                          Max nice priority 0 0
                          Max realtime priority 0 0
                          Max realtime timeout unlimited unlimited us

                          I checked ulimits, cgroups (even if cgroups kills a process with oom reaper, it doesn't throws a segfault), I found nothing...
                          I tried to put 50G fixed value on ulimits to see if unlimited hides a low default value and it's the same.

                          I looked with /proc/sys/vm/overcommit_memory 0,1,2 values and its the same.
                          I tried to recompile nodejs on the VM.... Same....
                          I exhausted ChatGPT ideas....

                          I thought maybe this is a host limit applied on processes, so I tried this :

                          #include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>intmain(intargc,char*argv[]){
                          size_toneG=1024*1048576;
                          size_tmaxMem=17*oneG;
                          void*memPointer=NULL;
                          do{
                          if(memPointer!=NULL){
                          printf("Max Tested Memory = %zi\n",maxMem);
                          memset(memPointer,0,maxMem);
                          free(memPointer);
                          }
                          maxMem+=oneG;
                          memPointer=malloc(maxMem);
                          }while(memPointer!=NULL);
                          maxMem-=oneG;
                          printf("Max Usable Memory aprox = %zi\n",maxMem);
                          memPointer=malloc(maxMem);
                          memset(memPointer,1,maxMem);
                          sleep(30);
                          return0;
                          }

                          But this can reach the VM RAM limit (64G or 128G) without any problem.
                          Same for the stress command....

                          stress -m 1 --vm-bytes 32G --vm-keep

                          So I'm running out of ideas... I can't figure out what makes NodeJS run OOM around 20G on these VMs....

                          I hope someone here has a clue about what is happening....

                          Thank you.

                          Minimal Reproduction

                          constfill=newArray(1000).fill('o').join('')constbufs=[]leti=0while(true){++ibufs.push(Array.from({length: 10*1024*1024},(_,i)=>i+fill))// console.log(i)}

                          The code just have to reach the OOM point.

                          Output

                          $ node --max-old-space-size=32000 --trace-gc index.js
                          [...traces]
                          [12808:0x6f27120] 146468 ms: Scavenge 19279.2 (19571.3) -> 19263.9 (19571.3) MB, 50.10 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
                          [12808:0x6f27120] 146787 ms: Scavenge 19317.6 (19610.3) -> 19302.1 (19610.5) MB, 35.85 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
                          Segmentation fault

                          Before You Submit

                          • I have looked for issues that already exist before submitting this
                          • My issue follows the guidelines in the README file, and follows the 'How to ask a good question' guide at https://stackoverflow.com/help/how-to-ask

                          Activity

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

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              OOM - Segmentation fault (not ulimit, not cgroups, not max-space, not exhausted RAM) #4474

                              Description

                              @riverego

                              Node.js Version

                              v22.7.0 & previous

                              NPM Version

                              v10.8.2 & previous

                              Operating System

                              Linux ip-10-8-1-229 6.1.0-23-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.99-1 (2024-07-15) x86_64 GNU/Linux

                              Subsystem

                              Other

                              Description

                              The code works as expected on my own computer : it crashes when max-old-space is reached around 32G...

                              But on cloud VMs (of Outscale) it always runs OOM around 20G.

                              The problem happens on all images that I have tested : Debian12, Debian 11 & Ubuntu 20 (outscale out of the box images) with same result on 128 and 64Go of RAM Vms and all tested node versions (22, 20 & 16)

                              $ cat /proc/<pid>/limits
                              Max cpu time unlimited unlimited seconds
                              Max file size unlimited unlimited bytes
                              Max data size unlimited unlimited bytes
                              Max stack size 8388608 unlimited bytes
                              Max core file size 0 unlimited bytes
                              Max resident set unlimited unlimited bytes
                              Max processes 257180 257180 processes
                              Max open files 1048576 1048576 files
                              Max locked memory unlimited unlimited bytes
                              Max address space unlimited unlimited bytes
                              Max file locks unlimited unlimited locks
                              Max pending signals 257180 257180 signals
                              Max msgqueue size 819200 819200 bytes
                              Max nice priority 0 0
                              Max realtime priority 0 0
                              Max realtime timeout unlimited unlimited us

                              I checked ulimits, cgroups (even if cgroups kills a process with oom reaper, it doesn't throws a segfault), I found nothing...
                              I tried to put 50G fixed value on ulimits to see if unlimited hides a low default value and it's the same.

                              I looked with /proc/sys/vm/overcommit_memory 0,1,2 values and its the same.
                              I tried to recompile nodejs on the VM.... Same....
                              I exhausted ChatGPT ideas....

                              I thought maybe this is a host limit applied on processes, so I tried this :

                              #include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>intmain(intargc,char*argv[]){
                              size_toneG=1024*1048576;
                              size_tmaxMem=17*oneG;
                              void*memPointer=NULL;
                              do{
                              if(memPointer!=NULL){
                              printf("Max Tested Memory = %zi\n",maxMem);
                              memset(memPointer,0,maxMem);
                              free(memPointer);
                              }
                              maxMem+=oneG;
                              memPointer=malloc(maxMem);
                              }while(memPointer!=NULL);
                              maxMem-=oneG;
                              printf("Max Usable Memory aprox = %zi\n",maxMem);
                              memPointer=malloc(maxMem);
                              memset(memPointer,1,maxMem);
                              sleep(30);
                              return0;
                              }

                              But this can reach the VM RAM limit (64G or 128G) without any problem.
                              Same for the stress command....

                              stress -m 1 --vm-bytes 32G --vm-keep

                              So I'm running out of ideas... I can't figure out what makes NodeJS run OOM around 20G on these VMs....

                              I hope someone here has a clue about what is happening....

                              Thank you.

                              Minimal Reproduction

                              constfill=newArray(1000).fill('o').join('')constbufs=[]leti=0while(true){++ibufs.push(Array.from({length: 10*1024*1024},(_,i)=>i+fill))// console.log(i)}

                              The code just have to reach the OOM point.

                              Output

                              $ node --max-old-space-size=32000 --trace-gc index.js
                              [...traces]
                              [12808:0x6f27120] 146468 ms: Scavenge 19279.2 (19571.3) -> 19263.9 (19571.3) MB, 50.10 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
                              [12808:0x6f27120] 146787 ms: Scavenge 19317.6 (19610.3) -> 19302.1 (19610.5) MB, 35.85 / 0.00 ms (average mu = 0.831, current mu = 0.831) allocation failure;
                              Segmentation fault

                              Before You Submit

                              • I have looked for issues that already exist before submitting this
                              • My issue follows the guidelines in the README file, and follows the 'How to ask a good question' guide at https://stackoverflow.com/help/how-to-ask

                              Activity

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

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions