zoukankan      html  css  js  c++  java
  • linux 文件描述符

    文件描述符是什么?和文件句柄有啥区别?
    文件描述符是linux/unix操作系统中特有的概念。相当于windows系统中的文件句柄。一个意思不同叫法。
    Linux系统中, 每当进程打开一个文件时,系统就为其分配一个唯一的整型文件描述符,用来标识这个文件。标准C中每个进程默认打开的有三个文件,标准输入,标准输出,标准错误,分别用一个FILE结构的指针来表示,即stdin,stout,sterr,这三个结构分别对应着三个文件描述符0,1,2。
    文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。linux 操作系统通常对每个进程l能打开的文件数量有一个限制。
    linux系统对文件描述符的限制有两个级别
    系统级别,使用cat /proc/sys/fs/file-max查看,默认值是根据内存大小,系统自动设置的,一般为内存大小(KB)的10%,shell下可以这样计算grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}'(可能有各种其他原因导致file-max没有设置为内存的10%)
    进程级别(也叫用户级别),默认是1024,使用ulimit -n查看
    为什么要限制打开的文件描述符?
    原因1 – 资源问题:每个打开的文件都需要消耗内存来管理,而内存是有限的。
    原因2 – 安全问题:如果不限制的话,有不怀好心的人启动一个进程来无限的创建和打开新的文件,会让服务器崩溃。
    所以限制文件描述符的数量对于linux系统的稳定性是非常重要的。
    配置文件
    限制资源使用的配置文件是 /etc/security/limits.conf,和/etc/security/limits.d/目录,/etc/security/limits.d/里面配置会覆盖/etc/security/limits.conf的配置
    可以限制的资源类型如下:

    所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。


    hard和soft的区别: soft是一个警告值,而hard则是一个真正意义的阀值,超过就会报错,一般情况下都是设为同一个值。
    第一列表示用户和组(@开头)。第二列表示软限制还是硬限制,第三列表示限制的资源类型,第四列表示限制的最大值
    core是内核文件,nofile是文件描述符,noproc是进程,一般情况下只限制文件描述符数和进程数就够了

    #<domain>      <type>  <item>         <value>
    #

    #*               soft    core            0
    #root            hard    core            100000
    #*               hard    rss             10000
    #@student        hard    nproc           20
    #@faculty        soft    nproc           20
    #@faculty        hard    nproc           50
    #ftp             hard    nproc           0
    #ftp             -       chroot          /ftp
    #@student        -       maxlogins       4

    # End of file

    -----------分割线,上面是配置文件的模板,下面是自己添加的------------------------

    *        soft  nofile         655350      #表示任何一个用户可以打开的最大的文件描述符数量
    *        hard    nofile         655350

    *        soft    nproc          655350      #表示任何一个用户可以打开的最大的进程数
    *          hard    nproc          655350


    @student        hard    nofile          65535       #student组中的任何人最多能打开文件描述符数量是65535,并且会在打开65000个时发出警告
    @student        soft    nofile          65000

    @student        hard    nproc           50         #student组中的任何人不能拥有超过50个进程,并且会在拥有30个进程时发出警告
    @student        soft    nproc           30
    1234567891011121314151617181920212223242526272829
    系统级别
    1、查看
    $ cat /proc/sys/fs/file-max
    186405
    12
    2、设置
    临时性
    $ echo 1000000 > /proc/sys/fs/file-max
    1
    永久性
    在/etc/sysctl.conf中设置,应该设什么值是最佳实践?比如8G的内存,设为8192/2 * 256 = 524288
    fs.file-max = 1000000
    1
    进程级别
    1、查看,-n默认查看的是soft limit,这个值是从/etc/security/limits.conf文件的* soft nofile 655350来的
    $ ulimit -n
    170000
    12
    查看hard limit
    $ ulimit -Hn
    170000
    12
    2、设置
    临时性:
    通过ulimit -Sn设置最soft limit,注意soft limit必须小于hard limit
    $ ulimit -Sn 160000
    1
    通过ulimit -Hn设置最Hard limit
    $ ulimit -Hn 160000
    1
    同时设置soft limit和hard limit。对于非root用户只能设置比原来小的hard limit。
    ulimit -n 180000
    1
    永久性:
    root权限下,在/etc/security/limits.conf中添加如下两行,*表示所有用户,重启生效
    * soft nofile 102400

    * hard nofile 104800
    123

    注意:设置nofile的hard limit还有一点要注意的就是hard limit不能大于/proc/sys/fs/nr_open,假如hard limit大于nr_open,注销后将无法正常登录。


    查看系统当前打开的文件描述符数量
    其中第一个数表示当前系统分配后已使用的文件描述符数,第二个数表示分配后为使用的(内核2.6版本中这个值总是为0,这并不是一个错误,它意味着已经分配的文件描述符总会被使用),第三个数等于file-max。
    $ sudo cat /proc/sys/fs/file-nr
    2176 0 2048000
    12
    查看某个进程打开的文件描述符数量
    $ lsof -p 20262 |wc -l
    5
    12
    根据用户创建的进程数排序
    ps h -Led -o user | sort | uniq -c | sort -n

          1 chrony
          1 dbus
          1 hanli
          1 hanli2
          1 nginx
          2 postfix
          4 named
          4 puppet
          6 polkitd
          6 redis
         21 mysql
        125 root
    1234567891011121314
    总结

    /proc/sys/fs/file-max限制不了/etc/security/limits.conf
    只有root用户才有权限修改/etc/security/limits.conf
    对于非root用户, /etc/security/limits.conf会限制ulimit -n,但是限制不了root用户
    对于非root用户,ulimit -n只能越设置越小,root用户则无限制
    任何用户对ulimit -n的修改只在当前环境有效,退出后失效,重新登录新来后,ulimit -n由limits.conf决定
    如果limits.conf没有做设定,则默认值是1024
    当前环境的用户所有进程能打开的最大问价数量由ulimit -n决定
    ---------------------
    作者:fanren224
    来源:CSDN
    原文:https://blog.csdn.net/fanren224/article/details/79971359
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    matlab学习笔记10_7数值计算类型和常用计算公式
    matlab学习笔记10_5 通用字符串操作和比较函数
    matlab学习笔记10_6 字符串与数值间的转换以及进制之间的转换
    matlab-数组取值
    matlab学习笔记10_4MATLAB中的字符串表示
    matlab学习笔记10_3关系运算符和逻辑运算符
    matlab学习笔记10_2 一般操作符
    matlab学习笔记10 一般运算符
    matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色
    matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象
  • 原文地址:https://www.cnblogs.com/ruiy/p/10761004.html
Copyright © 2011-2022 走看看