有個小需求想透過程式取得 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");
staticvoid 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。