Linux上的用户和Linux系统的打开文件数量是多少?

时间:2014-02-24 21:52:04

标签: linux unix lsof

很抱歉,这个问题有几层,但都涉及打开文件的数量。

我的应用程序日志中收到了“太多打开的文件”消息,我们正在开发的应用程序。有人建议我:

  1. 查找当前正在使用的打开文件数,系统范围和每位用户
  2. 查找系统和用户打开文件的限制。
  3. 我运行了ulimit -n并返回了1024.我还查看了/etc/limits.conf并且该文件中没有任何特殊内容。 /etc/sysctl.conf也未修改。我将列出以下文件的内容。我还运行了lsof | wc -l,它返回了5000多行(如果我正确使用它)。

    所以,我的主要问题是:

    1. 如何找到每位用户允许的打开文件数?软限制是在/etc/limits.conf中找到/定义的nofile设置吗?什么是默认值,因为我没有触及/etc/limits.conf?
    2. 如何在系统范围内找到允许的打开文件数?它是limits.conf中的硬限制吗?如果不修改limits.conf,默认号码是什么?
    3. ulimit为打开文件返回的数字是多少?它说1024但是当我运行lsof并计算线数时,它超过5000+所以有些东西没有点击我。是否应该运行其他cmds或查看文件以获得这些限制?在此先感谢您的帮助。
    4. limits.conf的内容

      # /etc/security/limits.conf
      #
      #Each line describes a limit for a user in the form:
      #
      #<domain>        <type>  <item>  <value>
      #
      #Where:
      #<domain> can be:
      #        - an user name
      #        - a group name, with @group syntax
      #        - the wildcard *, for default entry
      #        - the wildcard %, can be also used with %group syntax,
      #                 for maxlogin limit
      #
      #<type> can have the two values:
      #        - "soft" for enforcing the soft limits
      #        - "hard" for enforcing hard limits
      #
      #<item> can be one of the following:
      #        - core - limits the core file size (KB)
      #        - data - max data size (KB)
      #        - fsize - maximum filesize (KB)
      #        - memlock - max locked-in-memory address space (KB)
      #        - nofile - max number of open files
      #        - rss - max resident set size (KB)
      #        - stack - max stack size (KB)
      #        - cpu - max CPU time (MIN)
      #        - nproc - max number of processes
      #        - as - address space limit (KB)
      #        - maxlogins - max number of logins for this user
      #        - maxsyslogins - max number of logins on the system
      #        - priority - the priority to run user process with
      #        - locks - max number of file locks the user can hold
      #        - sigpending - max number of pending signals
      #        - msgqueue - max memory used by POSIX message queues (bytes)
      #        - nice - max nice priority allowed to raise to values: [-20, 19]
      #        - rtprio - max realtime priority
      #
      #<domain>      <type>  <item>         <value>
      #
      
      #*               soft    core            0
      #*               hard    rss             10000
      #@student        hard    nproc           20
      #@faculty        soft    nproc           20
      #@faculty        hard    nproc           50
      #ftp             hard    nproc           0
      #@student        -       maxlogins       4
      
      # End of file
      

      sysctl.conf的内容

      # Controls IP packet forwarding
      net.ipv4.ip_forward = 0
      
      # Controls source route verification
      net.ipv4.conf.default.rp_filter = 1
      
      # Do not accept source routing
      net.ipv4.conf.default.accept_source_route = 0
      
      # Controls the System Request debugging functionality of the kernel
      kernel.sysrq = 0
      
      # Controls whether core dumps will append the PID to the core filename
      # Useful for debugging multi-threaded applications
      kernel.core_uses_pid = 1
      
      # Controls the use of TCP syncookies
      net.ipv4.tcp_syncookies = 1
      
      # Controls the maximum size of a message, in bytes
      kernel.msgmnb = 65536
      
      # Controls the default maxmimum size of a mesage queue
      kernel.msgmax = 65536
      
      # Controls the maximum shared segment size, in bytes
      kernel.shmmax = 68719476736
      
      # Controls the maximum number of shared memory segments, in pages
      kernel.shmall = 4294967296
      
      # the interval between the last data packet sent and the first keepalive probe
      net.ipv4.tcp_keepalive_time = 600
      
      # the interval between subsequential keepalive probes
      net.ipv4.tcp_keepalive_intvl = 60
      
      # the interval between the last data packet sent and the first keepalive probe
      net.ipv4.tcp_keepalive_time = 600
      
      # the interval between subsequential keepalive probes
      net.ipv4.tcp_keepalive_intvl = 60
      
      # the number of unacknowledged probes to send before considering the connection dead and notifying the application layer
      net.ipv4.tcp_keepalive_probes = 10
      
      # the number of unacknowledged probes to send before considering the connection dead and notifying the application layer
      net.ipv4.tcp_keepalive_probes = 10
      
      # try as hard as possible not to swap, as safely as possible
      vm.swappiness = 1
      fs.aio-max-nr = 1048576
      #fs.file-max = 4096
      

1 个答案:

答案 0 :(得分:3)

没有每用户文件限制。您需要注意的是系统范围和每个进程。每个进程的文件数量乘以每个用户的进程限制理论上可以提供每个用户的文件限制,但是使用正常值时,产品将会非常大,以至于无限制。

此外,lsof的最初目的是LiSt Open Files,但它已经增长并且现在列出了其他东西,比如cwd和mmap region,这是它输出比你想象的更多行的另一个原因。

错误消息“打开的文件太多”与errno值EMFILE相关联,每个进程限制,在您的情况下似乎是1024.如果您能找到正确的选项将lsof限制为仅显示单个进程的实际文件描述符,你可能会发现它们有1024个,或者非常接近的东西。

这些天很少需要手动调整系统范围的文件描述符限制,因为它的默认值与内存成比例。如果需要,您可以在/proc/sys/fs/file-max找到该信息,并在/proc/sys/fs/file-nr找到有关当前使用情况的信息。您的sysctl文件的4096值为file-max,但它已被注释掉,因此您不应该认真对待它。

如果您设法达到系统范围的限制,您将获得错误ENFILE,这将转换为错误消息“文件表溢出”或“系统中打开的文件过多”。