Изоляция ядра для alpha.hmi.viewer
Откройте папку setup-alpha-cpu-isolation и скачайте setup-alpha-cpu-isolation.sh
Назначение
Section titled “Назначение”Скрипт выделяет физическое ядро для alpha.hmi.viewer, независимо от пользователя и способа запуска процесса. По умолчанию выбирается логический CPU 2; при включённом Hyper-Threading учитываются оба потока физического ядра. Настройка сохраняется после перезагрузок и обновлений ОС, а изменение Hyper-Threading в BIOS обрабатывается автоматически. Для установки перейдите к шагу 1. Принцип работы описан в конце статьи.
1. Установка и первичная настройка
Section titled “1. Установка и первичная настройка”-
Скопируйте
setup-alpha-cpu-isolation.shна машину. Откройте терминал в папке со скриптом и выдайте право на выполнение:Terminal window chmod +x setup-alpha-cpu-isolation.sh -
Выполните
sudo ./setup-alpha-cpu-isolation.shи выберите пункт «1 Установить / настроить изоляцию». -
Введите номер BASE CPU (по умолчанию 2). При включённом HT оба потока физического ядра будут изолированы автоматически.
-
Перезагрузите машину по запросу установщика или в запланированное время. До перезагрузки изоляция ядра не действует.
-
После перезагрузки проверьте состояние изоляции по пункту 2.2.
Установщик можно запускать повторно: резервная копия grub.default.orig создаётся только один раз — до самых первых изменений.
2. Повседневная эксплуатация
Section titled “2. Повседневная эксплуатация”
2.1 Изменение параметров
Section titled “2.1 Изменение параметров”Чтобы выбрать другое ядро, откройте пункт 1 меню, введите новый номер BASE CPU и перезагрузите машину.


Если изменилось имя процесса, отредактируйте PROCESS_PATTERN в /etc/alpha-cpu-isolate.conf и выполните systemctl restart alpha-pin. Учтите: следующая установка пересоздаёт конфиг с шаблоном по умолчанию.
2.2 Проверка состояния
Section titled “2.2 Проверка состояния”В главном меню выберите «2 Показать статус». Проверьте список изолированных CPU, параметр isolcpus в командной строке ядра и состояние служб topology, irq, pin. В штатном режиме топология отмечена как «СОВПАДАЕТ», службы — active. Если показано «РАСХОЖДЕНИЕ», выполните действия из раздела 3.

2.3 Откат
Section titled “2.3 Откат”Выберите «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 не уменьшен | Ядро загружено без isolcpus | grep isolcpus /proc/cmdline; если пусто: grep -c isolcpus /boot/grub/grub.cfg (0 → update-grub), затем перезагрузка |
| Viewer не на изолированном ядре | Демон не активен или шаблон не соответствует имени процесса | systemctl status alpha-pin; pgrep -af PROCESS_PATTERN; журнал службы |
| IRQ приходят на изолированное ядро | Служба IRQ не отработала / включён irqbalance | systemctl status alpha-irq-isolate; systemctl is-enabled irqbalance |
| Статус: «РАСХОЖДЕНИЕ» топологии | Смена HT без второй перезагрузки | Штатно: одна дополнительная перезагрузка |
| Установка прерывается сообщением о повреждённом grub | Ручная правка файла с несбалансированными кавычками | Откат (пункт 3) или восстановление из grub.default.orig |
| После отката ядра всё равно изолированы | Откат выполнен без перезагрузки | Перезагрузка |
5. Особенности работы
Section titled “5. Особенности работы”-
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.
Состав системы
Section titled “Состав системы”| Объект | Назначение |
|---|---|
/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 | установщик с меню (установка / статус / откат) |
Планирование задач
Section titled “Планирование задач”Параметр isolcpus исключает выбранные CPU из обычной балансировки задач. Закрепление alpha.hmi.viewer на этих CPU выполняет служба alpha-pin.service через affinity-маски потоков. Остальные задачи ограничиваются служебными CPU настройками системы и скриптов изоляции.
Описание параметра и управления affinity приведено в документации ядра Linux.
Прерывания
Section titled “Прерывания”Служба 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.
Привязка процесса
Section titled “Привязка процесса”Служба alpha-pin.service работает от root и обрабатывает процессы любого пользователя. Каждые 0,2 с она:
-
находит процессы через
pgrep -f PROCESS_PATTERN; -
для каждого потока (
/proc/PID/task/*) ставитtaskset -pc ISOLATED_CPUS. Affinity — маска доступных CPU для потока. Новые потоки наследуют маску родителя. До очередной проверки viewer работает с унаследованной маской служебных CPU.
Контроль топологии
Section titled “Контроль топологии”При каждой загрузке скрипт проверки топологии сравнивает фактические потоки физического ядра (/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 уже охватывает оба потока.
Порядок при загрузке
Section titled “Порядок при загрузке”1) GRUB → ядро с isolcpus= НОМЕР ЯДРА 2) → sysinit.target 3) → alpha-topology.service (сверка топологии, при необходимости временная защита + правка GRUB) 4) → alpha-irq-isolate.service (маски IRQ) 5) → alpha-pin.service (демон привязки, работает постоянно)Служебные потоки ядра
Section titled “Служебные потоки ядра”Per-CPU потоки ядра с индексом ядра в имени: ksoftirqd/2, migration/2, cpuhp/2, idle_inject/2, kworker/2:*. Ядро создаёт их на каждом CPU, они закреплены за своим ядром и простаивают (0,0 %). Это не нарушение изоляции. Пользовательских процессов, кроме потоков alpha.hmi.viewer, на изолированном ядре быть не должно.