引子
前兩天刷抖音,看見了這樣一個問題。
問題:容器化不做虛擬核心,會有什麼弊端?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. 環境準備
- 本機CPU--6個
- 虛擬機器分配CPU--4個
- Docker分配CPU--1個
測試結果
程式最終獲取CPU數量是虛擬機器的數量
採用cpus結果:
採用–cpuset-cpus命令結果:
Docker和虛擬機器的區別: