欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.NET?Core跨平臺資源監(jiān)控工具CZGL.SystemInfo用法

 更新時間:2022年02月24日 09:25:41   作者:癡者工良  
這篇文章介紹了.NET?Core跨平臺資源監(jiān)控工具CZGL.SystemInfo的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

簡介

CZGL.SystemInfo 是一個支持 Windows 和 Linux 等平臺的能夠獲取機器硬件信息、采集機器資源信息、監(jiān)控進(jìn)程資源的庫。

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

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

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

舊版本使用教程: http://www.dbjr.com.cn/article/235627.htm

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

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

CZGL.SystemInfo.Linux 優(yōu)化部分代碼,其余無變化。

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

平臺差異而且很難統(tǒng)一,所以如獲取某些硬件的型號序列化,獲得進(jìn)程信息的資源信息,這些需求調(diào)用系統(tǒng)相關(guān)的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 下,安裝,還需要設(shè)置環(huán)境變量:

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

安裝完畢后,輸入命令進(jìn)入小工具:

csys
請輸入命令
+-------命令參考------------------------------+
| 1. 輸入 netinfo 查看網(wǎng)絡(luò)詳情                  |
| 2. 輸入 nett 監(jiān)控網(wǎng)絡(luò)流量                     |
| 3. 輸入 test ,檢查當(dāng)前操作系統(tǒng)不兼容哪些 API    |
| 4. 輸入 ps 查看進(jìn)程信息                       |
+---------------------------------------------+

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

動圖:

csys

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

CZGL.SystemInfo

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

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

Install-Package CZGL.SystemInfo -Version 1.0.1

SystemPlatformInfo

靜態(tài)類,能夠獲取運行環(huán)境信息和有限的硬件信息,所有信息在程序啟動前就已經(jīng)確定。

其 API 說明及獲得的數(shù)據(jù)示例如下:

屬性說明Windows 示例Linux 示例
FrameworkDescription框架平臺(.NET Core、Mono等)信息.NET Core 3.1.9.NET Core 3.1.9
FrameworkVersion運行時信息版本3.1.93.1.9
OSArchitecture操作系統(tǒng)平臺架構(gòu)X64X64
OSPlatformID獲取操作系統(tǒng)的類型Win32NTUnix
OSVersion操作系統(tǒng)內(nèi)核版本Microsoft Windows NT 6.2.9200.0Unix 4.4.0.19041
OSDescription操作系統(tǒng)的版本描述Microsoft Windows 10.0.19041Linux 4.4.0-19041-Microsoft #488-Microsoft Mon Sep 01 13:43:00 PST 2020
ProcessArchitecture本進(jìn)程的架構(gòu)X64X64
ProcessorCount當(dāng)前計算機上的處理器數(shù)88
MachineName計算機名稱dell-PCdell-PC
UserName當(dāng)前登錄到此系統(tǒng)的用戶名稱delldell
UserDomainName用戶網(wǎng)絡(luò)域名稱dell-PCdell-PC
IsUserInteractive是否在交互模式中運行TrueTrue
GetLogicalDrives系統(tǒng)的磁盤和分區(qū)列表D:, E:, F:, G:, H:, J:, X:|/, /dev, /sys, /proc, /dev/pts, /run, /run/lock, /run/shm 
SystemDirectory系統(tǒng)根目錄完全路徑X:\WINDOWS\system32 
MemoryPageSize操作系統(tǒng)內(nèi)存頁一頁的字節(jié)數(shù)40964096

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

效果演示:

系統(tǒng)平臺信息:

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

ProcessInfo

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

記錄某一時刻操作系統(tǒng)的資源數(shù)據(jù)。此 API 使用時有些地方需要注意,比較監(jiān)控和刷新信息會消耗一些性能資源。

通過兩個靜態(tài)方法,可以獲取系統(tǒng)的進(jìn)程列表:

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

或者通過指定的進(jìn)程 ID 獲取:

