打开的文件太多(ulimit已经更改)

sla*_*ker 14 socketexception ulimit

我正在使用tomcat 7和java 1.7开发debian服务器.这是一个收到多个TCP连接的应用程序,每个TCP连接都是java进程打开的文件.

看着/proc/pid of java/fd我发现,有时,打开文件的数量超过1024,当发生这种情况时,我会在catalina.out日志中找到stacktrace_SocketException: Too many open files_

我发现有关此错误的一切,人们都提到了ulimit,我已经改变了这个问题并且错误一直在发生.这是配置:

/etc/security/limits.conf

root    soft    nofile  8192
root    hard    nofile  8192
Run Code Online (Sandbox Code Playgroud)

/etc/sysctl.conf

fs.file-max = 300000
Run Code Online (Sandbox Code Playgroud)

ulimit -a命令返回:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 8192
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
Run Code Online (Sandbox Code Playgroud)

但是,当我检查java进程的限制时,它只有1024

/proc/pid of java/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             32339                32339                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       32339                32339                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us        
Run Code Online (Sandbox Code Playgroud)

如何增加Max open filesjava进程的数量?

sla*_*ker 19

我只是将行ulimit -n 8192放在catalina.sh中,所以当我这样做时catalina start,java会以上面指定的限制运行.

  • 您可能需要在`/ etc/security/limits.conf`中添加一行,然后才能以这种方式增加ulimit. (4认同)
  • 我认为我们应该避免为此修改catalina。当您升级 Catalina 时,您可以在新版本上忘记此更改。 (2认同)
  • 就像@mcoolive提到的那样,catalina.sh不是最好的地方.在你自己的脚本中包装catalina.sh,设置ulimit,然后启动tomcat.这样,当您升级tomcat时,您不会丢失ulimit设置. (2认同)

小智 10

ulimit值是在会话启动时分配的,因此更改/etc/security/limits.conf不会对已在运行的进程产生任何影响.非登录进程将从其父级继承ulimit值,就像环境变量的继承一样.

因此,在更改/etc/security/limits.conf之后,您需要注销并登录(以便您的会话具有新的限制),然后重新启动应用程序.只有这样,您的应用程序才能使用新限制.