使用4.3内核创建线程失败,并显示“资源暂时不可用”
我在带有多个容器的Arch Linux(内核4.3.3-2)上运行docker服务器。自从我上次重启以来,Docker服务器和容器中的随机程序都崩溃,并显示一条消息,提示无法创建线程或(较不频繁)进行分叉。根据程序的不同,特定的错误消息也有所不同,但是大多数错误消息似乎都提到了特定的错误Resource temporarily unavailable。有关某些示例错误消息,请参见本文末尾。 现在有很多人收到此错误消息,并对它们有很多响应。真正令人沮丧的是,每个人似乎都在猜测如何解决该问题,但是似乎没有人指出如何确定问题的许多可能原因中的哪一个。 我已经收集了以下5种可能的错误原因以及如何验证它们在我的系统上不存在的原因: 在/proc/sys/kernel/threads-max(source)中配置的线程数存在系统范围的限制。就我而言,该设置为60613。 每个线程都在堆栈中占用一些空间。堆栈大小限制是使用ulimit -s(source)配置的。我的壳的极限曾经是8192,但我已经通过将增加其* soft stack 32768成/etc/security/limits.conf,因此它ulimit -s现在的回报32768。我还通过将(source)添加LimitSTACK=33554432到docker进程中,并通过查看docker容器并在其中运行来验证该限制是否适用。/etc/systemd/system/docker.service/proc/<pid of docker>/limitsulimit -s 每个线程都会占用一些内存。使用来配置虚拟内存限制ulimit -v。在我的系统上,它设置为unlimited,并且我3 GB的内存中有80%可用。 使用的进程数有限制ulimit -u。在这种情况下,线程被视为进程(source)。在我的系统上,限制设置为30306,对于docker守护程序和docker容器内部,限制为1048576。可以通过运行ls -1d /proc/*/task/* | wc -l或通过运行ps -elfT | wc -l(source)找出当前正在运行的线程数。在我的系统上,它们介于700和之间800。 打开文件的数量有限制,根据某些来源的资料,在创建线程时这也很重要。限制是使用配置的ulimit -n。在我的系统和docker内部,限制设置为1048576。可以使用lsof | wc -l(source)找出打开的文件数,在我的系统上大约是30000。 上次重启之前,我正在运行内核4.2.5-1,现在我正在运行4.3.3-2。降级到4.2.5-1可以解决所有问题。其他提到问题的帖子是this和this。我已经打开了Arch Linux的错误报告。 内核中发生了什么变化可能导致这种情况? 以下是一些示例错误消息: Crash dump was written to: erl_crash.dump Failed to create aux thread …