【问题标题】:What are the number of open files for a user on linux and system wide for linux? [closed]linux 上用户的打开文件数和 linux 系统范围内的打开文件数是多少? [关闭]
【发布时间】:2014-03-26 19:51:30
【问题描述】:

对不起,这个问题有好几层,但都涉及打开文件的数量。

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

  1. 查找当前正在使用的打开文件的数量、系统范围和每个用户
  2. 找出系统和用户打开文件的限制。

我运行了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 或要查看的文件来获得这些限制?提前感谢您的帮助。

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

【问题讨论】:

  • 要思考一个问题:为什么打开的文件用完了?您是否真的需要一次打开 1024 个文件,或者您是否应该确保文件在完成后关闭。需要打开大量文件当然是有正当理由的,但不要因为资源泄漏而在一段时间后用完文件而增加限制。
  • @JonathanLeffler,感谢您的评论。我同意,我想弄清楚谁是罪魁祸首并阻止它。我会研究一下 lsof 看看我是否能找到那个过程。

标签: linux unix lsof


【解决方案1】:

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

此外,lsof 的最初目的是列出打开的文件,但它现在已经增长并列出了其他内容,例如 cwd 和 mmap 区域,这是它输出比您预期的更多行的另一个原因。

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

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

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

【讨论】:

  • 啊,好的,谢谢你让我知道发生了什么。所以我们没有达到系统范围的限制,而是进程限制,这就是抱怨的原因。
  • P.S.如果我无法弄清楚,我可能需要问你需要使用哪些 lsof 选项。
猜你喜欢
  • 2019-04-14
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多