Difference between revisions of "Is my ulimit exceeded"

From Linuxintro
imported>ThorstenStaerk
imported>ThorstenStaerk
Line 19: Line 19:
 
  *                hard    nofile          10000
 
  *                hard    nofile          10000
 
  * soft    nofile          10000
 
  * soft    nofile          10000
 +
 +
If you read [http://ss64.com/bash/ulimit.html ulimit's man page] take care: ulimit -v is flagged as per-process limit, however -n is also a per-process limit. In the above case, every process can have up to 1024 file descriptors. You can check this with a simple C program that does nothing but open files:
 +
 +
'''main.c'''
 +
<pre>
 +
#include <stdio.h>
 +
 +
int main()
 +
{
 +
  FILE *handle;
 +
  for (int i=1;i<2000;i++)
 +
  {
 +
    if (!(handle=fopen("testfile", "wb"))) {printf("this did not work\n");};
 +
  }
 +
  while (true){};
 +
  char x[1];
 +
  fwrite(x,1,1,handle);
 +
}
 +
</pre>
 +
 +
Compile this file with the command
 +
g++ main.c
 +
 +
Run this program (and send it to the background) then with the command
 +
./a.out &
 +
 +
Now find out the process ID:
 +
# ps -A|grep a.out
 +
29232 pts/3    00:04:15 a.out
 +
 +
Now go into the process' file descriptor directory:
 +
cd /proc/29232/fd
 +
 +
And count the number of files:
 +
# ll | wc -l
 +
1025
 +
 +
If you want to, find out if the process has drawn the right limits value:
 +
# cat /proc/29232/limits|grep open
 +
Max open files            1024                4096                files

Revision as of 14:00, 19 May 2015

Ulimit is a bash command that allows you to set and read shell restrictions (limits) like the maximum number of open files that are allowed for the user:

# ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
pending signals                 (-i) 32768
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
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 32768
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

You can permanently set the limits in /etc/security/limits.conf. You will have to re-login afterwards. To set the number of file descriptors for all users, the syntax is:

*                hard    nofile           10000
*		 soft    nofile           10000

If you read ulimit's man page take care: ulimit -v is flagged as per-process limit, however -n is also a per-process limit. In the above case, every process can have up to 1024 file descriptors. You can check this with a simple C program that does nothing but open files:

main.c

#include <stdio.h>

int main()
{
  FILE *handle;
  for (int i=1;i<2000;i++)
  {
    if (!(handle=fopen("testfile", "wb"))) {printf("this did not work\n");};
  }
  while (true){};
  char x[1];
  fwrite(x,1,1,handle);
}

Compile this file with the command

g++ main.c 

Run this program (and send it to the background) then with the command

./a.out &

Now find out the process ID:

# ps -A|grep a.out
29232 pts/3    00:04:15 a.out

Now go into the process' file descriptor directory:

cd /proc/29232/fd

And count the number of files:

# ll | wc -l
1025

If you want to, find out if the process has drawn the right limits value:

# cat /proc/29232/limits|grep open
Max open files            1024                 4096                 files