Skip to content

Изоляция ядра для alpha.hmi.viewer

Откройте папку setup-alpha-cpu-isolation и скачайте setup-alpha-cpu-isolation.sh

Скрипт выделяет физическое ядро для alpha.hmi.viewer, независимо от пользователя и способа запуска процесса. По умолчанию выбирается логический CPU 2; при включённом Hyper-Threading учитываются оба потока физического ядра. Настройка сохраняется после перезагрузок и обновлений ОС, а изменение Hyper-Threading в BIOS обрабатывается автоматически. Для установки перейдите к шагу 1. Принцип работы описан в конце статьи.

1. Установка и первичная настройка

Section titled “1. Установка и первичная настройка”
  1. Скопируйте setup-alpha-cpu-isolation.sh на машину. Откройте терминал в папке со скриптом и выдайте право на выполнение:

    Terminal window
    chmod +x setup-alpha-cpu-isolation.sh
  2. Выполните sudo ./setup-alpha-cpu-isolation.sh и выберите пункт «1 Установить / настроить изоляцию».

  3. Введите номер BASE CPU (по умолчанию 2). При включённом HT оба потока физического ядра будут изолированы автоматически.

  4. Перезагрузите машину по запросу установщика или в запланированное время. До перезагрузки изоляция ядра не действует.

  5. После перезагрузки проверьте состояние изоляции по пункту 2.2.

Установщик можно запускать повторно: резервная копия grub.default.orig создаётся только один раз — до самых первых изменений.

2. Повседневная эксплуатация

Section titled “2. Повседневная эксплуатация”

Главное меню установщика изоляции CPU

2.1 Изменение параметров

Section titled “2.1 Изменение параметров”

Чтобы выбрать другое ядро, откройте пункт 1 меню, введите новый номер BASE CPU и перезагрузите машину.

Выбор BASE CPU

Результат настройки изоляции CPU

Если изменилось имя процесса, отредактируйте PROCESS_PATTERN в /etc/alpha-cpu-isolate.conf и выполните systemctl restart alpha-pin. Учтите: следующая установка пересоздаёт конфиг с шаблоном по умолчанию.

В главном меню выберите «2 Показать статус». Проверьте список изолированных CPU, параметр isolcpus в командной строке ядра и состояние служб topology, irq, pin. В штатном режиме топология отмечена как «СОВПАДАЕТ», службы — active. Если показано «РАСХОЖДЕНИЕ», выполните действия из раздела 3.

Статус изоляции CPU и служб

Выберите «3 Откатить все изменения». Установщик остановит и удалит службы и скрипты, восстановит /etc/default/grub из grub.default.orig, пересоберёт grub, вернёт irqbalance в исходное состояние и удалит резервные копии. Требуется перезагрузка для возврата ядер системе.

Подтверждение отката

Завершение отката и необходимость перезагрузки

Запрос перезагрузки

3. Регламентные ситуации

Section titled “3. Регламентные ситуации”
СобытиеДействия оператора
Переключили HT в BIOSПри первой загрузке применяются временная защита и автоматическая правка GRUB. Проверьте journalctl -t alpha-cpu. Если статус показывает «РАСХОЖДЕНИЕ», перезагрузите машину ещё раз: после второй загрузки ожидается «СОВПАДАЕТ».
Обновление ОС / ядраПосле обновления проверьте состояние по пункту 2.2 (grub регенерируется из /etc/default/grub, параметр сохраняется). Проверить grep -c isolcpus /boot/grub/grub.cfg
Вернулся irqbalance после обновления пакетаsystemctl is-enabled irqbalance → если enabled: systemctl disable --now irqbalance
Повреждён /etc/default/grub (ошибка с кавычкой/апострофом)Установщик не даст продолжать (проверка bash -n). Выполнить откат (пункт 3) или вручную cp /var/lib/alpha-cpu-isolate/grub.default.orig /etc/default/grub, затем установка заново
Viewer сменил имя/путь запускаПроверить pgrep -af 'alpha', при необходимости обновить PROCESS_PATTERN (п. 2.1)

4. Неисправности и устранение

Section titled “4. Неисправности и устранение”
СимптомПричинаУстранение
Пользовательские процессы на CPU 2, nproc не уменьшенЯдро загружено без isolcpusgrep isolcpus /proc/cmdline; если пусто: grep -c isolcpus /boot/grub/grub.cfg (0 → update-grub), затем перезагрузка
Viewer не на изолированном ядреДемон не активен или шаблон не соответствует имени процессаsystemctl status alpha-pin; pgrep -af PROCESS_PATTERN; журнал службы
IRQ приходят на изолированное ядроСлужба IRQ не отработала / включён irqbalancesystemctl status alpha-irq-isolate; systemctl is-enabled irqbalance
Статус: «РАСХОЖДЕНИЕ» топологииСмена HT без второй перезагрузкиШтатно: одна дополнительная перезагрузка
Установка прерывается сообщением о повреждённом grubРучная правка файла с несбалансированными кавычкамиОткат (пункт 3) или восстановление из grub.default.orig
После отката ядра всё равно изолированыОткат выполнен без перезагрузкиПерезагрузка
  • Per-CPU потоки ядра на изолированном ядре остаются всегда (см. «Служебные потоки ядра») — это норма, нагрузка ≈0 %.

  • В описанной сборке Astra не используются nohz_full/rcu_nocbs (CONFIG_NO_HZ_FULL не собран); простои ядра гасятся механизмом NO_HZ_IDLE.

  • Managed IRQ многоочередных устройств (NVMe, multi-queue NIC) управляются ядром и могут не принимать ручную маску; остаточные прерывания на изолированном ядре возможны, но редки. Для таких прерываний предусмотрен параметр isolcpus=managed_irq,N. Его результат зависит от масок очередей устройства; проверяйте фактическое распределение прерываний.

  • Параметр isolcpus читается ядром только при загрузке, поэтому изоляция параметром isolcpus после смены топологии всегда вступает со следующей перезагрузки; до перезагрузки действует временная защита.

  • Демон привязки даёт окно ≤0,2 с после старта alpha.hmi.viewer (на изолированное ядро в это время никто не попадает).

  • Номер BASE CPU — индекс логического CPU; при изменении нумерации CPU в BIOS скрипт автоматически обновляет список потоков, но индекс остаётся заданным.

  • Файл /etc/default/grub.bak, созданный ручными командами ранее, grub’ом не читается и на работу не влияет; может быть удалён.

