Ключевые слова: программный модуль, прерывание, сетевой интерфейс, демон.
Во многих IT-компаниях используется ЭВМ, в которые устанавливаются многоядерные процессоры, где количество ядер, как правило, больше восьми. Через такие ЭВМ проходит огромное количество сетевых пакетов данных. Поэтому залогом быстрой и эффективной работы ЭВМ, является грамотное распределение нагрузки по доступным ядрам процессора, для того чтобы время обработки одного пакета было минимальным. В связи с этим, в системе применяется механизм прерываний.
Прерывание — это событие, генерируемое внешним (по отношению к процессору) устройством. В системе ЭВМ можно настраивать прерывания в зависимости от потребностей пользователя, это позволяет равномерно распределить работу по ядрам процессора. Оператор ЭВМ может самостоятельно определить, какие конкретно ядра будут обрабатывать то или иное прерывание, что позволит ему скорректировать работу всей ЭВМ. Для удобного изменения прерываний было создано решение внутри компании, которое работало в виде драйвера на уровне ядра.
Актуальность данной проблемы обусловлена тем, что существующие решения не удовлетворяют всем требованиям. Рассмотрим одно из существующих решений — это решение компании ООО «С-Терра СиЭсПи». С помощью драйвера, реализованного в компании, нельзя было надежно установить необходимые оператору прерывания для обработки событий от сетевых интерфейсов. Сейчас в драйвере регистрируются обработчики событий NETDEV_UP/NETDEV_DOWN/NETDEV_CHANGE от сетевых интерфейсов. Но вызов этих обработчиков может происходить в неподходящее время. Например, драйвер сетевой карточки способен динамически изменить параметры её работы — в том числе, модифицировать привязку RX/TX очередей сетевой карты к номерам CPU, которые должны обрабатывать прерывания от этих очередей, и не вызвать обработчик NETDEV_CHANGE. Было принято решение создать программный модуль, работающий в фоновом циклическом режиме с заданным интервалом времени.
Выбранный тип работы программы позволяет избежать незапланированных изменений масок прерываний другими драйверами и сервисами. Так как данный программный модуль будет работать в циклическом режиме, заданная маска прерывания будет сохраняться неизменной на протяжении всей работы модуля.
Реализацией данного программного модуля является программа — демон. Демон [3] — это сервисный процесс, который работает в фоновом режиме и контролирует систему. В нашем решении демон будет работать с определенным временным интервалом.
В качестве входных параметров для запуска программного модуля используются:
- Флаг интерактивного режима работы. Все сообщения будут выводиться не только в специализированный лог-файл, но и на экран пользователя (не является обязательным параметром);
- Флаг считывания данных о прерывании из заготовленного файла. Данный флаг позволяет отлаживать программу на тестовых данных, чтобы была возможность протестировать все варианты работы модуля перед его внедрением в реальную систему (не является обязательным параметром);
- Флаг «сухого» режима работы. При данном режиме работы все сообщения поступают на экран пользователя, а также модуль не вносит никаких изменений в работу системы (не является обязательным параметром);
- Путь к файлам, обеспечивающие работу модуля.
Информация о том, как будет работать модуль, за какими интерфейсами он должен следить, задается в конфигурационном файле. Структура данного файла следующая:
- Указывается интервал работы (пример: interval 30, значит корректировка прерываний будет осуществляться раз в 30 с);
- Указываются названия сетевых интерфейсов, за которыми модуль будет следить (пример: eth0).
Информация о том, сколько выделять ядер для обработки прерывания от того или иного сетевого интерфейса задается в отдельном файле. Структура данного файла содержит строки такого формата
[*]:
- Параметр до «:» определяет выполнять или не выполнять привязку прерываний от сетевых интерфейсов к процессорам;
-
-
Также к данному модулю прилагается файл, в котором хранится информация о различных прерываниях, для тестирования работы программы. Структура данного файла следующая:
Рис. 1. Пример файла с информацией о прерываниях
Все промежуточные сообщения, результаты записываются в специальный лог-файл.
Рис. 2. Пример лог-файла
ПМ работает в фоновом режиме. С заданной периодичностью программа считывает входные данные из конфигурационных файлов, считывает данные о структуре процессора (количество ядер, распределение ядер по нума нодам), формирует маски ядер и массив нума нод, считывает информацию об интерфейсе, преобразует ее и выставляет прерывания (записывает полученную маску в файл /proc/irq/
Схема данных для программного модуля представлена на рис. 3.
Рис. 3. Схема данных программного модуля
Использованный в данной ситуации тип программы — демон, работающий циклически, позволил добиться того, что заданные в файле прерывания будут установлены в том виде, в котором они были прописаны оператором ЭВМ. В модуле выполняется запись в файлы /proc (например, /proc/irq/
Литература:
- What is NUMA? URL. — Текст: электронный // The Linux Kernel: [сайт]. — URL: https://www.kernel.org/doc/html/v4.18/vm/numa.html
- CPU_DISTRIBUTION URL. — Текст: электронный // s-terra портал документации: [сайт]. — URL: http://doc.s-terra.ru/rh_output/4.3/Gate/output/index.htm
- Ubuntu manuals. — Текст: электронный // Writing and packaging system daemons URL: [сайт]. — URL: http://manpages.ubuntu.com/manpages/bionic/man7/daemon.7.html
- Лекция 3: Базовые понятия ОС Windows URL. — Текст: электронный // НОУ ИНТУИТ: [сайт]. — URL: https://intuit.ru/studies/courses/962/217/lecture/5589