Как irqbalance определяет, какой пакет использовать?

Как irqbalance определяет, какой пакет использовать?

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_affinityNIC находится в пакете 0.

  1. irqbalanceПереопределяет ли smp_affinityконфигурация?
  2. Как irqbalanceрешить, какой пакет использовать для обработки IRQ?

решение1

Это не очень большая программа, так что простопроверка источниковКазалось, это хорошая идея.

  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);
    
  2. Как 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;
    }
    

Связанный контент