• linux系统下的用户文件句柄数限制


    linux系统下的用户文件句柄数限制

    为什么要修改用户打开的文件数

    系统默认单个进程可以打开1024个文件,对于一些应用如tomcat、oracle等,运行时经常open成千上万个文件,系统管理员需根据系统上运行的应用需求,修改系统文件数限制值。

    系统中除了有限制单个进程打开的文件数,还有全部进程打开的文件总数限制。打开的文件总数限制是系统跟据硬件配置推算出来的,所以不同系统上,总数限制值可能不相同,系统管理员也可以手动修改总数限制。

    在系统日志或终端上看到“resource temporarily unavaliable”报错信息时,一般是出现了单个进程打开的文件数达最大值、系统中打开文件总数达最大值、用户使用的进程(包括线程)数达最大值、文件系统满这四种情况中的一种。

    查看系统打开文件总数限制:

    # cat /proc/sys/fs/file-max

    1517258

    # sysctl -a | grep fs.file-max

    fs.file-max = 1517258

    查看系统当前打开文件总数:(粗略计算,此值略低于实际值)

    # lsof -n | wc -l

    13077

    临时修改系统打开文件总数限制:(立即生效,重启无效)

    # echo 1600000 > /proc/sys/fs/file-max

    永久修改系统打开文件最大值限制:

    # echo fs.file-max = 1600000 >> /etc/sysctl.conf

    # sysctl -w

    (sysctl -w命令,使/etc/sysct.conf配置内容立即生效)

    2. 修改用户文件句柄数

    (root用户不受限制)

    通过/etc/security/limits.conf修改用户的资源限制,包括文件数限制。例如:

    tiger soft nofile 4096 //设置tiger用户每个进程可以打开4096个文件(软限制)

    tiger hard nofile 4096 //设置tiger用户每个进程可以打开4096个文件(硬限制)

    tiger - nofile 4096 //设置tiger用户每个进程可以打开4096个文件(软硬限制)

    @sale - nofile 4096 //设置sale组用户每个进程可以打开4096个文件(软硬限制)

    * - nofile 4096 //默认值,如果用户与其他条目不匹配,则使用此设置

    说明:

    (1)如果软限制和硬限制的值不相同,则较小的那个值生效。

    (2)用户可以自行调整限制值,但不可超过硬限制。

    tiger soft nofile 4096

    tiger hard nofile 8192

    $ ulimit -n

    4096

    $ ulimit -n 8192

    $ ulimit -n

    8192

    $ ulimit -n 10240

    -bash: ulimit: open files: cannot modify limit: 不允许的操作

    3. 修改限制后什么时候生效

    修改/etc/security/limits.conf后,用户开启一个新的shell时生效。一般是用户exit退出登录,再次login。应用程序要使用更改后的配置,应用管理员需要在新shell中重启应用。

    有时候修改/etc/security/limits.conf后,配置没有生效。很多都是在重新编译安装了ssh服务后出现的。原因只有一个,就是用户会话是否使用了pam_limits.so模块。

    在/etc/pam.d目录,存放了pam配置文件,常见如下:

    login:用户通过终端登录时使用的pam配置文件

    sshd:用户通过ssh远程登录时使用的pam配置文件

    su:用户通过su切换用户时使用的pam配置文件

    sudo:用户通过sudo,以其他用户身份执行命令时的配置文件

    limits.conf修改后不生效时,管理员应该首先确认用户是以哪种方式打开会话的,然后在对应的pam配置文件中查找是否有“session required pam_limits.so”这项配置。如果没有,则limits.conf配置不会生效。“session required pam_limits.so”配置经常放在password-auth和system-auth,然后被其他配置文件include进来。

    # grep pam_limits.so /etc/pam.d/sshd

    # grep include /etc/pam.d/sshd

    auth include system-auth

    account include system-auth

    password include system-auth

    session include system-auth

    # grep pam_limits.so /etc/pam.d/system-auth

    session required pam_limits.so

    4. 是对用户单个进程打开的文件数限制

    (1)修改/etc/security/limits.conf,添加

    tiger - nofile 100 //限制用户每个进程打开的文件数为100

    (2)写一个程序,每秒打开一个文件(此处我引用一段朋友写的C代码)

    $ vi file.c

    #include

    #include

    #include

    #include

    main()

    {

    int fs;

    int i=0;

    char *filename;

    while(i

    fs=open(UTMP_FILE,O_RDONLY);

    printf("open %d files,the filedescriptor is %d ",i,fs);

    i++;

    sleep(1);

    }

    }

    # gcc file.c –o file

    # chmod 755 file

    (3)多打开几个终端,同时运行该程序

    $ ./file

    并行运行多个file程序,你会发现每个file程序都可以打开100个文件,然后报打开文件失败。

    共享同一进程号的所有线程,打开的文件总数不能超过单个进程限制值。

  • 相关阅读:
    protected、public、private
    第十五章 面向对象程序设计
    第十四章 重载运算与类型转换
    聚合类
    explicit构造函数
    allocator类
    直接管理内存——new和delete
    智能指针
    Bugku-CTF之点击一百万次
    Bugku-CTF之flag在index里
  • 原文地址:https://www.cnblogs.com/as007012/p/10030987.html
Copyright © 2020-2023  润新知