我们有一个基于 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 设置新资源限制的帖子,例如:
我尝试关注这篇文章并设置
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 中更改的限制,以允许此设置工作)并且现在一切正常。