.NET Core 跨平台資源監控庫及 dotnet tool 小工具


簡介

CZGL.SystemInfo 是一個支持 Windows 和 Linux 等平台的能夠獲取機器硬件信息、采集機器資源信息、監控進程資源的庫。

在不引入額外依賴的情況下,使用 .NET Runtime 本身的 API,或通過計算獲得信息,提供高性能的計算方式以及緩存,提高性能,還提供 dotnet tool 工具,通過命令行在終端使用。

由於此庫完全是重寫,因此跟舊版本的 API 完全不同,舊版本地址:

舊版本 GitHub: https://github.com/whuanle/CZGL.SystemInfo/tree/0.1

舊版本使用教程: https://www.cnblogs.com/whuanle/p/12435413.html

Nuget 搜索 CZGL.SystemInfo 即可安裝,版本為 1.0 。

類庫中每一個屬性和方法,我都加上了貼心的注釋以及 return 示例。

CZGL.SystemInfo.Linux 優化部分代碼,其余無變化。

Windows 可以使用 System.Diagnostics.PerformanceCounter 、System.Management.ManagementObjectSearcher 分別獲得性能計算器以及機器的 CPU型號、磁盤序列化號等信息。

平台差異而且很難統一,所以如獲取某些硬件的型號序列化,獲得進程信息的資源信息,這些需求調用系統相關的API或者使用命令行操作,需要自己定制。

dotnet tool 體驗

目前做了個簡單的 dotnet 工具,無需 SDK,runtime 下即可使用。

安裝命令:

dotnet tool install --global csys
# or
dotnet tool install --global csys --version 1.0.3
You can invoke the tool using the following command: csys
Tool 'csys' (version '1.0.2') was successfully installed.

如果在 Linux 下,安裝,還需要設置環境變量:

export PATH="$PATH:/home/{你的用戶名}/.dotnet/tools"

安裝完畢后,輸入命令進入小工具:

csys
請輸入命令
+-------命令參考------------------------------+
| 1. 輸入 netinfo 查看網絡詳情                  |
| 2. 輸入 nett 監控網絡流量                     |
| 3. 輸入 test ,檢查當前操作系統不兼容哪些 API    |
| 4. 輸入 ps 查看進程信息                       |
+---------------------------------------------+

注:需要使用超級管理員啟動程序,才能使用 ps 功能;

動圖:

csys

小工具功能不多,有興趣可以下載 Nuget 包,里面有更多功能。

CZGL.SystemInfo

CZGL.SystemInfo 目前有四個類:DiskInfo、NetworkInfo、ProcessInfo、SystemPlatformInfo,下面一一介紹。

為了避免資源浪費,DiskInfo、NetworkInfo、ProcessInfo 部分屬性使用懶加載,不使用此 API 的情況下,不需要消耗性能。

Install-Package CZGL.SystemInfo -Version 1.0.1

SystemPlatformInfo

靜態類,能夠獲取運行環境信息和有限的硬件信息,所有信息在程序啟動前就已經確定。

其 API 說明及獲得的數據示例如下:

屬性 說明 Windows 示例 Linux 示例
FrameworkDescription 框架平台(.NET Core、Mono等)信息 .NET Core 3.1.9 .NET Core 3.1.9
FrameworkVersion 運行時信息版本 3.1.9 3.1.9
OSArchitecture 操作系統平台架構 X64 X64
OSPlatformID 獲取操作系統的類型 Win32NT Unix
OSVersion 操作系統內核版本 Microsoft Windows NT 6.2.9200.0 Unix 4.4.0.19041
OSDescription 操作系統的版本描述 Microsoft Windows 10.0.19041 Linux 4.4.0-19041-Microsoft #488-Microsoft Mon Sep 01 13:43:00 PST 2020
ProcessArchitecture 本進程的架構 X64 X64
ProcessorCount 當前計算機上的處理器數 8 8
MachineName 計算機名稱 dell-PC dell-PC
UserName 當前登錄到此系統的用戶名稱 dell dell
UserDomainName 用戶網絡域名稱 dell-PC dell-PC
IsUserInteractive 是否在交互模式中運行 True True
GetLogicalDrives 系統的磁盤和分區列表 D:, E:, F:, G:, H:, J:, X:|/, /dev, /sys, /proc, /dev/pts, /run, /run/lock, /run/shm
SystemDirectory 系統根目錄完全路徑 X:\WINDOWS\system32
MemoryPageSize 操作系統內存頁一頁的字節數 4096 4096

