gpt4 book ai didi

linux - 如何在 Ubuntu 上使用 .NET 核心应用程序获得总 CPU % 和 Memory% 使用率

转载 作者:行者123 更新时间:2023-12-04 18:27:43 25 4
gpt4 key购买 nike

PerformanceCounter .NET 核心支持,但 Ubuntu 操作系统不支持,所以有什么方法可以获得 系统整体 .NET 核心应用程序中的 CPU 和内存使用情况(如 Windows 中显示的任务管理器)?

最佳答案

经过一些搜索工作,我通过以下代码完成了它(一些代码来自谷歌搜索结果)。仅供引用

  internal static class CpuMemoryMetrics4LinuxUtils
{
private const int DigitsInResult = 2;
private static long totalMemoryInKb;

/// <summary>
/// Get the system overall CPU usage percentage.
/// </summary>
/// <returns>The percentange value with the '%' sign. e.g. if the usage is 30.1234 %,
/// then it will return 30.12.</returns>
public static double GetOverallCpuUsagePercentage()
{
// refer to https://stackoverflow.com/questions/59465212/net-core-cpu-usage-for-machine
var startTime = DateTime.UtcNow;
var startCpuUsage = Process.GetProcesses().Sum(a => a.TotalProcessorTime.TotalMilliseconds);

System.Threading.Thread.Sleep(500);

var endTime = DateTime.UtcNow;
var endCpuUsage = Process.GetProcesses().Sum(a => a.TotalProcessorTime.TotalMilliseconds);

var cpuUsedMs = endCpuUsage - startCpuUsage;
var totalMsPassed = (endTime - startTime).TotalMilliseconds;
var cpuUsageTotal = cpuUsedMs / (Environment.ProcessorCount * totalMsPassed);

return Math.Round(cpuUsageTotal * 100, DigitsInResult);
}

/// <summary>
/// Get the system overall memory usage percentage.
/// </summary>
/// <returns>The percentange value with the '%' sign. e.g. if the usage is 30.1234 %,
/// then it will return 30.12.</returns>
public static double GetOccupiedMemoryPercentage()
{
var totalMemory = GetTotalMemoryInKb();
var usedMemory = GetUsedMemoryForAllProcessesInKb();

var percentage = (usedMemory * 100) / totalMemory;
return Math.Round(percentage, DigitsInResult);
}

private static double GetUsedMemoryForAllProcessesInKb()
{
var totalAllocatedMemoryInBytes = Process.GetProcesses().Sum(a => a.PrivateMemorySize64);
return totalAllocatedMemoryInBytes / 1024.0;
}

private static long GetTotalMemoryInKb()
{
// only parse the file once
if (totalMemoryInKb > 0)
{
return totalMemoryInKb;
}

string path = "/proc/meminfo";
if (!File.Exists(path))
{
throw new FileNotFoundException($"File not found: {path}");
}

using (var reader = new StreamReader(path))
{
string line = string.Empty;
while (!string.IsNullOrWhiteSpace(line = reader.ReadLine()))
{
if (line.Contains("MemTotal", StringComparison.OrdinalIgnoreCase))
{
// e.g. MemTotal: 16370152 kB
var parts = line.Split(':');
var valuePart = parts[1].Trim();
parts = valuePart.Split(' ');
var numberString = parts[0].Trim();

var result = long.TryParse(numberString, out totalMemoryInKb);
return result ? totalMemoryInKb : throw new FileFormatException($"Cannot parse 'MemTotal' value from the file {path}.");
}
}

throw new FileFormatException($"Cannot find the 'MemTotal' property from the file {path}.");
}
}
}

关于linux - 如何在 Ubuntu 上使用 .NET 核心应用程序获得总 CPU % 和 Memory% 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65488071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com