Skip to content

usausa/mac-dotnet

Repository files navigation

macOS platform library for .NET

Library NuGet
MacDotNet.SystemInfo NuGet
MacDotNet.Disk NuGet

🖥️ MacDotNet.SystemInfo

System information api.

Output sample

CPU Usage:                   Total: 6.0 %  (E: 8.0 %  P: 4.6 %)
CPU Usage Breakdown:         User: 2.5 %  System: 3.4 %  Idle: 94.0 %
CPU Frequency All:           1849 MHz  (E: 1494 MHz  P: 2086 MHz)
Uptime:                      0.15:20:40
System:                      Processes: 712  Threads: 1400
Load Average:                1.24  1.37  1.39  (1/5/15 min)
Memory Usage:                57.5 %  (Active: 38.5 %  Wired: 11.6 %  Compressor: 7.4 %)
Swap Usage:                  0.0 %
GPU [AGXAcceleratorG14X]:    Device: 0 %  Renderer: 0 %  Tiler: 0 %
Disk disk0 (AppleFabric):    Read: 14.6 KB/s  Write: 0.0 KB/s
Disk disk6 (Usb):            Read: 0.0 KB/s  Write: 0.0 KB/s
FS / (apfs):                 48.1 %  (460 GB total)
FS /Volumes/Storage (apfs):  24.6 %  (931 GB total)
Net en0 (Ethernet):          DL: 1.0 KB/s  UL: 0.0 KB/s  Total RX: 294 MB  TX: 60 MB
Net en1 (Wi-Fi):             DL: 0.0 KB/s  UL: 0.0 KB/s  Total RX: 14 MB  TX: 7 MB
Temp CPU:                    41.02 C
Temp Mainboard:              30.03 C
Temp NAND:                   27.11 C
Temp SSD:                    33.05 C
Voltage DC-in:               12.560 V
Current DC-in:               0.617 A
Power DC-in:                 7.78 W
Power Total System:          7.74 W
Fan 0:                       1703 rpm  (34.1 %)  [min: 1700  max: 5000]
Power:                       CPU: 0.61 W  GPU: 0.00 W  ANE: 0.00 W  RAM: 0.09 W  PCI: 0.00 W

Usage

Hardware

var hw = PlatformProvider.GetHardware();

Console.WriteLine("[System]");
Console.WriteLine($"Model:             {hw.Model}");
Console.WriteLine($"Machine:           {hw.Machine}");
Console.WriteLine($"SerialNumber:      {hw.SerialNumber}");

Console.WriteLine("[CPU]");
Console.WriteLine($"CpuBrand:          {hw.CpuBrandString}");
Console.WriteLine($"PhysicalCpu:       {hw.PhysicalCpu} (max: {hw.PhysicalCpuMax})");
Console.WriteLine($"LogicalCpu:        {hw.LogicalCpu} (max: {hw.LogicalCpuMax})");
Console.WriteLine($"ActiveCpu:         {hw.ActiveCpu}");
Console.WriteLine($"CoreCount:         {hw.CpuCoreCount}");
Console.WriteLine($"ThreadCount:       {hw.CpuThreadCount}");
Console.WriteLine($"TimebaseFrequency: {hw.TimebaseFrequency} Hz");

Console.WriteLine("[Memory]");
Console.WriteLine($"MemorySize:        {hw.MemorySize / 1024 / 1024 / 1024} GB");
Console.WriteLine($"PageSize:          {hw.PageSize} bytes");

Console.WriteLine("[Cache]");
Console.WriteLine($"CacheLineSize:     {hw.CacheLineSize} bytes");
Console.WriteLine($"L1I:               {hw.L1ICacheSize / 1024} KB");
Console.WriteLine($"L1D:               {hw.L1DCacheSize / 1024} KB");
Console.WriteLine($"L2:                {hw.L2CacheSize / 1024} KB");

// P-core / E-core
if (hw.PerformanceCoreCount > 0)
{
    var pCore = hw.PerformanceCoreLevel;
    Console.WriteLine($"P-Core ({pCore.Name}): {pCore.PhysicalCpu} physical, {pCore.LogicalCpu} logical");
    var eCore = hw.EfficiencyCoreLevel;
    Console.WriteLine($"E-Core ({eCore.Name}): {eCore.PhysicalCpu} physical, {eCore.LogicalCpu} logical");
}

// GPU list
foreach (var gpu in hw.Gpus)
{
    Console.WriteLine($"GPU Model:   {gpu.Model}");
    Console.WriteLine($"GPU Cores:   {gpu.CoreCount}");
}

Kernel

