Docker不虚拟化内核对.NET应用性能有何显著影响?

摘要:#引子 前两天刷抖音,看见了这样一个问题。 问题:容器化不做虚拟内核,会有什么弊端?Java很多方法会跟CPU的核数有关,这个时候调用系统函数,读到的是宿主机信息,而不是我们限制资源的大小。 思考:在我们.NET中是否也会出现这种问题呢?
引子 前两天刷抖音,看见了这样一个问题。 问题:容器化不做虚拟内核,会有什么弊端?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和虚拟机的区别: