У меня есть серверы, которые обрабатывают большое количество сетевых пакетов. Я видел доказательства того, что процессы пользовательского пространства, запущенные на CPU0, снижают производительность при высокой сетевой нагрузке. Я почти уверен, что это связано с обработкой прерываний, особенно для сетевых устройств.
Таким образом, я экспериментирую с изменением сродства сетевых (eth) устройств, чтобы проверить свою гипотезу и посмотреть, могу ли я улучшить производительность.
Я понимаю, что для изменения привязки IRQ я должен изменить значение в /proc/irq/XXX/smp_affinity
.
Когда я меняю значение в этом файле, я могу перемещать обработку прерываний только с одного процессора на другой. Например, в 4-ядерной системе я могу установить это значение на 1, 2, 4 или 8, и я вижу, что прерывания перемещаются от ядер 0,1,2 и 3 соответственно (путем мониторинга /proc/interrupts
). Однако, если я устанавливаю значение сродства для любой комбинации ядер, я не вижу прерываний, сбалансированных по всем ядрам. Они всегда придерживаются одного стержня. Например,
ff
: CPU0 используется12
: CPU4 используется(Таким образом, кажется, что используется только самое низкое указанное ядро)
Я остановил irqbalance
демон на случай, если это повлияло на вещи (хотя я подозреваю, что не так, как я понимаю, что irqbalance
изменит значения smp_affinity
файл, и я этого не вижу).
Мои вопросы таковы:
N.B. Я пробовал это на двух машинах: виртуальная машина ubuntu, работающая в VBox, с двумя ядрами и с устройством eth, использующим IO-APIC
; Настоящая машина ubuntu с 4 ядрами (8 гиперпотоков) и с устройством eth, использующим PCI-MSI
.
В качестве бонусного вопроса:
PCI
прерывает? Насколько я понимаю, это должно быть возможно с IO-APIC
прерывания.