【发布时间】:2021-06-04 10:34:52
【问题描述】:
根据以下代码(取自 https://medium.com/@jackwild/getting-cpu-usage-in-net-core-7ef825831b8b),我确定了用 C# (.Net 5.0) 编写的控制台应用程序的 CPU 使用率:
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("Hello World!");
Process p = Process.GetCurrentProcess();
while (true)
{
await Task.Delay(2000);
var cpuUsage = await GetCpuUsageForProcess(p);
Console.WriteLine("CPU: " + cpuUsage + "%");
}
}
static async Task<double> GetCpuUsageForProcess(Process proc)
{
var startTime = DateTime.UtcNow;
var startCpuUsage = proc.TotalProcessorTime;
await Task.Delay(1000);
var endTime = DateTime.UtcNow;
var endCpuUsage = proc.TotalProcessorTime;
var cpuUsedMs = (endCpuUsage - startCpuUsage).TotalMilliseconds;
var totalMsPassed = (endTime - startTime).TotalMilliseconds;
var cpuUsageTotal = cpuUsedMs / (Environment.ProcessorCount * totalMsPassed);
return cpuUsageTotal * 100;
}
}
在 Windows 上运行应用程序时(通过调试或发布后),应用程序在空闲时的预期平均使用率为 0%。但是,当我在我的 linux VM 上运行完全相同的已发布代码时,空闲使用率介于 0 和 0.24 之间
来自窗口的示例输出:
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
Linux VM (ubuntu 18.04) 上的输出:
CPU: 0.12440051392340312%
CPU: 0.12427189099068557%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0.24839400853779886%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0.12470035751093696%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0.24555489168426392%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0%
CPU: 0.12460451772120468%
CPU: 0%
CPU: 0.12426320617164646%
这似乎出乎意料,因为代码是相同的,并且空闲不应该占用任何 cpu 时间。 现在,在示例中,如果它偶尔占用一些 cpu 时间为 0.1%,这似乎不是一个大问题,但在我们的主程序中,它仅在空闲时占用 0.2% - 2%(而在 Windows 上为 0%)并且逻辑似乎在 linux 上运行得有点慢。这让我想知道在 linux 上运行 .net 核心应用程序是否效率较低,或者我是否遗漏了一些东西,例如在使用 Process.TotalProcessorTime 属性时,在 linux 上计算的 cpu 使用率是否不同/更准确。
有什么方法可以从运行时环境中找出导致 CPU 使用率的原因吗?我尝试使用 perf (https://docs.microsoft.com/en-us/dotnet/core/diagnostics/debug-highcpu?tabs=linux#trace-generation),但该报告并没有真正帮助我,因为我无法弄清楚是什么导致了 CPU 使用率。
【问题讨论】:
标签: c# linux performance .net-core cpu-usage