Como o irqbalance determina qual pacote usar?

5

irqbalance --debug mostra o seguinte:

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

Quando executo aplicativos de rede, parece que os IRQs estão sendo manipulados pelo pacote 1, mas o smp_affinity da NIC está no pacote 0.

  1. A configuração irqbalance override smp_affinity ?
  2. Como o irqbalance decide qual pacote usar para lidar com IRQs?
por Jimm 24.04.2013 / 07:15

1 resposta

3

Não é um programa particularmente grande, portanto, apenas verificação das fontes pareceu uma boa ideia.

  1. A configuração irqbalance override smp_affinity ?

    Eu acredito que a resposta é não. Se houver alguma coisa, você pode vê-lo claramente lendo a configuração smp_affinity de o sistema de arquivos /proc em 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. Como o irqbalance decide qual pacote usar para lidar com IRQs?

    Isso, claro, é o ponto inteiro de irqbalance , então o que segue é provável que seja uma simplificação excessiva.

    Mas, da minha leitura, a função relevante está em placement.c em um função chamado find_best_object_for_irq() , que por sua vez chama find_best_object() .

    A linha crítica parece estar aqui :

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

    O que parece indicar que o IRQ é atribuído a esse local (por exemplo, pacote) que atualmente possui o menor número de IRQs atribuídos; ou se não, para o "melhor" lugar, onde "melhor" é o que tem o carga mais baixa:

    newload = d->load;
    if (newload < best->best_cost) {
            best->best = d;
            best->best_cost = newload;
            best->least_irqs = NULL;
    }
    
por 24.04.2013 / 08:41