Docker сообщает, что ядро Linux не поддерживает реальное время периода cgroup cpu.

Я настроил 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 использовать опцию, которая зависит от возможности ядра планировать задачи в реальном времени, что в вашем случае не поддерживается.

Применение

Чтобы решить вашу проблему, рассмотрите следующие шаги:

  1. Проверка и замена ядра Linux: Вам понадобится установить ядро, которое поддерживает планирование в реальном времени. Наиболее подходящим выбором может быть использование RT-ядер (real-time). Существуют PPA для Ubuntu, которые предоставляют такие ядра, например, linux-lowlatency.
  2. Пересборка ядра с поддержкой реального времени: Если вы хотите использовать ваше текущее ядро, можно пересобрать его с дополнительными конфигурациями для поддержки функций реального времени. Это включает изменения в конфигурации ядра (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 и прочие параметры реального времени.
    • Соберите и установите ядро.
  3. Альтернативы:
    • Рассмотрите возможность запуска контейнеров без использования функций реального времени, если это возможно. Если ваш проект может обойтись без требований к жестким временным условиям, это самый простой путь.
    • Использование другой платформы, например, Arch Linux или специализированных дистрибутивов для real-time вычислений, где такие функции уже включены.

Заключение

Реализация функций реального времени в Docker требует определенной конфигурации ядра. Если ваш проект критически зависит от этих функций, использование RT-ядер или пересборка ядра является ключевым шагом. Если же это условие не является неотъемлемым, то стоит оценить возможность изменения проектных требований или доработки потоков выполнения задач, где это критично.

Друзья помогите этому контенту стать доступнее в социальных сетях.

Не проходи мимо жмакни по кнопке возможно кому то еще он будет полезен!