我们基于云的系统使用Java,并且要求最大文件描述符限制大于1024。 在我们的一个虚拟系统上,每当我们尝试做出这个改变时,我都可以改变它,并且在第一次重启时它会保持不变(没有testing过多次),但是如果我们停止并启动我们的java应用程序,似乎重置为1024。
系统信息:Linux mx.xen16.node01002 3.1.0-1.2-xen#1 SMP Thu Nov 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应用程序。 这是世界上几个相同的基于云的系统之一,每个都是这个系统的副本。 该虚拟机驻留在Gigatux上。 在Giga上,我们还有其他几个相同的系统,运行相同的操作系统,相同的版本以及相同的应用和应用版本。 只有这一个行为奇怪。 请帮忙。
*更新*
根据David的build议,我从sysctl.conf的末尾删除了语句。 如果我发出ulimit -n,限制的确设置为4092.如果我查看/etc/security/limits.conf,你也可以看到在这里configuration的限制。
* 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
这个问题似乎已经解决了
有两个地方设置了限制,你已经改变了其中的一个(sysctl),但是你忘记了Java运行的shell环境也设置了自己的限制,这个限制可能等于或者小于系统限制:
composed-~$ echo -n $SHELL ' ' && ulimit -n /usr/local/bin/bash 1024
因此,找出从哪个shell启动,并使用内置shell命令设置限制。 例如bash中的“ulimit”。
好吧,我认为这可能是固定的。 我改变了以下内容:
* hard nofile 4096 * soft nofile 4096
回到以下内容:
root hard nofile 4096 root soft nofile 4096
这个问题似乎已经解决了