Вопрос или проблема
Недавно я арендовал VPS в качестве частной площадки и для изучения Docker. Я хочу разместить несколько веб-сервисов за nginx-proxy вместе с
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
, например, при попытке запустить joomla как compose-проект с MySQL:
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 failed. Когда появляется эта ошибка, я не могу больше ничего сделать. См. следующий пункт:
Дополнительно и в связи с этим, иногда я получаю странные ошибки в консоли при вводе любой команды. Когда сервер находится в этом состоянии, я не могу ни стать root, ни перезагрузить его через командную строку. Вы можете увидеть, как я пытаюсь ввести sudo
на этой картинке: Ошибки с любой командой. Даже с выключением или перезагрузкой
Что я пробовал
- Я видел этот отчет на Github и еще несколько других, в которых упоминается максимальное ограничение задач на машине. Я уже установил это на более высокий объем, а также на
бесконечность
, но это не помогает. (Я однажды изменил это в/etc/systemd/system.conf
, а также с помощьюsystemctl edit docker.service
).
$ systemctl show --property=DefaultTasksMax
DefaultTasksMax=4659
$ systemctl status docker
...
Tasks: 52
...
-
Я установил точно такую же систему на свой ноутбук (за исключением программного обеспечения виртуализации – VPS работает на Virtuozzo, локально я использовал Quemu с virt-manager) – и все работает как ожидалось!
-
Проблемы возникают с любым контейнером, который я пытаюсь запустить.
hello-world
, другой compose-проект или уже построенный проект… -
Я связался с моим хостинг-провайдером, они также сослались на вышеприведенную проблему и сказали, что они не ограничивают использование.
Теперь я нашел проблему: Хостинг-провайдер ограничивает количество задач на виртуальных машинах. Эта техника называется user beancounters.
Есть файл, где вы можете проверить эти лимиты, установленные Virtuozzo, по адресу /proc/user_beancounters
Таким образом, когда вы знаете, что ваш VPS размещен на Virtuozzo, вы можете cat
этот файл или использовать один из скриптов с этого ресурса для чтения этих ограничений ресурсов.
Файл в основном описывает 3 поля:
- held: текущее использование ресурса
- failcnt: количество всех отказов в выделении ресурса
- barrier/limit: управляющий параметр, который обычно определяет нормальную границу выделения ресурсов
(скопировано отсюда)
Если отображаемое значение в любом поле невероятно высокое, это означает, что эти ресурсы не ограничены.
Ключевой строкой в моем случае была numprocs
. Она указывает максимальное количество задач, которое может выполнять машина. И так как процессы в контейнере Docker также выполняются на том же ядре, что и хост, они все учитываются.
Таким образом, единственным решением здесь было переключиться на другого провайдера, который не использует Virtuozzo.
.
Ответ или решение
Решение проблемы с ошибкой Docker-compose: OCI runtime create failed
и pthread_create failed
на основе ограничений Virtuozzo
Вы столкнулись с проблемой запуска более чем 8 контейнеров на вашем VPS, при этом получая ошибки типа OCI runtime create failed
и pthread_create failed
. Проблема выражается также в невозможности выполнять команды в терминале при достижении определенного порога контейнеров. Рассмотрим, почему это происходит и что с этим можно сделать.
Причины ошибки
Ваш VPS работает под управлением Virtuozzo, который накладывает ограничения на количество процессов через механизм, известный как user beancounters. Это приводит к тому, что каждый процесс в контейнере также учитывается как процесс на хосте. Таким образом, достигается лимит numprocs
, установленный провайдером. Ваша конфигурация сервера (4GB vRAM, 4vCores, Ubuntu 18.04.4 LTS) с Docker и Docker-compose определенной версии может привести к исчерпанию доступных процессов при запуске дополнительных контейнеров.
Диагностика проблемы
Ознакомьтесь с текущими ограничениями, установленными Virtuozzo, введя команду:
cat /proc/user_beancounters
Обратите внимание на показатель numprocs
. В поле failcnt
вы увидите, как часто были отказы из-за превышения лимита.
Возможные решения
-
Изменение виртуального провайдера: Поскольку Virtuozzo накладывает эти ограничения, рассмотрите возможность перехода на другого поставщика, который не использует Virtuozzo. Virtualization технологии, такие как KVM или Xen, могут не иметь таких строгих ограничений.
-
Обращение к провайдеру: Попробуйте обратиться к вашему провайдеру хостинга с запросом об увеличении лимитов на количество процессов. Укажите им на проблему и попросите изменить настройки
user beancounters
, если это возможно. -
Оптимизация количества контейнеров: Постарайтесь уменьшить количество одновременно запущенных контейнеров, если это возможно. Консолидируйте функциональные возможности в меньшем количестве контейнеров.
Заключение
Проблема, с которой вы столкнулись, связана с ограничениями виртуализации, установленной провайдером на вашей VPS. Избежать это можно либо путем изменения провайдера, либо оптимизацией текущей конфигурации. Понимание взаимодействия Docker и ядра хоста в виртуализированной среде поможет вам избегать подобных проблем в будущем. Убедитесь, что ваш будущий провайдер сможет удовлетворить ваши требования по ресурсам без наложения нежелательных ограничений.