irqbalance 如何确定使用哪个包?

Jim*_*imm 5 linux performance networking

irqbalance --debug 显示以下内容:

Package 0: Core 0, 2, 4, 6, 8, 10, 12, 14
Package 1: Core 1, 3, 5, 7, 9, 11, 13
Run Code Online (Sandbox Code Playgroud)

当我运行网络应用程序时,似乎 IRQ 正在由包 1 处理,但是smp_affinityNIC 的包在包 0 中。

  1. 是否irqbalance覆盖smp_affinity配置?
  2. 如何irqbalance决定使用哪个包来处理 IRQ?

ckh*_*han 3

这不是一个特别大的程序,因此检查源代码似乎是个好主意。

  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);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如何irqbalance决定使用哪个包来处理 IRQ?

    这当然是 的全部要点irqbalance,因此接下来的内容可能过于简单化了。

    但根据我的阅读,相关函数位于placement.c名为 的函数中find_best_object_for_irq(),该函数又调用find_best_object().

    临界线似乎在这里:

    asign = place.least_irqs ? place.least_irqs : place.best;
    
    Run Code Online (Sandbox Code Playgroud)

    这似乎表明 IRQ 被分配到当前分配的 IRQ 最少的位置(例如,包);或者如果没有,则到“最佳”位置,其中“最佳”是负载最低的位置:

    newload = d->load;
    if (newload < best->best_cost) {
            best->best = d;
            best->best_cost = newload;
            best->least_irqs = NULL;
    }
    
    Run Code Online (Sandbox Code Playgroud)