On Wed, Oct 05, 2016 at 12:34:42PM -0400, Ted Unangst wrote: > If somebody writes a C program that demonstrates the problem, I'm happy to > take a look. I'm not installing erlang.
It has been ages since I wrote a C program from scratch, but here goes: #include <stdio.h> #include <unistd.h> #include <sys/mman.h> int main() { size_t len = 0; void *p1, *p2; printf("Pid: %ld\n", (long) getpid()); /* 12 GB PROT_NONE [anon] */ p1 = mmap(NULL, ((size_t)12) << 30, PROT_NONE, MAP_ANON, -1, 0); /* 200 MB read/write [anon] */ p2 = mmap(NULL, ((size_t)200) << 20, PROT_READ|PROT_WRITE, MAP_ANON, -1, 0); printf("p1: %p, p2: %p\n", p1, p2); fgetln(stdin, &len); } $ ulimit -a time(cpu-seconds) unlimited file(blocks) unlimited coredump(blocks) unlimited data(kbytes) 16777216 stack(kbytes) 8192 lockedmem(kbytes) 2612782 memory(kbytes) 10000 nofiles(descriptors) 1024 processes 1024 $ ./a.out Pid: 56334 p1: 0x1bcb47180000, p2: 0x1bca5f100000 # procmap 56334 : 00001BCA5F100000 204800K read/write [ anon ] : 00001BCB47180000 12582912K [ anon ] : And the symptom would be that the ulimit -m limit is not immediately enforced. The question is if that is a problem? Or rather if I can use the ulimit -m limit to prevent a process from taking all memory since I need to set a large ulimit -d size to do clever address comparision tricks in the Erlang VM. / Raimo Niskanen, Erlang/OTP, Ericsson AB