Docker-compose // OCI 运行时创建失败 // pthread_create 失败

Docker-compose // OCI 运行时创建失败 // pthread_create 失败

最近我租了一个 VPS 作为私人游乐场,用于学习 docker。我想在 nginx-proxy 后面托管一些 web 服务,以及 docker-letsencrypt-nginx-proxy-companion

设置

服务器运行 Ubuntu 18.04.4 LTS、Docker版本 19.03.6,构建 369ce74a3c,docker-compose版本 1.17.1,构建未知。

4GB vRAM,4vCores(硬件在 Intel Xeon 上运行)

问题

一旦我想运行超过 8 个容器,就会出现奇怪的错误。有几个不同的错误,我不能特别说出其中哪一个出现:

  • OCI runtime create failed例如,当尝试使用 mysql 以 compose-project 的形式启动 joomla 时:
ERROR: for joomla_joomladb_1  Cannot start service joomladb: OCI runtime create failed:
unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v1.linux/moby/741c[...]6e3/log.json:
no such file or directory): fork/exec /usr/sbin/runc: resource temporarily unavailable: unknown
  • socket reset
ERROR: for joomla_joomladb_1  Cannot start service joomladb: read unix @->@/containerd-shim/24f42b8[...]32fa1.sock:
read: connection reset by peer: unknown
  • pthread_create failed: Resource temporarily unavailable我现在没有相应的日志。如果错误再次发生,我会在这里发布它们。但有一行似乎总是parent id not found
  • fork 失败。出现此错误时,我什么也做不了。请参见下一点:

此外,与此相关的是,有时我在输入任何命令时,shell 上会出现一些奇怪的错误。当服务器处于这种状态时,我既不能通过 su 切换到 root,也不能通过命令行重新启动。您可以sudo在这张图片中看到我尝试输入的内容:任何命令出错。甚至关机或重启

我尝试过

  • 我见过Github 上的这份报告以及其他一些,并且指的是机器上的最大任务限制。我已经将其设置为更高的音量以及,infinity但所有这些似乎都没有帮助。(我曾经在/etc/systemd/system.conf以及中更改过它systemctl edit docker.service)。
$ systemctl show --property=DefaultTasksMax
 DefaultTasksMax=4659
$ systemctl status docker
...
  Tasks: 52
...
  • 我在我的笔记本电脑上安装了完全相同的系统(除了虚拟化软件 - VPS 在 Virtuozzo 上运行,本地我使用带有 virt-manager 的 Quemu) - 并且一切都按预期运行!

  • 我尝试启动的任何容器都会出现问题。hello-world,其他组合项目或已经构建的项目......

  • 我联系了我的托管服务提供商,他们也提到了上述问题并说他们不会限制任何使用。

答案1

现在我发现了问题:托管服务提供商限制了虚拟机的任务数量。这种技术被称为用户 beancounters

有一个文件,您可以在其中检查由以下人员设置的限制:维图佐/proc/user_beancounters

因此,当你知道你的 VPS 托管在 Virtuozzo 上时,你可以使用cat此文件或使用来自这里读取此资源限制。

该文件主要描述了3个字段:

  • 握住:资源的当前使用情况
  • 失败:所有被拒绝的资源分配的数量
  • 障碍/限制:控制参数,通常定义正常的资源分配边界

(摘自这里

如果任何字段显示的值非常高,则意味着这些资源没有受到强制限制。

对我来说,关键的一行是numprocs。它告诉机器允许运行的最大任务数。并且Docker 容器中的进程还可以运行相同的内核作为 VPS,全部算进去。

因此,唯一的解决方案是切换到另一个不使用 Virtuozzo 的托管商(就像那样)!

相关内容