如何在Ubuntu上使用.NET Core应用程序获取总CPU%和内存%使用情况

4

虽然.NET Core支持PerformanceCounter,但它不支持Ubuntu操作系统,那么有没有办法在.NET Core应用程序中获取系统整体的CPU和内存使用情况(就像Windows任务管理器中显示的那样)?

2个回答

4

经过一番搜索工作,我用以下代码实现了它(其中一些代码取自谷歌搜索结果)。仅供参考。

  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://dev59.com/5rjna4cB1Zd3GeqP7UMP
      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的,因此我无法在跨平台中使用它,但处理器路径很酷。 - Tatiana Racheva

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接