Wie bestimmt irqbalance, welches Paket verwendet werden soll?

Wie bestimmt irqbalance, welches Paket verwendet werden soll?

irqbalance --debugzeigt folgendes:

Package 0: Core 0, 2, 4, 6, 8, 10, 12, 14
Package 1: Core 1, 3, 5, 7, 9, 11, 13

Wenn ich Netzwerkanwendungen ausführe, scheint es, als würden IRQs von Paket 1 behandelt, der smp_affinityfür die Netzwerkkarte liegt jedoch in Paket 0.

  1. Wird die Konfiguration irqbalanceüberschrieben smp_affinity?
  2. Wie wird irqbalanceentschieden, welches Paket zur Handhabung von IRQs verwendet wird?

Antwort1

Es ist kein besonders großes Programm, alsoÜberprüfung der Quellenschien eine gute Idee zu sein.

  1. Wird die Konfiguration irqbalanceüberschrieben smp_affinity?

    Ich glaube, die Antwort ist nein. Wenn überhaupt, können Sie deutlich sehen, dass es die smp_affinityEinstellungen aus dem /procDateisystem liest inactivate.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. Wie wird irqbalanceentschieden, welches Paket zur Handhabung von IRQs verwendet wird?

    Dies ist natürlich der springende Punkt von irqbalance, daher handelt es sich bei dem Folgenden wahrscheinlich um eine übermäßige Vereinfachung.

    Aber nach meiner Lektüre ist die relevante Funktion inplacement.cin einer Funktion namens find_best_object_for_irq(), die wiederum aufruft find_best_object().

    Die kritische Linie scheint zu seinHier:

    asign = place.least_irqs ? place.least_irqs : place.best;
    

    Dies würde darauf hindeuten, dass der IRQ dem Ort (z. B. Paket) zugewiesen wird, dem derzeit die wenigsten IRQs zugewiesen sind. Andernfalls wird er dem „besten“ Ort zugewiesen, wobei „am besten“ der Ort mit der geringsten Auslastung ist:

    newload = d->load;
    if (newload < best->best_cost) {
            best->best = d;
            best->best_cost = newload;
            best->least_irqs = NULL;
    }
    

verwandte Informationen