![Docker-compose // OCI 运行时创建失败 // pthread_create 失败](https://linux22.com/image/752693/Docker-compose%20%2F%2F%20OCI%20%E8%BF%90%E8%A1%8C%E6%97%B6%E5%88%9B%E5%BB%BA%E5%A4%B1%E8%B4%A5%20%2F%2F%20pthread_create%20%E5%A4%B1%E8%B4%A5.png)
最近我租了一个 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 的托管商(就像那样)!