It depends on how big your processes are, and whether or not you have
kernel safety features turned on.

For example, if I have a 500M program that tries to run a program that
fits in 30K of space, I still have to have 500M of free memory to run it.
why?  The way UNIX creates processes is by forking before execing.
Forking creates two IDENTICAL copies of a process, with the only
difference between the ttwo being the return value of fork().  That means
it has to copy the ENTIRE process in order to fork, so you have to have
that much memory available (it doesn't physically copy it - it's got lots
of nifty optimizations including Copy-On-Write, but it has to at least
reserve the space first).  So, if you have a large process trying to run
external commands, that could easily bbe causing your problems.

There's some overcommit setting that you can turn off, but I forget what
this is.

Jon

On Thu, 2 Oct 2003, Tom Stevelt wrote:

>
> We are having issues with fork() failing sporadically -- but we can't
> figure what resource is short supply.
>
> This shows we still have 45 meg of ram available.
>
> rhd </home/tms/src/systest>$ free -m
>              total       used       free     shared    buffers     cached
> Mem:           123        113          9          0          4         30
> -/+ buffers/cache:         78         45
> Swap:          250         19        231
>
> This is the strace output from a test program.  Can anybody suggest how
> to tell which kernel parameter is in short supply?
>
> rhd </home/tms/src/systest>$ strace -f  -ores forktest 3
> fork failed, errno 12
> rhd </home/tms/src/systest>$
> rhd </home/tms/src/systest>$ cat res
> 4042  execve("./forktest", ["forktest", "3"], [/* 26 vars */]) = 0
> 4042  uname({sys="Linux", node="rhd", ...}) = 0
> 4042  brk(0)                            = 0x80497dc
> 4042  open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
> 4042  open("/etc/ld.so.cache", O_RDONLY) = 3
> 4042  fstat64(3, {st_mode=S_IFREG|0644, st_size=48658, ...}) = 0
> 4042  old_mmap(NULL, 48658, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40014000
> 4042  close(3)                          = 0
> 4042  open("/lib/i686/libc.so.6", O_RDONLY) = 3
> 4042  read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260Y\1"..., 512) = 512
> 4042  fstat64(3, {st_mode=S_IFREG|0755, st_size=1452984, ...}) = 0
> 4042  old_mmap(0x42000000, 1290052, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 
> 0x42000000
> 4042  old_mmap(0x42134000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 
> 0x134000) = 0x42134000
> 4042  old_mmap(0x42139000, 8004, PROT_READ|PROT_WRITE, 
> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x42139000
> 4042  close(3)                          = 0
> 4042  old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
> 0x40020000
> 4042  munmap(0x40014000, 48658)         = 0
> 4042  mmap2(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
> 0x40021000
> 4042  fork()                            = -1 ENOMEM (Cannot allocate memory)
> 4042  fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
> 4042  mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
> 0x40014000
> 4042  write(1, "fork failed, errno 12\n", 22) = 22
> 4042  munmap(0x40014000, 4096)          = 0
> 4042  _exit(22)                         = ?
> rhd </home/tms/src/systest>$
>
> Thanks - Tom
>
> -----Tom Stevelt--------------------Victory Wholesale Grocers-----------
>      [EMAIL PROTECTED]                    400 Victory Drive
>      513-746-1742 ext 1224          Springboro, OH 45066
> ------------------------------------------------------------------------
>
>
> --
> redhat-list mailing list
> unsubscribe mailto:[EMAIL PROTECTED]
> https://www.redhat.com/mailman/listinfo/redhat-list
>


-- 
redhat-list mailing list
unsubscribe mailto:[EMAIL PROTECTED]
https://www.redhat.com/mailman/listinfo/redhat-list

Reply via email to