
irqbalance --debug
показывает следующее:
Package 0: Core 0, 2, 4, 6, 8, 10, 12, 14
Package 1: Core 1, 3, 5, 7, 9, 11, 13
При запуске сетевых приложений создается впечатление, что IRQ обрабатываются пакетом 1, однако smp_affinity
NIC находится в пакете 0.
irqbalance
Переопределяет лиsmp_affinity
конфигурация?- Как
irqbalance
решить, какой пакет использовать для обработки IRQ?
решение1
Это не очень большая программа, так что простопроверка источниковКазалось, это хорошая идея.
irqbalance
Переопределяет лиsmp_affinity
конфигурация?Я считаю, что ответ - нет. Если что, вы можете ясно видеть, как он считывает
smp_affinity
настройки/proc
файловой системы вactivate.c
:sprintf(buf, "/proc/irq/%i/smp_affinity", info->irq); file = fopen(buf, "r"); if (!file) return 1; if (getline(&line, &size, file)==0) { free(line); fclose(file); return 1; } cpumask_parse_user(line, strlen(line), current_mask);
Как
irqbalance
решить, какой пакет использовать для обработки IRQ?В этом, конечно, и заключается весь смысл
irqbalance
, поэтому то, что будет изложено ниже, скорее всего, будет чрезмерным упрощением.Но, как я понял, соответствующая функция находится в
placement.c
в функции под названиемfind_best_object_for_irq()
, которая в свою очередь вызываетfind_best_object()
.Критическая линия, по-видимому,здесь:
asign = place.least_irqs ? place.least_irqs : place.best;
Что, по-видимому, указывает на то, что IRQ назначается тому месту (например, пакету), которому в данный момент назначено наименьшее количество IRQ; или, если нет, то «лучшему» месту, где «лучшее» — это то, что имеет наименьшую нагрузку:
newload = d->load; if (newload < best->best_cost) { best->best = d; best->best_cost = newload; best->least_irqs = NULL; }