最大文件描述符限制未遵守

最大文件描述符限制未遵守

我们的云系统使用 Java,最大文件描述符限制需要大于 1024。在我们的一个虚拟系统上,每次我们尝试进行此更改时,我都可以让它更改,并且它将在第一次重新启动后保持不变(尚未测试多次),但如果我们停止并启动 Java 应用程序,限制似乎会重置为 1024。

系统信息:Linux mx.xen16.node01002 3.1.0-1.2-xen #1 SMP 星期四 11 月 3 日 14:45:45 UTC 2011 (187dde0) x86_64 GNU/Linux

以下是我采取的步骤:

编辑 /etc/sysctl.conf 并附加 fs.file-max = 4096

应用之前,检查了进程 (PID 1530) 的限制:

root 1530 6.7 31.0 1351472 165244 pts/0 Sl 17:12 0:58 java

猫/proc/1530/限制

Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             unlimited            unlimited            processes
Max open files            1024                 1024                 files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       16382                16382                signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

现在我使用以下命令应用更改:

sudo sysctl-p

fs.file-max = 4096(好的,应该设置)

我现在重新启动

当系统重新启动时,Java 应用程序会自动启动,并使用新的 PID 再次检查限制。

Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             3818                 3818                 processes
Max open files            4096                 4096                 files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       3818                 3818                 signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

限制设置正确,但是如果我启动和停止 Java 应用程序,限制默认会恢复为 1024。Java 应用程序没有问题。这是全球多个相同的基于云的系统之一,每个系统都是这个系统的副本。此 VM 位于 Gigatux。我们在 Giga 有其他几个相同的系统,运行相同的操作系统、相同的版本、相同的应用程序和应用程序版本。只有这一个表现得很奇怪。请帮忙。

* 更新 *

我按照 David 的建议从 sysctl.conf 末尾删除了该语句。如果我发出 ulimit -n,限制确实设置为 4092。如果我查看 /etc/security/limits.conf,您也可以看到此处配置的限制。

*               hard    nofile          4096
*               soft    nofile          4096

但如果我重新启动 java 进程,它仍然默认回到 1024。

agent@mx:~$ cat /proc/2432/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             unlimited            unlimited            processes
Max open files            1024                 1024                 files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       16382                16382                signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us
agent@mx:~$ echo -n $SHELL ' '  && ulimit -n
/bin/bash  4096

* 更新 *

好的,我认为这可能已经修复。我做了以下更改:

*               hard    nofile          4096
*               soft    nofile          4096

返回以下内容:

root               hard    nofile          4096
root               soft    nofile          4096

问题似乎已得到解决

答案1

有两个地方设置了限制,您已经更改了其中一个(sysctl),但是您忘记了 Java 运行的 shell 环境也设置了自己的限制,该限制可能等于或小于系统限制:

composed-~$ echo -n $SHELL ' '  && ulimit -n
/usr/local/bin/bash  1024

因此,找出 Java 从哪个 shell 启动,并使用内置 shell 命令设置限制。例如 bash 中的“ulimit”。

答案2

好的,我认为这可能已经修复。我做了以下更改:

*               hard    nofile          4096
*               soft    nofile          4096

返回以下内容:

root               hard    nofile          4096
root               soft    nofile          4096

问题似乎已得到解决

相关内容