我们的云系统使用 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
问题似乎已得到解决