/proc/sys/kernel/threads-max 系统最大线程数量 /proc/sys/vm/max_map_count 限制一个进程可以拥有的VMA(虚拟内存区域)的数量 /proc/sys/kernel/pid_max 系统最大进程数量
默认情况下,执行ulimit -a,可以看到
open files (-n) 1024
我们如何来验证这个1024的真实性呢?
写了个简单的测试程序分享如下:
1、先创建文件数量100000个,用shell
mkdir ./filedir i=0 while [ $i -lt 100000 ] ; do touch ./filedir/f_$i o_file=./filedir/f_$i echo "$o_file" echo "file$i" > ./filedir/f_$i i=$(($i+1)) #echo $i done
该程序创建filedir目录下名为f_i的文件,i为文件编号,执行该程序,可以在filedir下生成f_0—f_100000的文件
下面我们写个c程序来测试到底我们在默认情况下可否同时打开这100000个文件,代码如下:
~]$ cat test_openfiles.c #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define MAX_FILES 100000 int main() { int i = 0; int fd; char a[8]; int count = 0; for (i = 0; i < MAX_FILES; i++) { char buf[24] = "./filedir/f_"; sprintf(a, "%d", i); strcat(buf, a); printf("file_name:%s ", buf); fd = open(buf, O_RDWR); if (fd != -1) { count++; printf("==fd:%d== ", fd); printf("Opened %d files ", count); } else { printf("Error, can only open %d files ", count); return 0; } } return 0; }
编译这个c文件
gcc test_openfiles.c
会生成一个a.out的文件
执行./a.out
输出结果如下:
==fd:1020==
Opened 1018 files
file_name:./filedir/f_1018
==fd:1021==
Opened 1019 files
file_name:./filedir/f_1019
==fd:1022==
Opened 1020 files
file_name:./filedir/f_1020
==fd:1023==
Opened 1021 files
file_name:./filedir/f_1021
Error, can only open 1021 files
测试发现最大只能打开1021个文件
调整最大打开文件数
修改/etc/security/limits.conf ,在最后面添加如下:
* - nofile 1048576
重新登录终端生效
[tuser@localhost ~]$ exit
logout
[root@localhost ~]# su - tuser
Last login: Tue Oct 16 09:18:01 CST 2018 on pts/2
[tuser@localhost ~]$ ulimit -n
1048576
再次执行./a.out文件
file_name:./filedir/f_99995
==fd:99998==
Opened 99996 files
file_name:./filedir/f_99996
==fd:99999==
Opened 99997 files
file_name:./filedir/f_99997
==fd:100000==
Opened 99998 files
file_name:./filedir/f_99998
==fd:100001==
Opened 99999 files
file_name:./filedir/f_99999
==fd:100002==
Opened 100000 files