ProcessInfo value = ProcessInfo.GetProcess(666);

獲得 ProcessInfo 對象后,必須使用 Refresh() 方法刷新、截取當(dāng)前進(jìn)程狀態(tài)的信息,才能獲得信息。

如:

ProcessInfo thisProcess = ProcessInfo.GetCurrentProcess();	// 獲取當(dāng)前進(jìn)程的 ProcessInfo 對象
thisProcess.Refresh();

只有當(dāng)你使用 .Refresh() 時,才會開始初始化,并生成相應(yīng)的信息。

獲得的信息不是動態(tài)的,而且保存某一個節(jié)點時刻的進(jìn)程狀態(tài)數(shù)據(jù),所以如果需要動態(tài)更新,則需要再次執(zhí)行 .Refresh() 方法。

ProcessInfo 能夠獲得進(jìn)程使用了多少內(nèi)存以及 CPU 時間,但是無法獲得此進(jìn)程的物理內(nèi)存使用率以及CPU使用率。如果想獲得使用比率,需要調(diào)用操作系統(tǒng) API,或者使用操作系統(tǒng)的其它庫,如 Windows 的 WMI。

如果你想獲得一個進(jìn)程的 CPU 消耗的比例,可以使用靜態(tài)方法:

decimal value = ProcessInfo.GetCpuPercentage(666);

大約 2 秒會刷新一次,所以請勿一直等待此 API 返回數(shù)據(jù),適合單獨計算,不適合跟其它數(shù)據(jù)綜合。此 API 監(jiān)控的 CPU 占比不是很準(zhǔn)確。

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

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

不斷刷新 CPU 數(shù)據(jù):

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

內(nèi)存監(jiān)控

PhysicalUsedMemory 屬性值返回的值表示進(jìn)程使用的可分頁系統(tǒng)內(nèi)存的當(dāng)前大?。ㄒ宰止?jié)為單位)。 系統(tǒng)內(nèi)存是操作系統(tǒng)使用的物理內(nèi)存,分為分頁和非分頁的池。 當(dāng)不可分頁內(nèi)存未使用時,可以將其傳輸?shù)酱疟P上的虛擬內(nèi)存分頁文件中。

屬性名稱說明示例
PhysicalUsedMemory已用的物理內(nèi)存字節(jié)數(shù)17498112

NetworkInfo

NetworkInfo 能夠獲取網(wǎng)絡(luò)接口信息。

NetworkInfo.GetNetworkInfo() 可以獲取當(dāng)前你的電腦正在連接互聯(lián)網(wǎng)的首選網(wǎng)絡(luò)設(shè)備。

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

