一个平均分配算法

第一种情况

这种情况要求需要分配的任务数量可以动态变化,执行任务的 worker 数量是固定的
经常会有一种场景,比如把 100 个线程均匀分到 8 个核上。把 16 条链路的流量均匀分到 8 个端口上。那么我们需要一种能均匀分配的算法。
如下,一个 demo 程序,假设有 4 个核,11 个任务,那么我们可以按如下来分配。

#include <stdio.h>

int main()
{
    int count = 11;
    int cores = 4;
    for (int idx = 0; idx < cores; idx++)
    {
        int min = count * idx / cores;
        int max = count * (idx + 1) / cores;
        for (int i = min; i < max; i++)
            printf("core %d will run task %d\n", idx, i);
    }
}

运行结果如下:
可以看出,任务被均匀分到 core 上。

第二种情况

这种情况要求需要分配的任务数量是个定数,执行任务的 worker 可以是动态变化的
之前做数据中心交换机的时候存在一种情况:交换芯片互联的 HG 口可能由于某种原因而 down 掉,这时候需要对该端口的流量做平滑切换,尽量保证不丢包!这属于一种很重要可维护性手段!截至目前(2021)现在阿里巴巴数据中心交换机也是这种方案。

这里假设芯片 A 互联的 HG 口有最多有9个,那么如果存在端口 DOWN 的情况,可以利用的端口个数为 0-9.
假设当前可用端口为 5 个那么流量分布应该是如下情况:

HG0 HG1 HG2 HG3 HG4
1 1 1 1 1
1 1 1 1 0

这时候增加一个端口的话应该是如下情况:

HG0 HG1 HG2 HG3 HG4 HG5
1 1 1 1 1 1(X)
1 1 1 0(X) 0

这时候减少一个端口的话应该是如下情况:
|HG0|HG1|HG2|HG3|
|-|-|-|-|-|
|1|1|1|1|
|1|1|1|1|
|1|0|0|0|

可以看出来每次都是一个标准的均匀分配,那么我们只需要把变化前后的不一样的地方选出来,这样只针对性的切换需要变化的流量,就能做到做最小的改动,从而使分配转移到最佳状态。
示例代码后续补上。。。

posted @ 2021-01-11 21:38  sinpo828  阅读(2061)  评论(0编辑  收藏  举报