¿Cómo determina irqbalance qué paquete usar?

¿Cómo determina irqbalance qué paquete usar?

irqbalance --debugmuestra lo siguiente:

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

Cuando ejecuto aplicaciones de red, parece que las IRQ las maneja el paquete 1, sin embargo, la smp_affinityde la NIC está en el paquete 0.

  1. ¿ irqbalanceAnula smp_affinityla configuración?
  2. ¿Cómo se irqbalancedecide qué paquete utilizar para manejar las IRQ?

Respuesta1

No es un programa particularmente grande, así que simplementecomprobando las fuentesParecía una buena idea.

  1. ¿ irqbalanceAnula smp_affinityla configuración?

    Creo que la respuesta es no. En todo caso, puede verlo claramente leyendo la smp_affinityconfiguración del /procsistema de archivos enactivate.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. ¿Cómo se irqbalancedecide qué paquete utilizar para manejar las IRQ?

    Por supuesto, este es el objetivo de irqbalance, por lo que lo que sigue probablemente sea una simplificación excesiva.

    Pero según mi lectura, la función relevante está enplacement.cen una función llamada find_best_object_for_irq(), que a su vez llama find_best_object().

    La línea crítica parece seraquí:

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

    Lo que parecería indicar que la IRQ está asignada a ese lugar (por ejemplo, paquete) que actualmente tiene la menor cantidad de IRQ asignadas; o si no, al "mejor" lugar, donde "mejor" es lo que tenga menor carga:

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

información relacionada