API 使用示例:

            var info = NetworkInfo.GetNetworkInfo();
            Console.WriteLine("\r\n+++++++++++");
            Console.WriteLine($"    網(wǎng)卡名稱    {info.Name}");
            Console.WriteLine($"    網(wǎng)絡(luò)鏈接速度 {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($"    上行流量統(tǒng)計 {info.SendLength / 1024 / 1024} MB");
            Console.WriteLine($"    下行流量統(tǒng)計 {info.ReceivedLength / 1024 / 1024} MB");
            Console.WriteLine($"    網(wǎng)絡(luò)類型     {info.NetworkType}");
            Console.WriteLine($"    網(wǎng)卡MAC     {info.Mac}");
            Console.WriteLine($"    網(wǎng)卡信息     {info.Trademark}");

Status 屬性可以獲取此網(wǎng)卡的狀態(tài),其枚舉說明如下:

Dormant5網(wǎng)絡(luò)接口不處于傳輸數(shù)據(jù)包的狀態(tài);它正等待外部事件。
Down2網(wǎng)絡(luò)接口無法傳輸數(shù)據(jù)包。
LowerLayerDown7網(wǎng)絡(luò)接口無法傳輸數(shù)據(jù)包,因為它運行在一個或多個其他接口之上,而這些“低層”接口中至少有一個已關(guān)閉。
NotPresent6由于缺少組件(通常為硬件組件),網(wǎng)絡(luò)接口無法傳輸數(shù)據(jù)包。
Testing3網(wǎng)絡(luò)接口正在運行測試。
Unknown4網(wǎng)絡(luò)接口的狀態(tài)未知。
Up1網(wǎng)絡(luò)接口已運行,可以傳輸數(shù)據(jù)包。

NetworkType 可以獲得網(wǎng)卡接口類型,其枚舉比較多,詳細(xì)請參考:

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

通常,監(jiān)控網(wǎng)絡(luò),一時檢查網(wǎng)絡(luò)是否暢通,二是監(jiān)控流量。

NetworkInfo.IsAvailable 靜態(tài)屬性可以檢查當(dāng)前機器是否能夠連接互聯(lián)網(wǎng)。符合條件的網(wǎng)卡必須是能夠運行可以傳輸數(shù)據(jù)包,并且不能是本地回環(huán)地址。如果你是內(nèi)網(wǎng),則可能不需要此API,可以自己 ping 內(nèi)網(wǎng)其它機器,確保網(wǎng)絡(luò)暢通。

實時監(jiān)控網(wǎng)絡(luò)速度的使用方法:

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

(int Received, int Send) GetInternetSpeed(int Milliseconds) 方法可以監(jiān)控某個的網(wǎng)絡(luò)傳輸數(shù)據(jù)量,時間一般時間設(shè)置為 1000 ms。

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

一般來說,電腦只有一個網(wǎng)卡在連接互聯(lián)網(wǎng)進(jìn)行工作,所以可以使用:

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

會自動找到電腦正在用來訪問互聯(lián)網(wǎng)的網(wǎng)卡,并記錄流量大小。

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

如果是-1,則說明無法獲取此網(wǎng)卡的鏈接速度;例如 270_000_000 表示是 270MB(一般指 300M 網(wǎng)卡) 的鏈接速度。千兆網(wǎng)卡是 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 下環(huán)境差異比較大,建議使用使用 csys 小工具的 test 命令,檢查有哪些 API 可以在此 Linux 環(huán)境中使用。

DiskInfo

DiskInfo 能夠獲取的信息不多。

可以使用靜態(tài)方法獲取所有磁盤的 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 資源信息包括 進(jìn)程計量,內(nèi)存計量,CPU計量,虛擬內(nèi)存計量,各種進(jìn)程運行信息計量。

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

有 5 個對象用于映射相應(yīng)信息。

Tasks:用于統(tǒng)計進(jìn)程數(shù)量,處于不同狀態(tài)下的進(jìn)程數(shù)。

CpuState:CPU 使用情況,CPU 各種負(fù)載信息。

Mem:物理內(nèi)存和緩存使用情況。

Swap:虛擬內(nèi)存使用情況。

PidInfo:一個進(jìn)程的運行資源信息。

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

實例化獲取對象

            DynamicInfo info = new DynamicInfo();

直接使用

可以通過方法獲取到相應(yīng)的對象。

            var item = info.GetTasks();
            Console.WriteLine("系統(tǒng)中共有進(jìn)程數(shù)    :" + item.Total);
            Console.WriteLine("正在運行的進(jìn)程數(shù)    :" + item.Running);
            Console.WriteLine("  進(jìn)程Id  進(jìn)程名稱  所屬用戶    優(yōu)化級  高低優(yōu)先級  虛擬內(nèi)存   物理內(nèi)存   共享內(nèi)存 進(jìn)程狀態(tài)  占用系統(tǒng)CPU(%)   占用內(nèi)存(%d) ");

輸出

進(jìn)程統(tǒng)計:

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


CPU資源統(tǒng)計:

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


內(nèi)存統(tǒng)計:

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


獲取虛擬內(nèi)存統(tǒng)計:

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

到此這篇關(guān)于.NET Core跨平臺資源監(jiān)控工具CZGL.SystemInfo用法的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論