Какая политика определяет, какой процессор обрабатывает какие прерывания в ядре Linux?


3

Я читал, Linux Kernel Developmentи есть кое-что, что мне не совсем понятно - когда аппаратное обеспечение запускает прерывание, каков критерий, чтобы выбрать, на каком процессоре запускать логику обработки прерывания?

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

С другой стороны, могут быть прерывания по времени (например, для планировщика), которые необходимо вызвать. В системе SMP они всегда поднимаются на одном и том же ядре (скажем, # 0) или они всегда в значительной степени поднимаются на любом ядре?

Как это на самом деле работает?

Спасибо

Ответы:


3

В многопроцессорной / многоядерной системе вы можете найти процесс-демон с именемirqbalance . Его задача - регулировать распределение аппаратных прерываний по процессорам.

Во время загрузки, когда прошивка передает управление системой ядру, изначально работает только одно ядро ​​ЦП. Первое ядро ​​(обычно ядро ​​№ 0, иногда называемое «ЦП / ядро ​​монарха») изначально берет на себя все обязанности по обработке прерываний от встроенного программного обеспечения до инициализации системы и запуска других ядер ЦП. Таким образом, если ничего не делается для распределения нагрузки, ядро, которое первоначально запустило систему, выполняет все обязанности по обработке прерываний.

https://www.kernel.org/doc/Documentation/IRQ-affinity.txt предполагает, что в современных ядрах все ядра ЦП по умолчанию могут одинаково обрабатывать IRQ. Но это может быть не оптимальным решением, так как это может привести, например, к неэффективному использованию строк кэша ЦП с частыми источниками IRQ. Это задача irqbalanceисправить это.

irqbalanceэто не процесс ядра: это автономный двоичный файл, /usr/sbin/irqbalanceкоторый может работать либо в одноразовом режиме (то есть настроить распределение прерываний один раз как часть процесса загрузки и завершиться), либо как демон. Различные дистрибутивы Linux могут использовать его по-разному или вообще не использовать. Это позволяет легко тестировать и реализовывать произвольно сложные стратегии назначения IRQ процессорам, просто обновляя двоичный файл пользовательского пространства.

Он работает с использованием /proc/irq/%i/smp_affinityфайлов per-IRQ для управления тем, какие IRQ могут обрабатываться каждым процессором. Если вас интересуют подробности, проверьте исходный кодirqbalance : фактическое назначение настроек IRQ происходит в activate.c.


Я вижу, как работает irqbalance в моей Ubuntu 16.04 LTS.
пожрала Элизиум

irqbalanceэто не процесс ядра: это автономный двоичный файл, /usr/sbin/irqbalanceкоторый может работать либо в одноразовом режиме (то есть настроить распределение прерываний один раз как часть процесса загрузки и завершиться), либо как демон.
TelcoM

Мне интересно, как пользовательский код делает это, есть ли какой-нибудь файл / sys, который вы можете читать / писать, или есть какой-то системный вызов, которого я не знаю?
德里克 薯条 德里克

Если я правильно помню, когда я сталкивался с моими первыми многопроцессорными системами Linux, IRQ определенно использовался для сброса на CPU0, если irqbalanceон не использовался. Но поскольку многоядерные процессоры стали повсеместными, очевидно, что настройки ядра по умолчанию были обновлены в какой-то момент. kernel.org/doc/Documentation/IRQ-affinity.txt предполагает, что по умолчанию ядро ​​разрешает всем процессорам обрабатывать IRQ.
TelcoM

И даже IRQ-affinity.txtэто фактически с 2011 года, поэтому современные ядра могут фактически иметь некоторую полу-умную стратегию по умолчанию, чтобы гарантировать разумные результаты даже при урезанном пользовательском пространстве без irqbalance.
TelcoM
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.