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

Примечание

В системах, поддерживающих управление линией запросов прерывания, управление может быть передано оборудованию.