即使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}.");
}
}
}
您必须依赖于提供CPU和内存信息的特定于操作系统的实用程序。从应用程序运行该命令,并读取/解析返回的输出。
我找到了一篇文章,看起来与你正在努力实现的目标一致。使用.NET Core 读取Windows和Linux内存指标