第一种情况
这种情况要求需要分配的任务数量可以动态变化,执行任务的 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
", 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 |
可以看出来每次都是一个标准的均匀分配,那么我们只需要把变化前后的不一样的地方选出来,这样只针对性的切换需要变化的流量,就能做到做最小的改动,从而使分配转移到最佳状态。
示例代码后续补上。。。