var kernel = PlatformProvider.GetKernel();
Console.WriteLine($"OsType:              {kernel.OsType}");
Console.WriteLine($"OsRelease:           {kernel.OsRelease}");
Console.WriteLine($"OsVersion:           {kernel.OsVersion}");
Console.WriteLine($"OsProductVersion:    {kernel.OsProductVersion}");
Console.WriteLine($"KernelVersion:       {kernel.KernelVersion}");
Console.WriteLine($"Uuid:                {kernel.Uuid}");
Console.WriteLine($"MaxProcesses:        {kernel.MaxProcesses}");
Console.WriteLine($"MaxFiles:            {kernel.MaxFiles}");
Console.WriteLine($"BootTime:            {kernel.BootTime:yyyy-MM-dd HH:mm:ss zzz}");

Uptime

var uptime = PlatformProvider.GetUptime();
Console.WriteLine($"Uptime: {(int)uptime.Elapsed.TotalDays}d {uptime.Elapsed.Hours:D2}:{uptime.Elapsed.Minutes:D2}:{uptime.Elapsed.Seconds:D2}");

LoadAverage

var load = PlatformProvider.GetLoadAverage();
Console.WriteLine($"Average1:  {load.Average1:F2}");
Console.WriteLine($"Average5:  {load.Average5:F2}");
Console.WriteLine($"Average15: {load.Average15:F2}");

CPU Stat

var stat = PlatformProvider.GetCpuStat();
// Cores grouped by type
foreach (var core in stat.PerformanceCores)
{
    Console.WriteLine($"P-Core {core.Number}: User={core.User} System={core.System} Idle={core.Idle}");
}
foreach (var core in stat.EfficiencyCores)
{
    Console.WriteLine($"E-Core {core.Number}: User={core.User} System={core.System} Idle={core.Idle}");
}

CPU Frequency

var cpuFreq = PlatformProvider.GetCpuFrequency();
Console.WriteLine($"Max E-Core: {cpuFreq.MaxEfficiencyCoreFrequency} MHz");
Console.WriteLine($"Max P-Core: {cpuFreq.MaxPerformanceCoreFrequency} MHz");

foreach (var core in cpuFreq.EfficiencyCores)
{
    Console.WriteLine($"E-Core {core.Number}: {core.Frequency:F1} MHz");
}
foreach (var core in cpuFreq.PerformanceCores)
{
    Console.WriteLine($"P-Core {core.Number}: {core.Frequency:F1} MHz");
}

Memory

var mem = PlatformProvider.GetMemoryStat();
Console.WriteLine($"PhysicalMemory: {mem.PhysicalMemory / 1024 / 1024} MB");
Console.WriteLine($"Active:         {mem.ActiveCount} pages");
Console.WriteLine($"Inactive:       {mem.InactiveCount} pages");
Console.WriteLine($"Wired:          {mem.WireCount} pages");
Console.WriteLine($"Free:           {mem.FreeCount} pages");
Console.WriteLine($"PageIn:         {mem.PageIn}");
Console.WriteLine($"PageOut:        {mem.PageOut}");
Console.WriteLine($"SwapIn:         {mem.SwapIn}");
Console.WriteLine($"SwapOut:        {mem.SwapOut}");

Swap

var swap = PlatformProvider.GetSwapUsage();
Console.WriteLine($"Total:     {swap.TotalBytes / 1024 / 1024} MB");
Console.WriteLine($"Used:      {swap.UsedBytes / 1024 / 1024} MB");
Console.WriteLine($"Available: {swap.AvailableBytes / 1024 / 1024} MB");
Console.WriteLine($"Encrypted: {swap.IsEncrypted}");

Disk Stat

var diskStat = PlatformProvider.GetDiskStat();
foreach (var d in diskStat.Devices.Where(d => d.IsPhysical))
{
    Console.WriteLine($"[{d.Name}]  BusType: {d.BusType}  Size: {d.DiskSize / 1024 / 1024 / 1024} GB");
    Console.WriteLine($"  BytesRead:       {d.BytesRead}");
    Console.WriteLine($"  BytesWrite:      {d.BytesWrite}");
    Console.WriteLine($"  ReadsCompleted:  {d.ReadsCompleted}");
    Console.WriteLine($"  WritesCompleted: {d.WritesCompleted}");
    Console.WriteLine($"  ErrorsRead:      {d.ErrorsRead}");
    Console.WriteLine($"  ErrorsWrite:     {d.ErrorsWrite}");
}

File System

var fsStat = PlatformProvider.GetFileSystemStat();
foreach (var fs in fsStat.Entries)
{
    Console.WriteLine($"MountPoint:    {fs.MountPoint}");
    Console.WriteLine($"DeviceName:    {fs.DeviceName}");
    Console.WriteLine($"FileSystem:    {fs.FileSystem}");
    Console.WriteLine($"TotalSize:     {fs.TotalSize / 1024 / 1024 / 1024} GB");
    Console.WriteLine($"AvailableSize: {fs.AvailableSize / 1024 / 1024 / 1024} GB");
    Console.WriteLine($"TotalFiles:    {fs.TotalFiles}");
}