Как устроена изоляция CPU

Section titled “Как устроена изоляция CPU”

Служебные CPU (housekeeping) используются для остальных задач системы. Изолированные CPU выделяются для alpha.hmi.viewer.

ОбъектНазначение
/etc/default/grub → GRUB_CMDLINE_LINUX="isolcpus=…"параметр ядра: вывод ядра из планировщика
/etc/alpha-cpu-isolate.confконфигурация: BASE_CPU, PROCESS_PATTERN, вычисленные ISOLATED_CPUS, HOUSEKEEPING_CPUS, HT_STATUS
alpha-topology.service + /usr/local/sbin/alpha-topology-resolve.shоднократный запуск при загрузке: проверка топологии HT, корректировка GRUB и временная защита
alpha-irq-isolate.service + /usr/local/sbin/alpha-irq-isolate.shоднократный запуск при загрузке: маски IRQ без изолированных CPU
alpha-pin.service + /usr/local/sbin/alpha-pin.shпостоянно работающая служба: привязка всех потоков viewer к изолированным CPU
/var/lib/alpha-cpu-isolate/резервные копии: grub.default.orig (до первой установки), grub.default.prev, irqbalance.state
/run/alpha-cpu-topology-changedфлаг «при этой загрузке обнаружена смена HT» (живёт до перезагрузки)
setup-alpha-cpu-isolation.shустановщик с меню (установка / статус / откат)

Параметр isolcpus исключает выбранные CPU из обычной балансировки задач. Закрепление alpha.hmi.viewer на этих CPU выполняет служба alpha-pin.service через affinity-маски потоков. Остальные задачи ограничиваются служебными CPU настройками системы и скриптов изоляции.

Описание параметра и управления affinity приведено в документации ядра Linux.

Служба alpha-irq-isolate.service настраивает маски прерываний, исключая из них изолированные CPU. В Linux список CPU отдельного IRQ задаётся через /proc/irq/<IRQ>/smp_affinity_list, а начальная маска новых IRQ — через /proc/irq/default_smp_affinity. Служба irqbalance отключается, чтобы не перераспределять IRQ поверх этих настроек. Маски задаются заново при каждой загрузке.

Устройства с управляемыми ядром IRQ учитываются отдельно, как описано в разделе 5. Интерфейсы IRQ описаны в документации ядра Linux.

Служба alpha-pin.service работает от root и обрабатывает процессы любого пользователя. Каждые 0,2 с она:

  • находит процессы через pgrep -f PROCESS_PATTERN;

  • для каждого потока (/proc/PID/task/*) ставит taskset -pc ISOLATED_CPUS. Affinity — маска доступных CPU для потока. Новые потоки наследуют маску родителя. До очередной проверки viewer работает с унаследованной маской служебных CPU.

При каждой загрузке скрипт проверки топологии сравнивает фактические потоки физического ядра (/sys/.../cpu$BASE_CPU/topology/thread_siblings_list) с тем, что реально загружено в ядро (isolcpus= из /proc/cmdline), в нормализованном виде (сортировка списков).

Топология совпадает — система работает в штатном режиме, конфигурация обновляется.

Расхождение (HT включили/выключили в BIOS):

  • конфиг переписывается фактическим списком потоков (1 или 2 CPU);

  • /etc/default/grub правится и grub.cfg пересобирается на следующую загрузку;

  • на время текущей загрузки применяется временная защита: affinity PID 1 сужается до housekeeping (все будущие потомки systemd наследуют маску без изолированных CPU), все существующие потоки с маской, пересекающей изолированные CPU, переносятся на housekeeping-CPU (кроме viewer), маски unbound-workqueue сужаются;

  • ставится флаг /run/alpha-cpu-topology-changed и пишется событие в журнал (logger -t alpha-cpu). Итог: текущая загрузка защищена affinity-механизмом, при следующей загрузке параметр isolcpus уже охватывает оба потока.

1) GRUB → ядро с isolcpus= НОМЕР ЯДРА
2) → sysinit.target
3) → alpha-topology.service (сверка топологии, при необходимости временная защита + правка GRUB)
4) → alpha-irq-isolate.service (маски IRQ)
5) → alpha-pin.service (демон привязки, работает постоянно)

Per-CPU потоки ядра с индексом ядра в имени: ksoftirqd/2, migration/2, cpuhp/2, idle_inject/2, kworker/2:*. Ядро создаёт их на каждом CPU, они закреплены за своим ядром и простаивают (0,0 %). Это не нарушение изоляции. Пользовательских процессов, кроме потоков alpha.hmi.viewer, на изолированном ядре быть не должно.

К разделу Astra Linux