Назад | Перейти на главную страницу

Невозможно сбалансировать IRQ eth0 между процессорами

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

Таким образом, я экспериментирую с изменением сродства сетевых (eth) устройств, чтобы проверить свою гипотезу и посмотреть, могу ли я улучшить производительность.

Я понимаю, что для изменения привязки IRQ я должен изменить значение в /proc/irq/XXX/smp_affinity.

Когда я меняю значение в этом файле, я могу перемещать обработку прерываний только с одного процессора на другой. Например, в 4-ядерной системе я могу установить это значение на 1, 2, 4 или 8, и я вижу, что прерывания перемещаются от ядер 0,1,2 и 3 соответственно (путем мониторинга /proc/interrupts). Однако, если я устанавливаю значение сродства для любой комбинации ядер, я не вижу прерываний, сбалансированных по всем ядрам. Они всегда придерживаются одного стержня. Например,

(Таким образом, кажется, что используется только самое низкое указанное ядро)

Я остановил irqbalance демон на случай, если это повлияло на вещи (хотя я подозреваю, что не так, как я понимаю, что irqbalance изменит значения smp_affinity файл, и я этого не вижу).

Мои вопросы таковы:

N.B. Я пробовал это на двух машинах: виртуальная машина ubuntu, работающая в VBox, с двумя ядрами и с устройством eth, использующим IO-APIC; Настоящая машина ubuntu с 4 ядрами (8 гиперпотоков) и с устройством eth, использующим PCI-MSI.

В качестве бонусного вопроса: