Docker不做虛擬化核心,對.NET有什麼影響?

Broder發表於2023-02-07

引子

前兩天刷抖音,看見了這樣一個問題。
問題:容器化不做虛擬核心,會有什麼弊端?Java很多方法會跟CPU的核數有關,這個時候呼叫系統函式,讀到的是宿主機資訊,而不是我們限制資源的大小。
思考:在我們.NET中是否也會出現這種問題呢?

環境準備

1. 準備程式

在我們.NET中,並行程式設計(Parallel)或者執行緒池(ThreedPool)中,預設會根據CPU數量對我們進行執行緒分配。
於是我就從Parallel中,找到TaskReplicator類(該類主要用於同時在一個或多個Task中執行委託)下的GenerateCooperativeMultitaskingTaskTimeout方法。

private static int GenerateCooperativeMultitaskingTaskTimeout()
{
    // This logic ensures that we have a diversity of timeouts across worker tasks (100, 150, 200, 250, 100, etc)
    // Otherwise all worker will try to timeout at precisely the same point, which is bad if the work is just about to finish.
    int period = Environment.ProcessorCount;
    int pseudoRnd = Environment.TickCount;
    return CooperativeMultitaskingTaskTimeout_Min + (pseudoRnd % period) * CooperativeMultitaskingTaskTimeout_Increment;
}

抽取獲取處理器數量方法Environment.ProcessorCount,放到控制檯中。

internal class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("獲取宿主機器處理器數量:"+Environment.ProcessorCount);
        Console.ReadLine();
    }
}

2. 環境準備

  1. 本機CPU--6個

  1. 虛擬機器分配CPU--4個

  1. Docker分配CPU--1個

測試結果

程式最終獲取CPU數量是虛擬機器的數量

採用cpus結果:

採用–cpuset-cpus命令結果:

Docker和虛擬機器的區別:

相關文章