linux 上的多个 Java webapps 总线程限制
Multiple Java webapps total thread limit on linux
最近我在同一台机器上观察到两个独立 Java webapps 的 "java.lang.OutOfMemoryError: unable to create new native thread",当它们的线程总数达到 1024 时。
我用来显示进程线程数的命令是:ps huH p $pid | wc -l
[root@vm119 ~]# ps huH p 11294 | wc -l
378
[root@vm119 ~]# ps huH p 11052 | wc -l
646
在我的例子中 java 网络应用程序实际上是 Java 守护进程从同一个 jar 文件的两个副本产生。
在此实例发生时,vmstat
显示仍有大量空闲 RAM。我还启动了另一个 java 代码(不断创建新线程,直到出现 OutOfMemoryError 并打印出它创建的线程总数)以查看它可以创建多少个线程。 预计,它说它仍然可以创建31051个线程。这意味着OS当时仍然有创建本地线程所需的本地资源。
两个 Java 网络应用程序都使用以下 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
我研究并遵循了 "java.lang.OutOfMemoryError: unable to create new native thread" 问题的正常调查程序,但找不到任何有用的东西。
两个webapps的1024个线程总数看起来很可疑...他们加起来是1024个是不是意外?或者我错过了 OS 或 JVM 的一些限制?
在 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
然而,我应该检查的是 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
为了更改我的执行用户的限制,我手动插入了两行
/etc/security/limits.conf
[root@vm119 ~]# cat /etc/security/limits.conf | grep user
user soft nproc 4096
user hard nproc 4096
最近我在同一台机器上观察到两个独立 Java webapps 的 "java.lang.OutOfMemoryError: unable to create new native thread",当它们的线程总数达到 1024 时。
我用来显示进程线程数的命令是:ps huH p $pid | wc -l
[root@vm119 ~]# ps huH p 11294 | wc -l
378
[root@vm119 ~]# ps huH p 11052 | wc -l
646
在我的例子中 java 网络应用程序实际上是 Java 守护进程从同一个 jar 文件的两个副本产生。
在此实例发生时,vmstat
显示仍有大量空闲 RAM。我还启动了另一个 java 代码(不断创建新线程,直到出现 OutOfMemoryError 并打印出它创建的线程总数)以查看它可以创建多少个线程。 预计,它说它仍然可以创建31051个线程。这意味着OS当时仍然有创建本地线程所需的本地资源。
两个 Java 网络应用程序都使用以下 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
我研究并遵循了 "java.lang.OutOfMemoryError: unable to create new native thread" 问题的正常调查程序,但找不到任何有用的东西。
两个webapps的1024个线程总数看起来很可疑...他们加起来是1024个是不是意外?或者我错过了 OS 或 JVM 的一些限制?
在 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
然而,我应该检查的是 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
为了更改我的执行用户的限制,我手动插入了两行
/etc/security/limits.conf
[root@vm119 ~]# cat /etc/security/limits.conf | grep user
user soft nproc 4096
user hard nproc 4096