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 の IRQ はパッケージ 0 にあります。

  1. 設定irqbalanceを上書きしますか?smp_affinity
  2. irqbalanceIRQ の処理に使用するパッケージをどのように決定しますか?

答え1

特に大きなプログラムではないので、ソースを確認するそれは良い考えだと思った。

  1. 設定irqbalanceを上書きしますか?smp_affinity

    答えはノーだと思います。むしろ、ファイルシステムsmp_affinityから設定を読み取っているのがはっきりとわかります。/procactivate.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. irqbalanceIRQ の処理に使用するパッケージをどのように決定しますか?

    もちろん、これが の全体的なポイントなので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;
    }
    

関連情報