/proc/sys/vm/max_map_count 限制一个进程可以拥有的VMA(虚拟内存区域)的数量
/proc/sys/kernel/pid_max 系统最大进程数量
脚本
创建文件脚本
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
打开文件脚本
#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\n", buf);
fd = open(buf, O_RDWR);
if (fd != -1) {
count++;
printf("==fd:%d==\n", fd);
printf("Opened %d files\n", count);
} else {
printf("Error, can only open %d files\n", count);
getchar();
}
}
return 0;
}
ulimit 实验
修改ulimt值为655
[root@vxin9jaen3abtufl ~]# cat /etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 4096
root soft nproc unlimited
* soft nofile 655
* hard nofile 655
执行打开文件脚本
# gcc open.c
# ./a.out
...
...
Opened 649 files
file_name:./filedir/f_649
==fd:652==
Opened 650 files
file_name:./filedir/f_650
==fd:653==
Opened 651 files
file_name:./filedir/f_651
==fd:654==
Opened 652 files
file_name:./filedir/f_652
Error, can only open 652 files
新建立一个连接继续执行脚本
# gcc open.c
# ./a.out
...
...
Opened 649 files
file_name:./filedir/f_649
==fd:652==
Opened 650 files
file_name:./filedir/f_650
==fd:653==
Opened 651 files
file_name:./filedir/f_651
==fd:654==
Opened 652 files
file_name:./filedir/f_652
Error, can only open 652 files
多开几个窗口执行脚本
Opened 652 files
file_name:./filedir/f_652
Error, can only open 652 files
查看总文件打开数:
[lzh@vxin9jaen3abtufl ~]$ lsof -Pn -u lzh |wc -l
1429
结论:
使用root 执行脚本结果同上;
ulimit 值是限制的是单个进程的文件打开数,每重新打开一个进程都只能打开到最大655个文件;
且可以限制root用户
系统参数实验
将 ulimit的值改大改为65535;切忌不能超过nr_open 所设置的值
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15071
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
修改 /etc/sysctl.conf 并使其生效sysctl -p
fs.file-max = 60000
使用普通用户执行 打开文件脚本
Opened 56142 files
file_name:./filedir/f_56142
==fd:56145==
Opened 56143 files
file_name:./filedir/f_56143
==fd:56146==
Opened 56144 files
file_name:./filedir/f_56144
==fd:56147==
Opened 56145 files
file_name:./filedir/f_56145
Error, can only open 56145 files
新建立一个连接继续执行脚本;报错 Too many open file
[lzh@vxin9jaen3abtufl ~]$ ./a.out
-bash: start_pipeline: pgrp pipe: Too many open files in system
-bash: ./a.out: Too many open files in system
使用root用户继续执行脚本发现可执行成功无报错;直至ulimit限制才停止
Opened 65530 files
file_name:./filedir/f_65530
==fd:65533==
Opened 65531 files
file_name:./filedir/f_65531
==fd:65534==
Opened 65532 files
file_name:./filedir/f_65532
Error, can only open 65532 files
查看总文件打开数
[root@vxin9jaen3abtufl ~]# lsof -Pn |wc -l
139074
发现已经超过了sysctl.conf 中 file-max限制的值
总结:系统级file-max限制的是系统所有普通用户总打开文件数;但是不包括root用户以及某些系统级用户;
单进程文件打开数:
如果需要限制用户(包括root)单进程文件打开数需要在ulimit中进行设置;
open_nr也是限制单进程文件打开数的参数;由于ulimit的值不能大于open_nr;且ulimit存在默认值,我认为open_nr的值可以设置很大以避免ulimit的值没注意超过了open_nr的值导致出现问题
系统总文件打开数(不含root所打开文件数):
如果需要限制系统总文件打开数需要在sysctl.conf的fs.file-max参数进行设置;但无法限制root及某些系统级用户的总文件打开数
fs.file-max参数不会限制root用户,也不会限制系统服务相关的用户,例如Apache、MySQL等服务运行所需的用户也不受该参数的限制。
暂未找到可以限制root总文件打开数的方法