SystemPlatformInfo 的 API 不會有跨平台不兼容問題,可以大膽使用。

效果演示:

系統平台信息:

運行框架    :    .NET Core 3.1.0
操作系統    :    Microsoft Windows 10.0.17763
操作系統版本    :    Microsoft Windows NT 6.2.9200.0
平台架構    :    X64
機器名稱    :    aaaa-PC
當前關聯用戶名    :    aaa
用戶網絡域名    :    aaa-PC
系統已運行時間(毫秒)    :    3227500
Web程序核心框架版本    :    3.1.0
是否在交互模式中運行    :    True
分區磁盤    :    D:\, E:\, F:\, G:\, H:\, X:\
系統目錄    :    X:\windows\system32
當前進程已使用物理內存    :    20020
當前進程已占耗CPU時間    :    328.125
系統所有進程各種使用的內存    :    System.Collections.Generic.KeyValuePair`2[System.String,System.Int64][]
系統已使用內存    :    5988340
VisualStudioVersion    :    16.0

ProcessInfo

需要使用超級管理員啟動程序,才能使用此功能;

記錄某一時刻操作系統的資源數據。此 API 使用時有些地方需要注意,比較監控和刷新信息會消耗一些性能資源。

通過兩個靜態方法,可以獲取系統的進程列表:

Dictionary<int,string> value = ProcessInfo.GetProcessList();
ProcessInfo[] value = ProcessInfo.GetProcesses();

或者通過指定的進程 ID 獲取:

ProcessInfo value = ProcessInfo.GetProcess(666);

獲得 ProcessInfo 對象后,必須使用 Refresh() 方法刷新、截取當前進程狀態的信息,才能獲得信息。

如:

ProcessInfo thisProcess = ProcessInfo.GetCurrentProcess();	// 獲取當前進程的 ProcessInfo 對象
thisProcess.Refresh();

只有當你使用 .Refresh() 時,才會開始初始化,並生成相應的信息。

獲得的信息不是動態的,而且保存某一個節點時刻的進程狀態數據,所以如果需要動態更新,則需要再次執行 .Refresh() 方法。

ProcessInfo 能夠獲得進程使用了多少內存以及 CPU 時間,但是無法獲得此進程的物理內存使用率以及CPU使用率。如果想獲得使用比率,需要調用操作系統 API,或者使用操作系統的其它庫,如 Windows 的 WMI。

如果你想獲得一個進程的 CPU 消耗的比例,可以使用靜態方法:

decimal value = ProcessInfo.GetCpuPercentage(666);

大約 2 秒會刷新一次,所以請勿一直等待此 API 返回數據,適合單獨計算,不適合跟其它數據綜合。此 API 監控的 CPU 占比不是很准確。

CPU 是真的難求,你可以查看論文:

https://www.semanticscholar.org/paper/Late-Breaking%3A-Measuring-Processor-Utilization-in-Friedman/d7e312e32cd6bb6cac4531389c5cc7c80481b9b5?p2df

不斷刷新 CPU 數據:

            while (true)
            {
                var tmp = Convert.ToInt32(Console.ReadLine());
                var process = ProcessInfo.GetProcess(tmp);
                process.Refresh();                          // 刷新進程數據
                var cpu = ProcessInfo.GetCpuPercentage(process.ProcessId);
                Console.WriteLine($"進程 {process.ProcessName} CPU : {cpu * 100}%");
            }

內存監控

PhysicalUsedMemory 屬性值返回的值表示進程使用的可分頁系統內存的當前大小(以字節為單位)。 系統內存是操作系統使用的物理內存,分為分頁和非分頁的池。 當不可分頁內存未使用時,可以將其傳輸到磁盤上的虛擬內存分頁文件中。

屬性名稱 說明 示例
PhysicalUsedMemory 已用的物理內存字節數 17498112

NetworkInfo

NetworkInfo 能夠獲取網絡接口信息。

NetworkInfo.GetNetworkInfo() 可以獲取當前你的電腦正在連接互聯網的首選網絡設備。

如使用 wifi,獲取到的就是無線網卡;使用網線上網,獲取到的是以太網卡。

API 使用示例:

            var info = NetworkInfo.GetNetworkInfo();
            Console.WriteLine("\r\n+++++++++++");
            Console.WriteLine($"    網卡名稱    {info.Name}");
            Console.WriteLine($"    網絡鏈接速度 {info.Speed / 1000 / 1000} Mbps");
            Console.WriteLine($"    Ipv6       {info.AddressIpv6.ToString()}");
            Console.WriteLine($"    Ipv4       {info.AddressIpv4.ToString()}");
            Console.WriteLine($"    DNS        {string.Join(',', info.DNSAddresses.Select(x => x.ToString()).ToArray())}");
            Console.WriteLine($"    上行流量統計 {info.SendLength / 1024 / 1024} MB");
            Console.WriteLine($"    下行流量統計 {info.ReceivedLength / 1024 / 1024} MB");
            Console.WriteLine($"    網絡類型     {info.NetworkType}");
            Console.WriteLine($"    網卡MAC     {info.Mac}");
            Console.WriteLine($"    網卡信息     {info.Trademark}");

Status 屬性可以獲取此網卡的狀態,其枚舉說明如下:

Dormant 5 網絡接口不處於傳輸數據包的狀態;它正等待外部事件。
Down 2 網絡接口無法傳輸數據包。
LowerLayerDown 7 網絡接口無法傳輸數據包,因為它運行在一個或多個其他接口之上,而這些“低層”接口中至少有一個已關閉。
NotPresent 6 由於缺少組件(通常為硬件組件),網絡接口無法傳輸數據包。
Testing 3 網絡接口正在運行測試。
Unknown 4 網絡接口的狀態未知。
Up 1 網絡接口已運行,可以傳輸數據包。

NetworkType 可以獲得網卡接口類型,其枚舉比較多,詳細請參考:

https://docs.microsoft.com/zh-cn/dotnet/api/system.net.networkinformation.networkinterfacetype?view=netcore-3.1

通常,監控網絡,一時檢查網絡是否暢通,二是監控流量。

NetworkInfo.IsAvailable 靜態屬性可以檢查當前機器是否能夠連接互聯網。符合條件的網卡必須是能夠運行可以傳輸數據包,並且不能是本地回環地址。如果你是內網,則可能不需要此API,可以自己 ping 內網其它機器,確保網絡暢通。

實時監控網絡速度的使用方法:

            var info = NetworkInfo.GetNetworkInfo();
                while (true)
                {
                    var tmp = info.GetInternetSpeed(1000);
                    Console.WriteLine($"網絡上傳速度:{tmp.Send / 1024} kb/s");
                    Console.WriteLine($"網絡下載速度:{tmp.Received / 1024} kb/s");
                    Thread.Sleep(500);
                }

(int Received, int Send) GetInternetSpeed(int Milliseconds) 方法可以監控某個的網絡傳輸數據量,時間一般時間設置為 1000 ms。

Received 是下載的流量
Send     是上傳的流量

一般來說,電腦只有一個網卡在連接互聯網進行工作,所以可以使用:

static (int Received, int send) GetNowInternetSpeed(int Milliseconds)

會自動找到電腦正在用來訪問互聯網的網卡,並記錄流量大小。

還有個 Speed 屬性,可以查詢到網卡最大支持速率。

如果是-1,則說明無法獲取此網卡的鏈接速度;例如 270_000_000 表示是 270MB(一般指 300M 網卡) 的鏈接速度。千兆網卡是 1000_000_000(1000M)。

其它 API 就不介紹了。

直接反射查看:

NetworkInterface System.Net.NetworkInformation.SystemNetworkInterface
Id {43538D18-BB0E-4CE2-8F66-613FAC9467BD}
Mac E09D3116D014
Name WLAN
Trademark Intel(R) Centrino(R) Advanced-N 6205
PhysicalMac E09D3116D014
Status Up
NetworkType Wireless80211
Statistics System.Net.NetworkInformation.SystemIPInterfaceStatistics
Ipv4Statistics System.Net.NetworkInformation.SystemIPv4InterfaceStatistics
ReceivedLength 103449771
ReceivedLengthIpv4 103449771
SendLength 23753785
SendLengthIpv4 23753785
IsAvailable True
Speed 300000000
IsSupportIpv4 True
IsSupportIpv6 True
DnsSuffix
DNSAddresses System.Net.NetworkInformation.InternalIPAddressCollection
UnicastIPAddressInformationCollection System.Net.NetworkInformation.UnicastIPAddressInformationCollection
AddressIpv6 fe90::adbb:6aa1:2b1f:ae9b%11
AddressIpv4 192.168.3.3
GetPhysicalMac E69D3116D514

注意,因為有些 API ,Linux 下環境差異比較大,建議使用使用 csys 小工具的 test 命令,檢查有哪些 API 可以在此 Linux 環境中使用。

DiskInfo

DiskInfo 能夠獲取的信息不多。

可以使用靜態方法獲取所有磁盤的 DiskInfo 對象:

DiskInfo.GetDisks()

直接反射看:

DriveInfo F:\
Id F:\
Name F:\
DriveType Fixed
FileSystem NTFS
FreeSpace 76498378752
TotalSize 112718770176
UsedSize 36220391424

Linux

Nuget 搜索 CZGL.SystemInfo.Linux 安裝。

在這個庫中,Linux 資源信息包括 進程計量,內存計量,CPU計量,虛擬內存計量,各種進程運行信息計量。

要通過實例化 DynamicInfo 才能獲取。

有 5 個對象用於映射相應信息。

Tasks:用於統計進程數量,處於不同狀態下的進程數。

CpuState:CPU 使用情況,CPU 各種負載信息。

Mem:物理內存和緩存使用情況。

Swap:虛擬內存使用情況。

PidInfo:一個進程的運行資源信息。

他們都有一個 IsSuccess 屬性,用來判斷是否能正常獲取到 Linux 的信息。

實例化獲取對象

            DynamicInfo info = new DynamicInfo();

直接使用

可以通過方法獲取到相應的對象。

            var item = info.GetTasks();
            Console.WriteLine("系統中共有進程數    :" + item.Total);
            Console.WriteLine("正在運行的進程數    :" + item.Running);
            Console.WriteLine("  進程Id  進程名稱  所屬用戶    優化級  高低優先級  虛擬內存   物理內存   共享內存 進程狀態  占用系統CPU(%)   占用內存(%d) ");

輸出

進程統計:

Total    :    93
Running    :    1
Sleeping    :    59
Stopped    :    0
Zombie    :    0


CPU資源統計:

UserSpace    :    1
Sysctl    :    0.6
NI    :    0
Idolt    :    98.3
WaitIO    :    0.1
HardwareIRQ    :    0
SoftwareInterrupts    :    0


內存統計:

Total    :    1009048
Used    :    334040
Free    :    85408
Buffers    :    589600
CanUsed    :    675008


獲取虛擬內存統計:

Total    :    0
Used    :    0
Free    :    0
AvailMem    :    505744


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM