Как установить привязку процесса инициализации Linux без использования grub?

Наше приложение может работать на различных архитектурах на машине ramfs. Для чрезвычайно быстрой обработки необходимо установить изоляцию ядра и привязку. В зависимости от архитектуры, возможно, потребуется закрепить его на гиперпотоке с номером numa 0 или numa 1. Мы не можем делать предположения, пока машина не загрузится.

Из-за этого разнообразия мы не можем установить параметры изоляции в grub. Перезагрузка после настройки grub тоже не поможет, так как это машина ramfs.

Как мы можем установить задачи для всех пользовательских процессов, порожденных systemd во время загрузки? Я знаю, что могу задать сам systemd, когда он вызывается, но не могу найти, где это происходит.


person howling cat    schedule 21.01.2019    source источник
comment
В зависимости от архитектуры - когда это определение происходит?   -  person Maxim Egorushkin    schedule 21.01.2019
comment
Как только загрузимся. Это зависит от расположения устройств в области PCIe. Итак, нам нужно сначала выяснить, находится ли устройство (скажем, сетевая карта) в слоте PCI, подключенном к той или иной NUMA, или, возможно, даже к обоим, а затем определить структуру потоков нашего приложения. У нас даже есть системы с 4 узлами NUMA, поэтому нам может потребоваться распределить себя по всем из них для достижения оптимальной производительности.   -  person howling cat    schedule 21.01.2019
comment
См. unix.stackexchange.com/questions/396149/, возможно, вы столкнетесь с проблемами, если вам нужно сделать это динамически, так как вам придется переписать файл конфигурации перед запуском systemd.   -  person nos    schedule 21.01.2019
comment
@nos это именно мой вопрос: как мне переписать файл конфигурации systemd перед его запуском ...   -  person howling cat    schedule 21.01.2019
comment
@howlingcat afaik. вы не можете, возможно, вам нужно приложение, чтобы выяснить это и установить свою собственную маску привязки.   -  person nos    schedule 21.01.2019


Ответы (2)


Как мы можем установить задачи для всех пользовательских процессов, порожденных systemd во время загрузки?

systemd.exec

Файлы конфигурации модулей для служб, сокетов, точек монтирования и устройств подкачки совместно используют подмножество параметров конфигурации, которые определяют среду выполнения порожденных процессов.

CPUAffinity =

Управляет привязкой к процессору выполняемых процессов. Принимает список индексов или диапазонов ЦП, разделенных пробелами или запятыми. Диапазоны ЦП указываются нижним и верхним индексами ЦП, разделенными тире. Этот параметр может быть указан более одного раза, и в этом случае указанные маски сродства ЦП объединяются. Если присвоена пустая строка, маска сбрасывается, все назначения до этого не будут иметь никакого эффекта.


В качестве альтернативы создайте модуль systemd, который создает файл конфигурации топологии и завершает работу. Сделайте так, чтобы другие ваши сервисные единицы зависели от этого модуля, чтобы они запускались после создания конфигурации топологии. Затем заставьте ваши сервисы читать файлы топологии и при запуске соответственно установить cpusets и affinities (это можно сделать с помощью сценария-оболочки).

person Maxim Egorushkin    schedule 21.01.2019
comment
мне нужно иметь возможность изменять этот параметр ДО запуска systemd, потому что я не знаю, с какой архитектурой я могу столкнуться. - person howling cat; 21.01.2019
comment
@howlingcat Вы можете сделать это, изменив файл конфигурации перед запуском systemd. - person Maxim Egorushkin; 21.01.2019
comment
кто это запускает? какой скрипт его загружает? - person howling cat; 22.01.2019
comment
@howlingcat Вы можете найти второй способ более практичным. - person Maxim Egorushkin; 22.01.2019
comment
Почти, но не совсем. Мне не хватало того, как вызвать systemd shift и процессы пользовательского пространства, которые он порождает, от ядер, которые я хочу изолировать. Во всяком случае, см. Мой ответ выше. - person howling cat; 23.01.2019

Наконец-то все работает правильно. Вот как:

  1. Создайте сценарий по пути к вашему местоположению. Я назвал свой set-system-affinity.sh. Его содержание должно включать:

    #!/bin/bash
    sed -i '/CPUAffinity/c\CPUAffinity=<whatever cpus should be configured>' /etc/systemd/system.conf
    systemctl daemon-reexec
    
  2. Создайте служебный файл в /etc/systemd/system. Я назвал свой set-affinity.service.

  3. Настройте службу следующим образом:

    [Unit]
    Before=systemd-sysctl.service
    DefaultDependencies=no
    
    [Service]
    Type=oneshot
    ExecStart=/the/path/to/your/script/set-system-affinity.sh
    
    [Install]
    WantedBy=sysinit.target
    
  4. Выполнить sudo systemctl enable set-affinity.service

Если вы используете систему ramfs, как и я, эти сценарии необходимо сделать частью образа, загружаемого во время загрузки, и каким-либо образом включить службу в образе.

Как очень рано запустить службу с помощью SYSTEMD

person howling cat    schedule 22.01.2019