同事反映:Linux上启动tomcat后,测试几分钟就报错,这时登录主机报如下错误:
-bash: fork: retry: Resource temporarily unavailable
这个问题很常见,很有可能是操作系统资源限制导致的。由于这套程序已经在相同配置的其它服务器上运行
有几年了。由于是功能测试,并且程序没有改动过,基本上排除了程序的bug导致。
首先用root用户kill掉java进程。这时用普通用户就可以正常登录Linux了。
ulimit -a 检查系统参数,并经同事确认,这些设置也都正常。
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) 22948
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 10240
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 16384
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
于是同事继续查找问题的根本原因,经多次测试没找到原因,同事再次寻求帮助。
让同事重现一下错误:
1.登录系统,启动tomcat,客户端开始模拟调用程序。几分钟后系统便无法登录。
检查同事启动的脚本,发现启动其中的一个java程序时用到了sudo命令,问其原因,是因为需要程序中
要监听网卡的信息,所以需要用root的身份启动。
这时突然想到了问题的原因,会不会是root用户对系统资源的使用有限制。
ulimit -a 一看,果然是默认配置。
在/etc/security/limits.conf 中添加如下信息后,重启应用,问题解决。
root soft nproc 8192
root hard nproc 16384
root soft nofile 10240
root hard nofile 65536
root soft stack 10240