【问题标题】:Linux #open-file limitLinux #open-file 限制
【发布时间】:2011-10-25 14:49:32
【问题描述】:

我们正面临一个进程由于用完打开文件限制而卡住的情况。全局设置 file-max 设置得非常高(在 sysctl.conf 中设置)并且每个用户的值也在 /etc/security/limits.conf 中设置为高值。甚至 ulimit -n 在以无头用户(进程所有者)身份运行时也反映了每个用户的值。所以问题是,这种变化是否需要系统重启(我的理解是不需要)?有没有人遇到过类似的问题?我正在运行 ubuntu lucid 并且该应用程序是一个 java 进程。 #of ephemeral port range 也足够高,并且在问题期间检查时,该进程已打开 #1024(注意默认值)文件(由 lsof 报告)。

【问题讨论】:

  • 您不需要重新启动。尝试(以 root 身份) ulimit -Hn 100000, ulimit -Sn 100000 并在同一个 shell 下重新启动您的项目。您可能还想检查 /proc/sys/fs/file-max。

标签: linux


【解决方案1】:

您可能遇到的一个问题是select 使用的fd_set 被限制为 FD_SETSIZE,它在编译时固定(在本例中为 JRE),并且被限制为 1024。

#define FD_SETSIZE      __FD_SETSIZE
/usr/include/bits/typesizes.h:#define   __FD_SETSIZE        1024

幸运的是,c 库和内核都可以处理任意大小的fd_set,因此,对于已编译的 C 程序,可以提高该限制。

【讨论】:

  • 无论如何,您都应该使用 epool 之类的东西来处理 1000 多个文件。也许用 strace 运行看看 java 正在做什么系统调用。
【解决方案2】:

考虑到您已正确编辑sysctl.conf/etc/security/limits.conf 中的文件最大值;那么:

edit /etc/pam.d/login, adding the line: 
session required /lib/security/pam_limits.so

然后做

#ulimit -n unlimited

请注意,您可能需要注销并重新登录才能使更改生效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 2015-05-01
    • 2022-12-02
    • 2022-10-25
    相关资源
    最近更新 更多