java.lang.OutOfMemoryError:无法创建新的本机线程:从 Ubuntu 14.04 升级到 Ubuntu 16.04 后

java.lang.OutOfMemoryError:无法创建新的本机线程:从 Ubuntu 14.04 升级到 Ubuntu 16.04 后

我们有一个基于 Lucene 的分布式 Java 搜索引擎,它通常运行多个进程,每个进程在大约 100 个主机上都有自己的线程池,但我们有一个开发部署,可以在用于开发的单个 64GB 双六核工作站上运行。

我们已经在具有高 ulimit 设置的这些开发工作站上成功运行了 Ubuntu 14.04:

gada@C010390:~$ 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) 256189
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 51200
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) 256189
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

所有搜索引擎进程均由单个进程的脚本启动。

我们最近升级到了 Ubuntu 16.04,现在遇到了:java.lang.OutOfMemoryError: unable to create new native thread尝试启动所有必需进程时出错。我在 Google 上搜索,看到有关 systemd 设置新资源限制的帖子,例如:

https://unix.stackexchange.com/q/253903/creating-threads-fails-with-resource-temporarily-unavailable-with-4-3-kernel

我尝试关注这篇文章并设置

DefaultTasksMax=infinity
TasksMax=infinity
UserTasksMax=infinity

在下面的:

/etc/systemd/system.conf
/etc/systemd/user.conf
/etc/systemd/logind.conf

并重新启动但似乎没有任何效果。

我检查了 dpkg 而且似乎正在运行systemd 229-4ubuntu7

gada@C010390:~$ dpkg -l systemd
...
ii  systemd                                  229-4ubuntu7              amd64                     system and service manager

根据这篇文章:

https://bugs.launchpad.net/charms/+source/percona-cluster/+bug/1578080

新的 systemd 进程限制已在 中恢复229-4ubuntu6,但我仍然遇到问题。

有人能帮我诊断一下是哪个系统资源限制阻止我在 Ubuntu 16.04 中创建新的 Java 线程,以及如何消除此限制吗?我认为这是由于某些 systemd 限制造成的,因为这是 Ubuntu 14.04 和 16.04 之间的巨大差异,但我不确定,也不知道 16.04 中还有什么其他东西会限制线程创建。在此先感谢您的帮助。

答案1

我们遇到了相同的问题,根本原因似乎是 logind.conf 不支持“无穷大”。相反,您应该使用精确限制(例如UserTasksMax=32000)。

最新版本中似乎已经修复了这个问题(https://github.com/systemd/systemd/issues/3833),但至少我们的Ubuntu 16.04有不支持的版本infinity

答案2

问题确实是 Ubuntu 16.04 中有一个新的 systemd logind 任务限制,并且

UserTasksMax=infinity

按照用户 Matti K 的建议,在 /etc/systemd/logind.conf 中未被接受。我将其更改为

UserTasksMax=51200

以匹配打开文件的 ulimit 数量(我们在 Ubuntu 14.04 中更改的限制,以允许此设置工作)并且现在一切正常。

相关内容