Network Stat

var network = PlatformProvider.GetNetworkStat();
foreach (var nif in network.Interfaces.Where(x => x.IsEnabled))
{
    Console.WriteLine($"[{nif.Name}] {nif.DisplayName} ({nif.InterfaceType})");
    Console.WriteLine($"  RxBytes:   {nif.RxBytes}");
    Console.WriteLine($"  RxPackets: {nif.RxPackets}");
    Console.WriteLine($"  RxErrors:  {nif.RxErrors}");
    Console.WriteLine($"  TxBytes:   {nif.TxBytes}");
    Console.WriteLine($"  TxPackets: {nif.TxPackets}");
    Console.WriteLine($"  TxErrors:  {nif.TxErrors}");
}

Process

var summary = PlatformProvider.GetProcessSummary();
Console.WriteLine($"ProcessCount: {summary.ProcessCount}");
Console.WriteLine($"ThreadCount:  {summary.ThreadCount}");

var processes = PlatformProvider.GetProcesses();
foreach (var p in processes.OrderBy(p => p.ProcessId))
{
    Console.WriteLine($"PID={p.ProcessId,-6} Name={p.Name,-20} Status={p.Status}");
    Console.WriteLine($"  Threads={p.ThreadCount}  RSS={p.ResidentMemorySize / 1024 / 1024} MB");
    Console.WriteLine($"  UserTime={p.UserTime.TotalSeconds:F2}s  SystemTime={p.SystemTime.TotalSeconds:F2}s");
}

var proc = PlatformProvider.GetProcess(Environment.ProcessId);
if (proc is not null)
{
    Console.WriteLine($"Self: {proc.Name} ({proc.Status})");
}

GPU Devices

var devices = PlatformProvider.GetGpuDevices();
foreach (var device in devices)
{
    Console.WriteLine($"[{device.Name}]");
    Console.WriteLine($"  DeviceUtilization:   {device.DeviceUtilization}%");
    Console.WriteLine($"  RendererUtilization: {device.RendererUtilization}%");
    Console.WriteLine($"  TilerUtilization:    {device.TilerUtilization}%");
    Console.WriteLine($"  AllocSystemMemory:   {device.AllocSystemMemory / 1024 / 1024} MB");
    Console.WriteLine($"  InUseSystemMemory:   {device.InUseSystemMemory / 1024 / 1024} MB");
    Console.WriteLine($"  Temperature:         {device.Temperature} C");
    Console.WriteLine($"  FanSpeed:            {device.FanSpeed}%");
    Console.WriteLine($"  CoreClock:           {device.CoreClock} MHz");
    Console.WriteLine($"  MemoryClock:         {device.MemoryClock} MHz");
    Console.WriteLine($"  PowerState:          {(device.PowerState ? "Active" : "Powered Off")}");
}

Power Consumption

var power = PlatformProvider.GetPowerStat();
if (!power.Supported)
{
    Console.WriteLine("Power reporting requires.");
    return;
}

// Measure wattage over 1 second
var prevCpu = power.Cpu;
var prevGpu = power.Gpu;
var prevAne = power.Ane;
var prevTotal = power.Total;

await Task.Delay(1000);
power.Update();

Console.WriteLine($"CPU: {power.Cpu - prevCpu:F2} W");
Console.WriteLine($"GPU: {power.Gpu - prevGpu:F2} W");
Console.WriteLine($"ANE: {power.Ane - prevAne:F2} W");
Console.WriteLine($"Total: {power.Total - prevTotal:F2} W");

SMC Sensors

var monitor = PlatformProvider.GetSmcMonitor();

// Temperature
foreach (var s in monitor.Temperatures)
{
    Console.WriteLine($"{s.Key} ({s.Description}): {s.Value:F1} C");
}
// Voltage
foreach (var s in monitor.Voltages)
{
    Console.WriteLine($"{s.Key} ({s.Description}): {s.Value:F3} V");
}
// Power
foreach (var s in monitor.Powers)
{
    Console.WriteLine($"{s.Key} ({s.Description}): {s.Value:F2} W");
}
// Current
foreach (var s in monitor.Currents)
{
    Console.WriteLine($"{s.Key} ({s.Description}): {s.Value:F3} A");
}
// Fan
foreach (var fan in monitor.Fans)
{
    Console.WriteLine($"Fan {fan.Index}: {fan.ActualRpm:F0} RPM (min={fan.MinRpm:F0}, max={fan.MaxRpm:F0})");
}

💽 MacDotNet.Disk

SMART infotmation.

Usage

(TODO)

🌐Link

About

MAC platform library for .NET

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages