linux上的多个Java webapps总线程限制

GJ.*_*GJ. 3 java linux multithreading jvm out-of-memory

最近,当它们的线程总数达到1024时,我在同一台机器上观察到两个独立的 Java webapps 的“java.lang.OutOfMemoryError:无法创建新的本地线程” 。

我用来显示进程线程数的命令是: ps huH p $pid | wc -l

[root@vm119 ~]# ps huH p 11294 | wc -l
378
[root@vm119 ~]# ps huH p 11052 | wc -l
646
Run Code Online (Sandbox Code Playgroud)

在我的例子中,java webapps 实际上是从同一个 jar 文件的两个副本产生的 Java 守护进程。

在此实例中, 显示仍有大量可用 RAM vmstat。我还启动了另一个 java 代码(不断创建新线程,直到它出现 OutOfMemoryError 并打印出它创建的线程总数)以查看它可以创建多少个线程。预计它说它仍然可以创建31051个线程。这意味着当时操作系统仍然具有创建本机线程所需的本机资源。

两个 Java webapps 都使用以下 JVM 选项启动: -Xmx4096m -Xms512m -Xss256k

ulimit -a机器上:

[root@vm119 ~]# 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) 62810
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 100000
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) 62810
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
Run Code Online (Sandbox Code Playgroud)

我研究并遵循了“java.lang.OutOfMemoryError:无法创建新的本机线程”问题的正常调查程序,但找不到任何有用的东西。

两个 webapp 的 1024 个线程总数似乎很可疑……它们加起来为 1024 是意外吗?或者我错过了对操作系统或 JVM 的一些限制?

GJ.*_*GJ. 5

在 Aris2World 和 lenach87 的帮助下,我设法找到了我自己问题的答案。

其根本原因是由于 Linux 对进程的执行用户的最大用户进程 (NPROC) 限制。

我在调查期间以 root 身份登录,因此结果ulimit -a是 root:

[root@vm119 ~]# 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) 62810
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 100000
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) 62810
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
Run Code Online (Sandbox Code Playgroud)

但是,我应该检查的是 webapps 的执行用户的限制:

[root@vm119 ~]# su - user -c "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) 62810
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 100000
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) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
Run Code Online (Sandbox Code Playgroud)

为了更改我的执行用户的限制,我手动插入了两行

/etc/security/limits.conf

[root@vm119 ~]# cat /etc/security/limits.conf | grep user
user            soft    nproc   4096
user            hard    nproc   4096
Run Code Online (Sandbox Code Playgroud)