Я настроил Docker на своем сервере Ubuntu 18.04 так, чтобы его API было доступно, чтобы я мог создавать и развертывать контейнеры Docker через REST-запросы, что мне нужно для добавления определенных возможностей в мой проект. Это работало хорошо для первых нескольких конечных точек, которые я пробовал. Однако, когда я пытаюсь создать новый контейнер Docker (основная цель упражнения), я получаю сообщение:
{«message»: «Your kernel does not support cgroup cpu real-time period»}
Это правда? Или мне нужно настроить что-то для включения этой функции, или Docker сообщает об ошибке?
curl -X POST -H «Content-Type: application/json» -d «@./test-data/docker-create-api-test.json» http://localhost:1112/containers/create{«message»:»Your kernel does not support cgroup cpu real-time period»}
Очень благодарен за любую оказанную помощь, так как эта функциональность критична для моего проекта.
В официальном примере Docker, который я ошибочно предположил, что он будет работать как тестовое тело, была следующая строка:
«CpuRealtimePeriod»: 1000000,
Которая устанавливает значение, которое, как выяснилось, не поддерживается большинством или, возможно, ни одним из стандартных дистрибутивов Linux. Arch Linux master race ;).
Ответ или решение
Ваш вопрос связан с проблемой, с которой сталкиваются многие пользователи Docker, особенно при работе с функциональностью, требующей поддержки реального времени на уровне ядра Linux. Чтобы разобраться с этой проблемой, важно детально изучить концепцию cgroups и поддержку функций реального времени на системном уровне.
Теория
Контрольные группы (cgroups) в Linux – это механизм, который позволяет разделять и ограничивать ресурсы системных процессов. Благодаря cgroups можно управлять использованием CPU, памяти и других ресурсов для различных процессов.
Реальное время (real-time) в контексте управления ресурсами процессора (CPU) относится к возможности системы гарантировать временные границы для выполнения процессов. Значения CpuRealtimePeriod и CpuRealtimeRuntime в Docker определяют период планирования для выполнения задач в реальном времени и время, отведенное процессу в реальном времени соответственно. Эти параметры необходимы для контейнеров, которые должны выполнять задачи с жесткими временными ограничениями.
Поддержка этих возможностей зависит от конфигурации ядра Linux. По умолчанию, ядра большинства дистрибутивов Linux, в том числе и Ubuntu 18.04, скомпилированы без включенной поддержки планирования в реальном времени для cgroups. Это сделано в интересах баланса между производительностью и универсальностью системы.
Пример
Вы упомянули о том, что используете Ubuntu 18.04. В этом дистрибутиве, как правило, ядро не поддерживает функции реального времени CPU для cgroups из коробки. Это подтверждается сообщением Docker: «Your kernel does not support cgroup cpu real-time period».
Рассмотрим использование в вашем запросе:
{ «CpuRealtimePeriod»: 1000000}
Эта строка указывает Docker использовать опцию, которая зависит от возможности ядра планировать задачи в реальном времени, что в вашем случае не поддерживается.
Применение
Чтобы решить вашу проблему, рассмотрите следующие шаги:
- Проверка и замена ядра Linux: Вам понадобится установить ядро, которое поддерживает планирование в реальном времени. Наиболее подходящим выбором может быть использование RT-ядер (real-time). Существуют PPA для Ubuntu, которые предоставляют такие ядра, например, linux-lowlatency.
- Пересборка ядра с поддержкой реального времени: Если вы хотите использовать ваше текущее ядро, можно пересобрать его с дополнительными конфигурациями для поддержки функций реального времени. Это включает изменения в конфигурации ядра (CONFIG_RT_GROUP_SCHED и другие параметры).
Пример пересборки ядра:
- Установите необходимые инструменты: sudo apt install build-essential fakeroot dpkg-dev
- Скачайте исходники ядра и файл конфигурации текущего ядра:apt-get source linux-image-$(uname -r)cp /boot/config-$(uname -r) .config
- Откройте меню конфигурации: make menuconfig
- Включите CONFIG_RT_GROUP_SCHED и прочие параметры реального времени.
- Соберите и установите ядро.
- Альтернативы:
- Рассмотрите возможность запуска контейнеров без использования функций реального времени, если это возможно. Если ваш проект может обойтись без требований к жестким временным условиям, это самый простой путь.
- Использование другой платформы, например, Arch Linux или специализированных дистрибутивов для real-time вычислений, где такие функции уже включены.
Заключение
Реализация функций реального времени в Docker требует определенной конфигурации ядра. Если ваш проект критически зависит от этих функций, использование RT-ядер или пересборка ядра является ключевым шагом. Если же это условие не является неотъемлемым, то стоит оценить возможность изменения проектных требований или доработки потоков выполнения задач, где это критично.