Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
4.3. Обработка запросов прерываний
Прерывание — запрос обслуживания на аппаратном уровне. Прерывания могут генерироваться локальным оборудованием или поступать по шине в виде пакета данных (MSI, Message Signaled Interrupt).
Код обработки прерываний ядра получает номер запроса и список зарегистрированных обработчиков прерываний, и по очереди их вызывает. Обработчик получает прерывание, маскирует аналогичные запросы, запрашивает обработку прерывания низкоприоритетным обработчиком и после завершения перестает маскировать запросы.
/proc/interrupts
содержит статистику прерываний: номер прерывания, число прерываний этого типа, полученных каждым процессорным ядром, тип прерывания и список драйверов, обрабатывающих это прерывание. Подробную информацию можно найти на справочной странице man 5 proc
.
Прерываниям соответствует параметр
smp_affinity
, определяющий ядра, которые будут принимать участие в обслуживании. Его значение можно корректировать с целью улучшения производительности, привязывая прерывания и потоки к одним и тем же ядрам.
Значение
smp_affinity
определяется в /proc/irq/номер_прерывания/smp_affinity
в шестнадцатеричном формате. Для его просмотра и изменения необходимы права root.
В качестве примера рассмотрим прерывание драйвера Ethernet на сервере с четырьмя процессорными ядрами. Для начала надо узнать его номер прерывания:
# grep eth0 /proc/interrupts 32: 0 140 45 850264 PCI-MSI-edge eth0
Теперь можно просмотреть содержимое файла
smp_affinity
:
# cat /proc/irq/32/smp_affinity f
f
означает, что прерывание может обслуживаться на любом процессоре. Ниже этому параметру будет присвоено значение 1
, то есть прерывание будет обслуживаться на процессоре 0.
# echo 1 >/proc/irq/32/smp_affinity # cat /proc/irq/32/smp_affinity 1
Можно указать несколько значений, разделив их запятыми. Обычно используется в системах, где число ядер превышает 32. Так, например, ниже обслуживание прерывания 40 разрешается на всех ядрах в 64-ядерной системе:
# cat /proc/irq/40/smp_affinity ffffffff,ffffffff
Пример значения
smp_affinity
, ограничивающий обслуживание прерывания 40 последними 32 ядрами в 64-ядерной системе:
# echo 0xffffffff,00000000 > /proc/irq/40/smp_affinity # cat /proc/irq/40/smp_affinity ffffffff,00000000
Примечание
В системах, поддерживающих управление линией запросов прерывания, управление может быть передано оборудованию.