Docker-compose // Ошибка создания среды выполнения OCI // ошибка pthread_create

Вопрос или проблема

Недавно я арендовал 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 вы увидите, как часто были отказы из-за превышения лимита.

Возможные решения

  1. Изменение виртуального провайдера: Поскольку Virtuozzo накладывает эти ограничения, рассмотрите возможность перехода на другого поставщика, который не использует Virtuozzo. Virtualization технологии, такие как KVM или Xen, могут не иметь таких строгих ограничений.

  2. Обращение к провайдеру: Попробуйте обратиться к вашему провайдеру хостинга с запросом об увеличении лимитов на количество процессов. Укажите им на проблему и попросите изменить настройки user beancounters, если это возможно.

  3. Оптимизация количества контейнеров: Постарайтесь уменьшить количество одновременно запущенных контейнеров, если это возможно. Консолидируйте функциональные возможности в меньшем количестве контейнеров.

Заключение

Проблема, с которой вы столкнулись, связана с ограничениями виртуализации, установленной провайдером на вашей VPS. Избежать это можно либо путем изменения провайдера, либо оптимизацией текущей конфигурации. Понимание взаимодействия Docker и ядра хоста в виртуализированной среде поможет вам избегать подобных проблем в будущем. Убедитесь, что ваш будущий провайдер сможет удовлетворить ваши требования по ресурсам без наложения нежелательных ограничений.

Оцените материал
Добавить комментарий

Капча загружается...