一個平均分配算法


第一種情況

這種情況要求需要分配的任務數量可以動態變化,執行任務的 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

可以看出來每次都是一個標准的均勻分配,那么我們只需要把變化前后的不一樣的地方選出來,這樣只針對性的切換需要變化的流量,就能做到做最小的改動,從而使分配轉移到最佳狀態。
示例代碼后續補上。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM