有個小需求想透過程式取得 CPU 與記憶體使用率,爬文發現用 C# 寫簡單到不行:建一個 PerformanceCounter 物件,指定分類、計數器名稱、執行個體,接著用 NextValue() 取值,輕鬆搞定。

using System;
using System.Diagnostics;
using System.Threading;
 
namespace JetEngine
{
    class Program
    {
        static PerformanceCounter cpu = new PerformanceCounter(
            "Processor", "% Processor Time", "_Total");
        static PerformanceCounter memory = new PerformanceCounter(
            "Memory", "% Committed Bytes in Use");
 
        static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("CPU: {0:n1}%", cpu.NextValue());
                Console.WriteLine("Memory: {0:n0}%", memory.NextValue());
                Thread.Sleep(1000);
            }
        }
    }
}

如果不知道分類、計數器及執行個體名稱,可以參考效能監視器的新増計數器介面:

實測驗證,程式與效能監視器抓到的數據一致。

使用 PerformanceCounter 類別需要讀取特定 Registry 的權限,一般登入帳號都可使用,但如果想搬進ASP.NET會卡在權限問題,得到以下錯誤:Access to the registry key 'Global' is denied.

解決方案有二,第一是讓 ASP.NET 用一般使用者等級的身分執行,但會衍生網站程式權限變大的風險,較不建議。第二種做法是以一般使用者或系統帳號另跑獨立 Process 或 Windows Service 讀取計數器再以 WebAPI 方式供本機查詢,實作可考慮使用前幾天介紹的輕巧兵器-NancyFx


Comments

# by 安德魯

如果是在 windows 下,直接用 IISExpress 也可以閃過這個問題 XD

# by Alvin

感謝!

# by s

Post a comment