关于 ulimit 和file-max 对文件打开数限制实验

/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总文件打开数的方法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值