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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    leetcode 1301. 最大得分的路径数目
    LeetCode 1306 跳跃游戏 III Jump Game III
    LeetCode 1302. 层数最深叶子节点的和 Deepest Leaves Sum
    LeetCode 1300. 转变数组后最接近目标值的数组和 Sum of Mutated Array Closest to Target
    LeetCode 1299. 将每个元素替换为右侧最大元素 Replace Elements with Greatest Element on Right Side
    acwing 239. 奇偶游戏 并查集
    acwing 238. 银河英雄传说 并查集
    acwing 237程序自动分析 并查集
    算法问题实战策略 MATCHORDER 贪心
    Linux 安装Redis全过程日志
  • 原文地址:https://www.cnblogs.com/ruiy/p/10761004.html
Copyright © 2011-2022 走看看