[afnog] Understanding the "Stack Size" ulimit Parameter wrt Multithreading

Gerald Begumisa gbegumisa at gmail.com
Wed Sep 3 17:35:43 UTC 2008


Hi,

I ran into an issue while stress testing a multithreaded application
and I was hoping I could find a few answers here.

I found the "stack size" ulimit parameter abit non-intuitive.  I found
that with the default stack size setting, the application could only
create about 300 threads after which the error "Cannot allocate
memory" is encountered.  Initially I thought that by increasing the
stack size setting, I would be able to create more threads, but this
was not the case, instead I could create fewer threads.  See demo
below (uses attached test.c program):

------->8----------
[root at switch34-billing tmp]# gcc -o tes test.c -lpthread
[root at switch34-billing tmp]# ulimit -s
10240
[root at switch34-billing tmp]# ./tes
Created thread 0
Created thread 1
...
Created thread 303
Created thread 304
Error creating thread 305: Cannot allocate memory
[root at switch34-billing tmp]# ulimit -s 4096
[root at switch34-billing tmp]# ./tes
Created thread 0
Created thread 1
...
Created thread 760
Created thread 761
Error creating thread 762: Cannot allocate memory
--------8<------

Therefore I figured that the stack size parameter should probably be
interpreted on a per-thread or per-process basis.  This meaning that a
bigger stack size meant fewer threads could be created (perhaps
because there is some kind of per-process memory limit). And likewise
a smaller stack size meaning more threads created.

My question is: which ulimit setting governs the per-process memory
limit? Any clues welcome - I may be interpreting this wrongly.  Below
is the output of "ulimit -a" for the same server:

------
[root at switch34-billing tmp]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
max nice                        (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 8192
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
max rt priority                 (-r) 0
stack size              (kbytes, -s) 4096
cpu time               (seconds, -t) unlimited
max user processes              (-u) 8192
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
file locks                      (-x) unlimited
----


Regards,
Gerald.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: test.c
Type: application/octet-stream
Size: 481 bytes
Desc: not available
URL: <http://afnog.org/pipermail/afnog/attachments/20080903/2792bc8c/attachment-0002.obj>


More information about the afnog mailing list